Einfaches OpenGL/C++-Spiel mit white_dune erzeugen

Mit white_dune lassen sich in der Programmiersprache C++ geschriebene OpenGL-Programme erzeugen.
Hier wird ein einfaches Beispiel vorgestellt, dass nur wenige Zeilen Programmcode benötigt.
Im ersten Schritt wird ein Prototyp in X3D/javascript erstellt, das später mit C++ erweitert wird.

javascript/X3D Prototyp

Als Basis wird das in X3D verfügbare white_dune-Logo benutzt.
Dabei steht ein 3D-Modell eines Pinguins zur Verfügung, das auf einer Dünen-Landschaft mit einer Pyramide steht.

Für die Programmierung macht es aber keinen Unterschied, wenn man statt des Pinguins eine Box und statt der Dünen-Landschaft eine dünne und breite/lange Box benutzt.
Im ersten Schritt wird das Ziel (Pinguin oder Box) so animiert, so dass es sich entlang eines Pfades bewegt (Kurven-Animation).

Als nächstes wird ein Text-Knoten mit "Game over" eingefügt.

Als nächstes wird ein Switch-Noten einfügt und das Ziel in ihn verschoben.
Damit das Ziel sichtbar ist, muss Switch.whichChoice auf 0 gestellt werden.
Als nächstes wird ein Switch-Noten einfügt und der Text wird in ihn verschoben.

Als nächstes wird ein Script-Noten einfügt.
Dann wird Routes/IS -> Neu aufbauen benutzt. Dabei wird ein neues Fenster aufgeklappt, das die Pfad-Animation zeigt.

Als nächstes wird der Script-Noten angeklickt.
Dann wird eine SFVec3f-Eingangs-Funktion "transform_in" angelegt

Genauso wird eine SFVec3f-Eingangs-Funktion "proximity_in" angelegt

Dann wird eine SFInt32-Ausgangs-Varible "out_text" angelegt

Dann wird eine SFInt32-Ausgangs-Varible "out_tux" angelegt

Jetzt wird ein Proximity-Sensor-Knoten erzeugt und Routes/IS -> Zeige Knoten ganz oben bentzt.
Jetzt wird der Script-Knoten angeklick und Routes/IS -> Zeige Knoten ganz oben bentzt.
Danach verschiebt man die Knoten passend und verbindet ProxomitySensor.position_changed und Script.proximity_in
Danach verbindet man CurveAnimation1.position_changed und Script.translation_in

Danach verbindet man Script.out_text und Switch.set_whichChoice vom Switch des Textes.

Danach verbindet man Script.out_tux und Switch.set_whichChoice vom Switch des Ziels.

Jetzt wird der Script-Knoten angeklickt und eine SFVec3f-Daten-Variable transfrom_data angelegt.

Danach wird eine SFBool-Daten-Variable game_over angelegt.

Jetzt wird der Script-Knoten angeklickt und Edit -> URL edit benutzt.
Das folgende javascript-Programm muss eingefügt werden:
"ecmascript:

        function transform_in(value)
        {
           transform_data = value;
        }

        function proximity_in(value)
        {
           if (!(game_over) &&
               (Math.abs(transform_data.x - value.x) < 2) &&
               (Math.abs(transform_data.y - value.y) < 3) &&
               (Math.abs(transform_data.z - value.z) < 2)) {
               game_over = true;
               out_text = 0; // Text anzeigen
               out_tux = -1; // TUX ausblenden
               }
        }
"

Damit das X3D-Spiel angezeigt werden kann, muss der X3D-Broswer "FreeWRL" installiert werden und mit Optionen -> Vorschau Einstellungen für Datei -> Vorschau eingerichtet werden.

Jezt wird Datei -> Vorschau gedrückt und es muss mit der FreeWRL-Navigation dem Ziel nahe gekommen werden, so dass der "Text anzeigen/TUX ausblenden" Code erreicht wird.
Screenshots aus dem Spiel:
Vor dem Nahekommen ans Ziel:

Nach dem Nahekommen ans Ziel:


Erweiterung mit C++

Jetzt wird der Script-Knoten angeklickt und Edit -> URL edit benutzt.
Der Programm-Code wird um einen C++-Teil erweitert:

"ecmascript:

        function transform_in(value)
        {
           transform_data = value;
        }

        function proximity_in(value)
        {
           if (!(game_over) &&
               (Math.abs(transform_data.x - value.x) < 2) &&
               (Math.abs(transform_data.y - value.y) < 3) &&
               (Math.abs(transform_data.z - value.z) < 2)) {
               game_over = true;
               out_text = 0; // Text anzeigen
               out_tux = -1; // TUX ausblenden
               }
        }
"
"c++:

   X3dScript_Script1 *self = (X3dScript_Script1 *)node;
   self->transform_data[0] = self->transform_in[0];
   self->transform_data[1] = self->transform_in[1];
   self->transform_data[2] = self->transform_in[2];
   if (!(self->game_over) &&
       (fabsf(self->transform_data[0] - self->proximity_in[0]) < 2) &&
       (fabsf(self->transform_data[1] - self->proximity_in[1]) < 3) &&
       (fabsf(self->transform_data[2] - self->proximity_in[2]) < 2)) {
       self->game_over = true;
       self->out_text = 0; // Text anzeigen
       self->out_tux = -1; // TUX ausblenden
   }
"
Jetzt muss das C++-Export-Verzeichnis von white_dune ins HOME-Verzeichnis kopiert werden:
$ cp -r wdune-*/docs/export_example_c++/opengl_example/ $HOME

Jetzt muss die entstande X3D-Datei nach $HOME/opengl_example/robot.x3dv abgespeichert werden.
Wechseln sie in das Verzeichnis
  
$ cd $HOME/opengl_example/                              

Und bentzen Sie
  
$ make && ./render

um das Programm zu kompilieren und auszuführen.