Home » Tutorials » Grafik und Spiele » Figuren in 3D-Welten einsetzen

Figuren in 3D-Welten einsetzen

Bühnenauftritt

Sämtliche Erweiterungen und Ergänzungen beziehen sich auf die (im letzten Tutorial vorgestellte) Datei G4dGame2.pas!
Und nun wollt Ihr wissen, wie man die Figur in der Hauptunit nicht nur zum Leben erweckt, sondern auch agieren lässt. Dazu benötigen wir einmal ein zusätzliches Element sowie eine neue Methode in TForm1:

Figur : TFigur;
procedure SetFigure;

Außerdem erweitern wir die Konstantenliste um den Dateinamen für die Figur (am besten direkt unter dem Namen der BSP-Datei):

const ACT_Datei = 'G4DFigur.act';

Die nächste Änderung betrifft die Methode TForm1.CreateGame. Dort müssen nun ganz am Schluss diese Zeilen stehen:

Figur := TFigur.Create (World, Pfad + ACT_Datei);
SetFigure;

Damit wird ein Figurobjekt erzeugt und „aufgebaut“. Das ist die Aufgabe dieser Methode (die irgendwo zwischen den anderen Methoden der Hauptunit sitzen kann):

procedure TForm1.SetFigure;
begin
  // Figur skalieren und ausrichten
  Figur.SetScale (1.5, 1.5, 1.5);
  // "Körpermaße" setzen
  Figur.SetRange (-50,0,-50, 50,150,50);
  // Geschwindigkeit festlegen, Bewegung einschalten
  Figur.SetMotion (3.0, 'Walk', true);
  // Figur.SetMotion (1.5, 'Idle', false);
  // y-Wert anpassen, Abstand zum Betrachter lassen
  Figur.SetPosition (ViewVector.x, ViewVector.y, ViewVector.z-300);
end;

Nach dem Skalieren, Ausrichten und „Ausmessen“ der Figur wird zunächst die Bewegung eingestellt:

Figur.SetMotion (3.0, 'Walk', true);

Zu beachten ist, dass sich sämtliche Werte von einer ACT-Datei zur anderen deutlich unterscheiden können. Experimentieren ist also angesagt! Wenn Ihr eine ACT-Datei aus dem Genesis-Paket oder aus dem Internet benutzen wollt, kann es sein, dass die Figur erst „aufgerichtet“ werden muss. Da hilft dann oft eine zusätzliche Zeile wie diese:

Figur.SetRotation (-Pi/2, 0.0, 0.0);

Zuletzt bekommt die Figur ihre Startposition, die in einiger Entfernung von Eurer eigenen liegen sollte:

Figur.SetPosition (ViewVector.x, ViewVector.y, ViewVector.z-300);

Zu sehen gibt es nur etwas, wenn auch die Methode TForm1.RunGame von der Figur in Kenntnis gesetzt wird. Diese Zeile könnte z.B. direkt vor dem Rendern der Welt selbst stehen:

Figur.Render (GetTickCount);
// ... geEngine_RenderWorld (Engine, World, Camera, 0.0) ...

Auch FreeGame bleibt nicht verschont. Denn die Figurdaten müssen am Schluss auch wieder freigegeben werden:

Figur.Free;

Damit hätten wir alles beisammen, um eine oder gar mehrere Figuren in unsere Welt zu setzen und dort frei herumlaufen zu lassen. Wir beobachten sie dabei wie durch eine Kamera, ohne dass sie von uns Notiz nehmen würden. Wie Ihr erleben werdet, seid Ihr regelrecht Luft für eine solche Figur, weil sie einfach durch Euch hindurchgehen kann. Ihr könnt der Figur natürlich hinterherlaufen oder ihr eine Weile zusehen. Wenn Euch das nicht mehr gefällt, lässt sich die Figur einfach (per Maustaste links) wegklicken – womit auch das Programm zu Ende wäre.
Der komplette Quelltext findet sich in der Datei G4dGame3.pas. Dass sich die Figur nicht nur (scheinbar) frei bewegt, sondern sogar Treppenstufen nehmen kann, wurmt einen vielleicht schon ein bisschen. Denn wir selbst als Spieler sind dazu ja noch nicht fähig. Das liegt an der „veralteten Kollisionstechnik“ in der Hauptunit.
Aber für Tüftler wie Euch dürfte es nicht allzu schwer sein, die erweiterte Methode Collision sowie CheckGravity aus der G4DFigur-Unit in die Hauptunit hinüber zu transportieren. (Aufgerufen wird CheckGravity dann am besten in der RunGame-Methode noch vor GetInput und GetMousePos.)