Home » Tutorials » Grafik und Spiele » Genesis3D und Delphi

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.