Spieleprogrammierung mit Delphi und GLScene: Das erste Objekt

Das erste Objekt Bearbeiten

Nun wollen Sie natürlich ausprobieren, was Sie soeben installiert haben. Suchen Sie im Register „GLScene“ nach einer Komponente mit dem Namen 'GLScene'. Gleich die erste ... Diese nichtvisuelle Komponente setzen Sie auf Ihr Formular. Außerdem brauchen Sie noch einen Scene-Viewer, damit Ihre Szene angezeigt wird. Das ist die zweite Komponente des GLScene-Reiters.

Doppelklicken Sie auf das GLScene-Objekt. Der GLScene-Editor öffnet sich! Klicken Sie mit der rechten Maustaste auf Cameras. Wählen Sie 'Add Camera'. Eine Neue Kamera wird erstellt. Klicken Sie nun mit der rechten Maustaste auf 'Scene objects' und wählen Sie 'Add object'. Wählen Sie 'Basic geometry' und klicken Sie auf 'Cube'. Sie können natürlich genauso 'Sphere' oder irgendetwas anderes wählen. Oder, wenn Sie gerne eine Teekanne haben möchten (eine Utah-Teekanne), wählen Sie nicht 'Basic Geometry' sondern 'Dooded objects' und klicken Sie auf 'Teepot'. Klicken Sie erneut mit der rechten Maustaste auf 'Scene objects' und positionieren Sie eine 'Light source' (Lichtquelle). Die Eigenschaften Position.X der Lichtquelle, sowie Position.Y und Position.Z, setzen Sie auf 1.

Die Eigenschaft 'TargetObject' der Kamera setzen Sie auf GLCube1 oder GLTeepot1 (je nach dem, was Sie gemacht haben). Nun Setzen Sie noch die Eigenschaft 'Camera' des Scene-Viewers auf 'GLCamera1'.

Sie sehen nichts? Kein Wunder! Setzen Sie die Position.Z der Kamera auf 3. Jetzt sollten Sie einen schönen Blick auf Ihr Objekt haben.


Objekte Dynamisch erstellen Bearbeiten

Die zuvor genannte Methode eignet sich hervorragend für kleinere Spiele, soll jedoch das ganze Projekt etwas größer werden, wird man um das dynamische Erstellen von Objekten (also ein Objekt erstellen während das Programm/Spiel schon läuft) nicht herum kommen. Dies ist bei GLScene recht einfach, zuerst wird eine Variable vom Typen des Objektes benötigt. Also zum Beispiel bei einem Cube (engl. Würfel) TGLCube, Oder bei einer Plane (engl. Fläche) TGLPlane.

Also weisen wir zuerst in der Variablendekleration eine Variable zu:

Var
  ...
  MeinCube : TGLCube;
  ...


Dies allein reicht nun leider nicht, um den Cube anzeigen zu lassen. Er muss erst noch erstellt werden. Dies macht man mit dem Befehl:

Begin
  ...
  MeinCube := TGLCube.Create(GLScene1);
  ...
end;

Allein durch diesen Befehl ist der Würfel schon sichtbar. Der Parameter von Create gibt das Mutter-Objekt an, in den meisten Fällen handelt es sich um die Komponente GLScene, die im vorherigen Abschnitt erstellt wurde. Diese Vorgehensweise funktioniert bei nahezu allen GLScene-Objekten.

Jetzt ist dieser Würfel jedoch noch sehr standardisiert, da wir ihm noch keine Position, Material etc. zugewiesen haben. Dies lässt sich realisieren, indem man die Variable hernimmt, einen Punkt danach setzt, und die jeweilige Eigenschaft ändert. Das sieht dann in etwa so aus:

Begin
 ...
 MeinCube := TGLCube.Create(GLScene1);
 MeinCube.Position.SetPoint(2,1,0.2);
 ...
end;

Hiermit wurde die Position des Würfels in der 3D-Umgebung gesetzt.

Möchte man nun mehrere Eigenschaften des Objektes ändern, kann man diese auch mit with "verbinden":

Begin
 ...
 MeinCube := TGLCube.Create(GLScene1);
 with MeinCube do
 Begin
   Position.SetPoint(2,1,0.2);
   Rotation.SetPoint(0,0,0);
 end;
 ...
end;

Das mag im ersten Moment als mehr Tipparbeit erscheinen, wenn man jedoch ziemlich viele Eigenschaften auf einmal setzen möchte, ist das eine recht schöne Methode.


Ein Unterobjekt dynamisch erstellen

GLScene bietet die Möglichkeit nahezu jedem Objekt auch noch ein Unterobjekt zu zuordnen. Das Unterobjekt ist sozusagen "IN" dem Mutterobjekt. Realisiert wir das durch folgenden Befehl, der nach dem Erstellen (Create) aufgerufen wird:

Begin
 ...
 MeinCube := TGLCube.Create(GLScene1);
 DummyCube1.AddChild(MeinCube);
 with MeinCube do
 Begin
   Position.SetPoint(2,1,0.2);
   Rotation.SetPoint(0,0,0);
 end;
 ...
end;

Mehrere Objekte dynamisch erstellen Bearbeiten

Da manchmal beim Schreiben des Spieles noch nicht Feststeht, welche, und wieviele Objekte in der "Landschaft" erscheinen sollen, ist es manchmal sinnvoll ein array zu erstellen.

Dazu wird in der Typendeklaration ein array of GLScene-Objekt erstellt:

Type
 TCubes = array of TGLCube;

Nun wird nicht mehr die Variable vom Typ TGLCube, sondern von dem selbst erstellten Typ TCubes benötigt.

Var
  Cubes : TCubes;

Dann sähe das Erstellen eines Objektes in etwa so aus:

Begin
 ...
 SetLength(Cubes,2);
 Cubes[0] := TGLCube.Create(GLScene1);
 with Cubes[0] do
 Begin
   Position.SetPoint(2,1,0.2);
   Rotation.SetPoint(0,0,0);
 end;
 SetLength(Cubes,3);
 Cubes[1] := TGLCube.Create(GLScene1);
 with Cubes[1] do
 Begin
   Position.SetPoint(2,1,0.2);
   Rotation.SetPoint(0,0,0);
 end;
 ...
end;

SetLength wird benötigt, um dem Compiler die Größe des Arrays mitzuteilen, sonst bricht das Programm mit einem Zugriffsfehler ab.