Irrlicht - from Noob to Pro: "Hello World" mit Irrlicht


Voraussetzungen Bearbeiten

Hier wollen wir nun Irrlicht initialisieren und uns der Einfachheit halber nur eine leere Szene anzeigen lassen. Bitte bedenken Sie, dass der Quellcode hier nicht funktioniert, wenn Sie Irrlicht nicht richtig in C++ eingebunden haben. Falls Sie sich nicht sicher sind, dann lesen Sie sich die vorhergehende Seite C++ für Irrlicht einrichten durch.

Sie müssen auf jeden Fall

  • in den Projekteigenschaften (Alt + F7) -> "Konfigurationseigenschaften" -> "C/C++" -> "zusätzliche Includeverzeichnisse" den Pfad zur Header-Datei "Irrlicht.h" festgelegt haben
  • in den Projekteigenschaften (Alt + F7) -> "Konfigurationseigenschaften" -> "Linker" -> "zusätzliche Bibliotheksverzeichnisse" den Pfad zur Library-Datei "Irrlicht.lib" festgelegt haben
  • in den Projekteigenschaften (Alt + F7) -> "Konfigurationseigenschaften" -> "Linker" -> "Eingabe" -> "zusätzliche Abhängigkeiten" die Library-Datei "Irrlicht.lib" mit angegeben oder per entsprechenden Code mit eingebunden haben.

Wenn diese Punkte erfüllt sind, sind wir bereit zur ersten Irrlicht-Anwendung !

Verwenden von Irrlicht Bearbeiten

Einbinden der Header-Datei Bearbeiten

Öffnen Sie die Quellcodedatei "main.cpp" (oder je nachdem wie Sie sie benannt haben) durch einen Doppelklick im Projektmappen-Explorer. Nachdem sich diese Datei geöffnet hat (welche jetzt komplett leer sein müsste), binden wir mit folgendem Code die Header-Datei von Irrlicht ein :

#include <irrlicht.h>

Da der Pfad zum Header ja in den Projekteigenschaften angegeben worden ist, sollte der C++-Compiler keine Probleme haben, diese zu finden.

Einbinden der Library-Datei Bearbeiten

Falls Sie die Datei "Irrlicht.lib" nicht über die Projekteigenschaften eingebunden haben, so binden Sie sie jetzt über folgenden Code ein :

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

Damit weis der Linker, mit welcher Library-Datei er die Bibliotheksdatei "Irrlicht.dll" behandeln soll und wo der Einsprungspunkt im Code ist. Somit haben wir die Header-Datei "Irrlicht.h" sowie die Library-Datei "Irrlicht.lib" in unser Projekt eingebunden.

Festlegen des Namespaces Bearbeiten

Um uns viel Tipparbeit zu ersparen, verwenden wir den Namespace von Irrlicht.

using namespace irr;
using namespace core;
using namespace video;


Tipp:

 

Es gibt noch mehr Namespaces, aber um den Code einfach zu halten wurden nur die für dieses Beispiel benötigten mit eingebunden.

Erstellen der Hauptprozedur main() Bearbeiten

Definieren Sie nun die Hauptprozedur unseres Programms mit

int main()
{
	return 0;
}

Damit wird festgelegt, ab wo unser Programmcode ausgeführt wird uns welchen Rückgabewert er zurückgibt.Der Rückgabewert "0" bedeutet, dass kein Fehler aufgetreten ist.

Tipp:

 

Diese Hauptprozedur wurde absichtlich einfach gehalten. Normalerweise werden der Hauptprozedur Argumente übergeben, wobei das erste Element im Array char *argv[] immer der Pfad zum Programm gefolgt vom Namen der Exe-Datei ist. Normalerweise lautet die Hauptprozedur :

int main(int argc, char *argv[])

argc beeinhaltet die Anzahl der übergebenen Argumente und argv[] die/das Argument(e). argv[0] wäre also zum Beispiel "C:\Test\HelloWorld\Helloworld.exe.

Das Irrlicht-Device Bearbeiten

Zuerst müssen wir das Irrlicht-Device deklarieren und erstellen es dabei auch gleich mit Erstellungsparameter über die Funktion createDevice. Hierzu erstmal der Code :

IrrlichtDevice *device =
  createDevice( video::EDT_OPENGL, dimension2d<u32>(640, 480), 32, false, false, false, 0);

Die Parameter der Funktion von createDevice haben folgende Bedeutung : Der erste Parameter bestimmt, mit welchem System Irrlicht aktiviert werden soll.
Folgende Konstanten kommen hier in Betracht :

video::EDT_OPENGL Initialisiert Irrlicht mit OpenGL
video::EDT_DIRECT3D9 Initialisierung mit DirectX9 (nur Windows)
video::EDT_DIRECT3D8 Initialisierung mit DirectX8 (nur Windows)
video::EDT_BURNINGSVIDEO Initialisierung mit dem Burnings Software Renderer
video::EDT_SOFTWARE Initialisierung mit Irrlicht´s Software Renderer
video::EDT_NULL Es wird kein Video-Treiber verwendet.

