Ich arbeite an einer OpenGL Shader Engine von www.MarekKnows.com und das Framework ist wie folgt eingerichtet: Eine Engine-Klasse, die Teil einer statischen Bibliothek mit anderen hilfreichen und wichtigen Klassen ist. Dann gibt es das Hauptstartprojekt, in dem sich die Spielklasse zusammen mit den Spieleigenschaften befindet. Diese Struktur dient dazu, den gesamten Engine-Code vom Spielcode zu trennen. Das Schöne an diesem Setup ist, dass es wiederverwendet werden kann, um eine Vielzahl von Spielen zu erstellen, indem es einfach von der Engine lib erbt. Es ist noch nicht vollständig, da jede Woche ein anderes Segment oder Klassenobjekt aufgenommen wird.
Diese Hierarchie basiert auf der Ordner- und VS-Filterstruktur:
Projekt - Static Lib Engine
Projekt starten - Spiel
- Spiel: Erbt von der Engine
- Eigenschaften: - Eigenschaften, die nur für das aktuelle Spiel gelten
Mit diesem Rahmen werde ich die Nachrichtenschleife für Sie demonstrieren
void Engine::start() {
while( true ) {
if ( PeekMessage( &m_msg, m_hWnd, 0, 0, PM_REMOVE ) ) {
if ( WM_QUIT == m_msg.message ) {
break;
} else {
TranslateMessage( &m_msg );
DispatchMessage( &m_msg );
}
} else {
processFrame();
}
}
}
Wenn Sie mehr von diesem Code sehen möchten, müssen Sie www.MarekKnows.com besuchen, um seine wunderbar gut strukturierten und klar erklärten Video-Tutorials für die Spieleentwicklung mit OpenGL zu erhalten. Aus Gründen des Kopierrechts werde ich nur kleine Ausschnitte als Vorschläge an andere weitergeben, die ihnen bei einem bestimmten Fallproblem helfen können. Ich kann dies nicht als meinen eigenen Quellcode beanspruchen, aber mit dem Befolgen seines Kursaufbaus wird alles persönlich von Hand geschrieben und persönlich getestet. Es wird nicht kopiert und eingefügt! Fast alles, was ich über Spieleprogrammierung gelernt habe, ist zusammen mit einigen anderen Quellen in Mareks Videos akkreditiert.
Ich kann versuchen, dies so gut wie möglich aus dem, was ich gelernt habe, und der Ausführung des Codes zu erklären. Irgendwo im Programm wird die Funktion Engine :: start () aufgerufen. Das erste, was passiert, ist, dass wir in eine Endlosschleife gehen; Innerhalb dieser while-Schleife prüfen wir, ob Nachrichten aus Windows gesehen wurden, und ob dies der Fall ist, prüfen wir, ob die WM_QUIT-Nachricht von einem anderen Ort aus gesetzt wurde. Wenn es gesetzt wurde, brechen wir aus der while-Schleife aus und kehren von dieser Funktion zurück. Die Anwendung wird den Speicher bereinigen, das Fenster zerstören und schließen. Andernfalls rufen wir dann TranslateMessage () & DispatchMessage () auf. Wenn PeekMessage () false zurückgibt, gehen wir in die else-Anweisung und rufen proccessFrame () auf.
Auf meinem Computer rendere ich mit diesem Framework grundlegende GUI-Objekte mit etwa 100 bis 120 Bildern pro Sekunde. Ich habe eine EVGA NVidia GeForce GTX 750Ti 2 GB mit Übertaktung und Kühlmittel mit zwei Lüftern unter Windows 7 64 Bit mit 8 GB RAM auf einem Intel Core 2 Quad Extreme 3.0 GHz.
Wir haben uns noch nicht mit umfangreichen Animationen, Physik, Partikelsystemen und Kollisionserkennungen befasst. Wir haben jedoch all das in einer seiner älteren Videoserien behandelt, in denen die ältere GameEngine auf OpenGL v1.0 basierte und alles auf der CPU erledigt wurde. Mit dieser Serie arbeiten wir jetzt an der Verwendung von Shadern und der GPU. Ich bin mir sicher, dass wir mit dieser Rahmenarbeit problemlos ein vollständiges 2D- oder 3D-Spiel auf einem ähnlichen System wie meinem mit vollen 40 - 60 FPS ausführen können.
Eine weitere gute Quelle zum Lernen ist www.GeometricTools.com und der Buchabschnitt . Vor ein paar Jahren habe ich ihr Buch gekauft: 3D Game Engine Design (2. Auflage) von David H. Eberly, Die Morgan Kaufmann-Serie für interaktive 3D-Technologie, und es ist eine großartige Lektüre. Ich hatte noch keine Gelegenheit, ihr neuestes Buch zu kaufen: GPGPU-Programmierung für Spiele und Wissenschaft von David H. Eberly, möchte es aber bald besitzen, da es mit der modernen Hardware- und Softwareentwicklung relevanter, aktueller und aktueller ist. Viel Glück!