Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

19.09.2014, 21:07

ELF Grafik Engine

Hallo Freunde der Spielentwicklung,

Ich arbeite derzeit an einer C++ Grafik Engine. Diese Arbeitet mit OpenGL und der Core, also das Kern Element ist bereits zu 100% Einsatz bereit. Derzeit stehen Arbeiten an dem Toolkit bevor. Dieses bietet viele Funktionen, wie etwa einen Geometrie Namespace oder dem 2D Namespace und das Laden von 3D Modellen wie auch das Laden von Texture Daten. Hier habe ich einen Beispiel Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <Windows.h>
#include "ELF\Core.h"
#include "ElfToolkit\ColorQube.h"
#include "ElfToolkit\Triangle.h"

HWND hWnd;
ELF::Core::Core *c;



    LRESULT CALLBACK WndClb(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {

       if(message == WM_KEYDOWN && wParam == VK_ESCAPE)
       {
          PostQuitMessage(0);
          return 0;
       }
       else if(message == WM_KEYDOWN && wParam == VK_MBUTTON)
       {
           
       }

       return DefWindowProc(hWnd, message, wParam, lParam);
    }

    bool CreateFrame(HINSTANCE Instance)
    {
       WNDCLASS window = {0};
       window.hbrBackground = HBRUSH(GetStockObject(WHITE_BRUSH));
       window.hCursor = LoadCursor(NULL, IDC_ARROW);
       window.hIcon = LoadIcon(NULL, IDC_ARROW);
       window.hInstance = Instance;
       window.lpfnWndProc = WndClb;
       window.lpszClassName = L"Main Window";
       window.style = CS_HREDRAW | CS_VREDRAW | WS_MAXIMIZEBOX;
       RegisterClass(&window);
       hWnd = CreateWindowEx(NULL, window.lpszClassName, L"Window Anwendung", WS_VISIBLE, 0,0,512,512, NULL, NULL, Instance, NULL);
       if(hWnd == NULL)
       {
          return false;
       }
       else
       {
          c = new ELF::Core::Core(hWnd);
          return true;
       }
    }

    bool Run(){

       MSG msg = {0};
       while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
       {
          if(msg.message == WM_QUIT)
          {
             return false;
          }
          DispatchMessage(&msg);
          TranslateMessage(&msg);
       }

       return true;
    }

    void InitialScene()
    {
        ELF::Render::MaterialData *data1 = new ELF::Render::MaterialData(0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f);
        ELF::Render::MaterialData *data2 = new ELF::Render::MaterialData(-1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f);
        ELF::Render::MaterialData *data3 = new ELF::Render::MaterialData(1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f);
        ELF::Render::Material *material = new ELF::Render::Material(new ELF::Render::Color(0.2f, 0.5f, 0.7f));
        material->SetTexture2D(NULL);
        material->AddMaterialData(data1);
        material->AddMaterialData(data2);
        material->AddMaterialData(data3);

        ELF::Core::ElfElement *element = new ELF::Core::ElfElement("Element", new ELF::Math::Matrix3(0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f));
        element->AddMaterial(material);
        
        ELFToolkit::Geometry::ColorQube *Qube = new ELFToolkit::Geometry::ColorQube(new ELF::Render::Color(0.5f, 0.5f, 0.5f), new ELF::Math::Vector3(0.0f, 0.0f, 0.0f), new ELF::Math::Size3(0.2f, 0.2f, 0.2f));
        ELFToolkit::Geometry::Triangle *Triangle = new ELFToolkit::Geometry::Triangle(new ELF::Render::Color(0.3f, 0.3f, 0.3f), new ELF::Math::Vector3(0.0f, 0.0f, 0.0f), new ELF::Math::Size2(0.1f, 0.1f)); 

        ELF::Core::ElfScene *scene = new ELF::Core::ElfScene("Scene1");
        scene->AddElement(Triangle->GetElement());

        c->AddScene(scene);
        c->ChangeScene(0);
    }

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
       if(!CreateFrame(hInstance))
       {
            return 0;
       }

        InitialScene();  
        c->InitialScene();
        
       while(Run())
       {
          c->RenderScene();
       }

       return 0;
    }


Ich Plane auch noch heute oder Morgen die Engine auf IndieDB vorzustellen. Ich habe mich gegen die Entwicklung einer Game Engine Entschieden, da ich das Physik Zeug nicht so drauf habe :whistling:

In diesem Sinne LG MrTee

2

19.09.2014, 21:18

Müssen denn einfache Objekte wie Farben unbeding mit new angelegt werden?

C-/C++-Quelltext

1
ELF::Render::Material(new ELF::Render::Color(0.2f, 0.5f, 0.7f)

Wer ruft denn delete auf?
PS: Willkommen im Forum :D

3

19.09.2014, 21:44

Danke sehr, nein die müssen nicht sein, bzw. ist die Funktion noch nicht vorhanden, aber bald. Danke Sehr :)

4

20.09.2014, 16:31

Update:

Heute habe ich endlich mehrere Schritte erledigt im Toolkit. Ich beginne mal mit den String Helferlein, die einen String Splitten. Ihr werdet euch nun sicherlich fragen "Was, was sucht eine solche Klasse in einer Grafik Engine ?". Ich habe mich dafür entschieden, da ich diese beim Laden der Texturen benötige. Ich habe bis jetzt nur ein Bild Format zum Test Hinzugefügt. Dies ist ein Eigenes im Plain Text Format.

FSA

Community-Fossil

  • Private Nachricht senden

5

20.09.2014, 17:44

Aber warum denn ein eigenes Texturformat? Klar bei Modellen schreibe ich auch lieber direkt die Daten in eine Datei, aber was hat das bei Texturen für einen Vorteil? Keiner wird lust haben, jede Textur umzuwandeln...
Und Strings splitten als Helferlein bezeichnen? Schon mal in den Konstruktor von std::string geguckt?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

6

20.09.2014, 17:56

Ich habe ein Converter Geschrieben. Wie gesagt, dass ist nur zu "Test" Zwecken, wird aber drinnen bleiben. Nein, habe mir die Funktionen von String noch nicht genau angeschaut. Aber werde ich nun machen. Danke :thumbsup:

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

20.09.2014, 18:00

Aber warum denn ein eigenes Texturformat? Klar bei Modellen schreibe ich auch lieber direkt die Daten in eine Datei, aber was hat das bei Texturen für einen Vorteil? Keiner wird lust haben, jede Textur umzuwandeln...
Und Strings splitten als Helferlein bezeichnen? Schon mal in den Konstruktor von std::string geguckt?

Hmm, wo steht das denn?

Aber strings zu splitten ist nun wirklich nicht das Übertool für eine Render Engine...
Ich habe einfach OpenGL einmal "objektirisiert" = in Klassen gepackt und somit OOP gemacht und gut war. Schreib lieber eine Game Engine, das ist umfangreicher/anspruchsvoller/spaßiger ;)

8

20.09.2014, 18:07

Ich werde evtl. Wenn ich die Grafik Engine zu 100% Stabil und Komplett Fertig habe, eine Physik Engine versuchen und danach könnte man die Game Engine Schreiben. Also aus beiden Zusammen :)

FSA

Community-Fossil

  • Private Nachricht senden

9

20.09.2014, 19:29

@DK:

Zitat von »http://www.cplusplus.com/reference/string/string/string/«

substring (3)
string (const string& str, size_t pos, size_t len = npos);

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

10

20.09.2014, 19:33

Ja, aber mit Substring kann man doch nicht Splitten Oder ?

Werbeanzeige