Der zweite Parameter bestimmt die Größe unseres Fensters. Im Vollbildmodus bestimmt er die Auflösung der Anzeige.
Der dritte Parameter bestimmt, mit wieviel Bit Farbtiefe das Fenster angezeigt werden soll.Dies gilt nur für den Vollbildmodus, da im Fenstermodus die Farbtiefe des Desktops verwendet wird.
Der vierte Parameter bestimmt, ob das Programm im Vollbildmodus angezeigt werden soll.
Der fünfte Parameter bestimmt, ob der Stencil-Buffer verwendet werden soll. Dies ist z.B. bei der Anzeige von Schatten der Fall.
Der sechste Parameter bestimmt, ob die vertikale Synchronisation eingeschaltet werden soll.
Der siebte Parameter dient zur Übergabe einer Datenstruktur vom Typ IEventReceiver, womit man auf Ereignisse reagieren kann.

Tipp:

 

Ein Irrlicht-Device ist die wichtigste Klasse, welche uns Zugriff auf fast alle Funktionen der Irrlicht-Engine gewährt. Dazu gehören unter anderem :

  • hinzufügen und entfernen von Joysticks mit activateJoysticks (core::array< SJoystickInfo > &joystickInfo)
  • Kontrolle über das Interface für die Mauskontrolle mit getCursorControl ()
  • Verwenden von Ereignissen über getEventReceiver ()
  • Zugriff auf das virtuelle Dateisystem mit getFileSystem ()
  • Zugriff auf das 2D - Benutzerinface mit getGUIEnvironment ()
  • Speichern von Logs durch Zugriff auf den Logger mit getLogger ()
  • Zeitmessung durch Verwendung auf den Timer mit getTimer ()

Device erfolgreich erstellt ? Bearbeiten

Falls es ein Problem mit der Erstellung des Device gegeben hat, können wir das Programm nicht weiter ausführen. Wir überprüfen mit folgenden Code, ob das Device erstellt werden konnte :

if (!device)
   return 1;

Da wir nun ein Device erstellt haben, können wir den Fenstertext des Anzeigefensters einrichten. Hierzu der Code :

device->setWindowCaption(L"Hello World mit Irrlicht !");

Erstellen des Video-Treibers Bearbeiten

Nun wollen wir die Schnittstelle des Video-Treibers ansprechen. Während der Erstellung holen wir uns aus dem Device auch gleich den Zeiger zum Video-Treiber ab:

IVideoDriver* driver = device->getVideoDriver();

Mit dem Zugriff auf den Video-Treiber haben wir die Möglichkeit, die Szene zu manipulieren. Zu allererst müssen wir dann die Schleife deklarieren, welche uns die Szene immer wieder neu zeichnet.

Die Szene zeichnen Bearbeiten

Als erstes müssen wir prüfen, ob das Device aktiv ist und die Szene neu gezeichnet werden soll, welches innerhalb einer Schleife geschehen muss. Danach teilen wir dem Video-Treiber mit, mit welchen Einstellungen und welcher Hintergrundfarbe er die Szene beginnen soll. Nun müssen wir unsere Szene zeichnen und dem Video-Treiber sagen, dass er die Szene beenden soll. Hierzu der Beispielcode :

while(device->run())
	{		
		driver->beginScene(true, true, SColor(3,150,203,255));
		//Hier wird die Szene gezeichnet		
		driver->endScene();
	}

Zwischen driver->beginScene und driver->endScene müssten hier nun alle zu zeichnenden Objekte dargestellt werden.

Freigeben von Irrlicht Bearbeiten

Soll das Programm beendet werden oder wird das Hauptfenster geschlossen, so muss das Irrlicht-Device freigegeben werden. Dies geschieht durch

device->drop();

Der Quellcode von main.cpp Bearbeiten

Der Quellcode sollte nun in etwa wie folgt aussehen :

//Einbinden der Header-Datei von Irrlicht
#include <irrlicht.h>

//Einbinden der Namespaces
using namespace irr;
using namespace core;
using namespace video;
//Die Hauptprozedur main()
int main()
{
	//Unser Irrlicht-Device erstellen und initialisieren
	IrrlichtDevice *device =
		createDevice( video::EDT_OPENGL, dimension2d<u32>(640, 480), 32,
			false, false, false, 0);
	
	//Konnte das Device erstellt werden ?
	if (!device)
		return 1; //Falls nicht, Fehlercode zurückgeben und Programm abbrechen
	
	//Den Text des Hauptfensters festlegen
	device->setWindowCaption(L"Hello World mit Irrlicht !");
	
	//Den Videotreiber erstellen und Zeiger aus dem Device abholen
	IVideoDriver* driver = device->getVideoDriver();	
	
	//Während das Device aktiv ist ...
	while(device->run())
	{		
		//Szene beginnen
		driver->beginScene(true, true, SColor(3,150,203,255));
		
		//Hier wird die Szene gezeichnet (Objekte, Meshes, 2D Bitmaps usw.)
		
		//Szene beenden
		driver->endScene();
	}
	//Das Device freigeben
	device->drop();
	
	//Keinen Fehler zurückgeben
	return 0;
}

Das Ergebnis dieses Quellcodes sollte nun ein Fenster mit initialisiertem Irrlicht sein :