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