Genesis3D und Delphi
Run the Game
Kommen wir jetzt zu der Methode, die das Ganze sozusagen ins Rollen bringt:
procedure TForm1.RunGame; begin // Spielmodus auf "Laufen" einstellen isRunning := true; // Solange Spiel "läuft" while isRunning do begin // ggf. auf Ereignisse reagieren (z.B. Tastatur/Maus) Application.ProcessMessages; // Koordinaten und Winkel ausrichten geXForm3D_SetIdentity (@XForm); geXForm3D_RotateX (@XForm, 0.0); geXForm3D_RotateY (@XForm, 0.0); geXForm3D_RotateZ (@XForm, 0.0); geXForm3D_Translate (@XForm, 0.0, 0.0, 0.0); geCamera_SetWorldSpaceXForm (Camera, @XForm); // Rendering starten if geEngine_BeginFrame(Engine, Camera, GE_TRUE) <> OK then ExitError ('BeginFrame gescheitert!'); // Welt/Level rendern und darstellen if geEngine_RenderWorld (Engine, World, Camera, 0.0) <> OK then ExitError ('Rendering gescheitert!'); // Rendering beenden if geEngine_EndFrame(Engine) <> OK then ExitError ('EndFrame gescheitert!'); end; end;
Der Schalter isRunning sitzt auf true. Und solange das so bleibt, kann das Spiel laufen:
isRunning := true; while isRunning do begin // Spielverlauf end;
Schauen wir mal ins Innere der Game-Schleife. Als Erstes steht dort eine Methode, die mit der Darstellung selbst überhaupt nichts zu tun hat:
Application.ProcessMessages;
Damit wir aus dem Spiel wieder per Maus oder Taste aussteigen können, muss das Programm immer wieder (unmerklich kurz) unterbrochen werden, so dass Windows auf Ereignisse reagieren kann. Das ist unbedingt nötig, denn Delphi (bzw. der „Spieltisch“ Form1) hat diese Kontrolle ja nicht mehr. Wie wir die Schleife beenden können, klären wir später.
Damit sich unsere Welt je nach Betrachterposition drehen und verschieben kann, müssen wir entsprechende Werte setzen. Zuerst wird XForm wieder zur Einheitsmatrix:
geXForm3D_SetIdentity(@XForm);
Da wir uns die Welt zunächst einmal aus der Normallage anschauen wollen, gibt es auch keine Drehung oder Verschiebung. So werden hier alle Werte auf null gesetzt:
geXForm3D_RotateX (@XForm, 0.0); geXForm3D_RotateY (@XForm, 0.0); geXForm3D_RotateZ (@XForm, 0.0); geXForm3D_Translate (@XForm, 0.0, 0.0, 0.0);
Alle Weltdaten zusammen werden dann für die Kamera (= den Betrachter) umgesetzt:
geCamera_SetWorldSpaceXForm(Camera, @XForm);
Und jetzt starten wir endlich das Rendering. Darunter versteht man die grafische Darstellung unserer 3D-Welt auf einer 2D-Fläche (hier: dem Bildschirm):
geEngine_BeginFrame(Engine, Camera, GE_TRUE); geEngine_RenderWorld(Engine, World, Camera,0.0); geEngine_EndFrame(Engine);
Mit BeginFrame bzw. EndFrame wird bei der 3D-Engine die Kupplung losgelassen bzw. getreten: So bringen wir unser Spiel in Fahrt bzw. halten es wieder an. Dazwischen kümmert sich RenderWorld um die Darstellung der 3D-Welt durch die Augen der Kamera.