• Projektinhalt
  • Game Engines
  • Glossar
  • Tutorial
    1. Erste Schritte
    2. Treiber initialisieren
    3. Skybox & Skydome
    4. GUI Text
    5. Terrain
    6. Nebel
    7. Objekte einfügen
    8. Kamera
    9. Beleuchtung
    10. Kollisionsdetektion
    11. Hintergrundmusik
    12. Szene darstellen
    13. Gras
    14. Bäume

  • Download
  • Links

Szene darstellen

Nun ist es fast geschafft: die Szene ist vollständig und muss nur noch gezeichnet werden. Theoretisch. Es sollen aber noch die Frames-Per-Second in der Titelleiste angezeigt werden zusammen mit dem Titel des Projekts und dem verwendeten 3DTreiber. Ausserdem sollte noch verhindert werden, dass der Benutzer beim Herumspazieren in der Szene über den Rand des Terrains hinausläuft und Dank der Gravitation in die unendliche Tiefe stürzt.

Die Methode run startet den Irrlichttreiber.
Die folgende Zeile ist optional, sorgt aber dafür, dass keine Berechnungen durchgeführt werden, wenn das Fenster inaktiv ist. Es ist also eine gute Idee, diese Zeile einzufügen.

Die Methode beginScene muss aufgerufen werden, bevor das Rendering beginnen kann.

Die ersten beiden Parameter geben an, ob Back Buffer bzw. Depth Buffer geleert werden sollen; für den Fall dass das erste Argument wahr ist, kann als 3. Argument die Farbe angegeben werden.

Der Renderingprozess kann dann mit drawAll eingeleitet werden.

Die Bildschirmausgabe findet mit dem Aufruf von endScene statt. Diese Methode hat 2 optionale Parameter, die jedoch nicht für alle 3D-Treiber implementiert sind. Auch nicht für OpenGL, das für dieses Projekt verwendet wird. Insofern werden sie einfach ignoriert.

Den Frames-per-Second-Wert braucht man nicht selbst auszurechnen, da Irrlicht eine eingebaute Funktion dafür bietet. Damit kann der String für die Titelleiste zusammengebaut werden.

int lastFPS = -1;

while(irrDevice->run())

{
  • if (irrDevice->isWindowActive())

    {
    • irrDriver->beginScene(true, true, SColor(0,200,200,200));
    • irrSceneMgr->drawAll();
    • irrGUIEnv->drawAll();
    • irrDriver->endScene();
    • int fps = irrDriver->getFPS();

    • if (lastFPS != fps)
    • {
      • stringw str = L"SariHan [";
      • str += irrDriver->getName();
      • str += "] FPS:";
      • str += fps;

      • irrDevice->setWindowCaption(str.c_str());
      • lastFPS = fps;
    • }

Es ist kein Versehen, dass in obigem Code nicht alle Klammern geschlossen sind:
Wir müssen ja noch den Nutzer vor dem Fall in die Unterwelt bewahren. Das tun wir auf eine zugegebener Maßen möglicherweise etwas nervige Art:
Wenn sich die Kamera zu weit vom Tempel weg bewegt, wird sie einfach wieder an die Anfangsposition zurückgesetzt. Nicht die Methode der Wahl für die meisten Anwendungen, aber für diese hier ausreichend. Schließlich gibt es außer dem Tempel eh nicht viel zu sehen.

    • //reset camera to starting position when too far away

      vector3df sariPos = sariHan->getAbsolutePosition();

      vector3df camPos = camera->getAbsolutePosition();

      if ((camPos.X >= sariPos.X + 3000) || (camPos.Z >= sariPos.Z + 1000)
      • ||(camPos.X <= sariPos.X - 5000) || (camPos.Z <= sariPos.Z - 7000))
      {
      • camera->setPosition(terrainCenter + vector3df(900,45,1800));
      • camera->setTarget(terrainCenter + vector3df(0,100,1500));
      • camera->updateAbsolutePosition();
      }
    }
}

Zu Allerletzt müssen noch die übriggebliebenen Objekte "zerstört" werden. Dies gilt im Prinzip für alle Objekte, die mit einer Funktion erstellt wurden, die ein create in ihrem Namen tragen.

soundEngine->drop();

irrDevice->drop();


return(0);

}

Fertig. Das Programm kann kompiliert und ausgeführt werden.
Es sei denn, man möchte noch Gras und Bäumchen...



zurück weiter

Katarina Boland