Irrlicht - from Noob to Pro: Beispielcode3

Aus Wikibooks
//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);

	//Unser Winkel für die Rotation des Würfels
	f32 fWinkel = 0;
	
	//Unsere Variablen für die Zeitmessung
	u32 uAktuelleZeit = 0;     //Zum Speichern der aktuellen Zeit
	u32 uZuletztGestoppt = 0;  //Die letzte gestoppte Zeit
	const u32 uSchrittAlleMs = 50; //Nach welcher Zeit(ms) soll die Szene gedreht werden ?

	//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"Einen Wuerfel darstellen mit Irrlicht !");
	
	//Den Videotreiber erstellen und Zeiger aus dem Device abholen
	IVideoDriver* driver = device->getVideoDriver();	
	
	//Ein Material deklarieren
	video::SMaterial material;

	//Das Material nimmt kein Licht an
	material.Lighting = false;

	//Das Material soll voll gezeichnet werden
	material.Wireframe = false;

	//Z-Positionen 
	const irr::f32 z_vorne  = -0.3f; //Vorderseite
	const irr::f32 z_hinten =  0.3f; //Rückseite
		
	//Definieren der Vertices
	video::S3DVertex vaVertices[8]; //Das Array vom Typ S3DVertex	    
	//Vorne
	vaVertices[0] = S3DVertex(-0.3f,-0.3f, z_vorne,0,0,0,SColor(255,255,0,0),0,0); //Punkt A
	vaVertices[1] = S3DVertex(-0.3f, 0.3f, z_vorne,0,0,0,SColor(255,0,255,0),0,0); //Punkt B
	vaVertices[2] = S3DVertex( 0.3f,-0.3f, z_vorne,0,0,0,SColor(255,0,0,255),0,0); //Punkt C
	vaVertices[3] = S3DVertex( 0.3f, 0.3f, z_vorne,0,0,0,SColor(255,0,0,255),0,0); //Punkt D
	//Hinten
	vaVertices[4] = S3DVertex(-0.3f,-0.3f, z_hinten,0,0,0,SColor(255,255,255,0),0,0); //Punkt E
	vaVertices[5] = S3DVertex(-0.3f, 0.3f, z_hinten,0,0,0,SColor(255,0,255,255),0,0); //Punkt F
	vaVertices[6] = S3DVertex( 0.3f,-0.3f, z_hinten,0,0,0,SColor(255,255,0,255),0,0); //Punkt G
	vaVertices[7] = S3DVertex( 0.3f, 0.3f, z_hinten,0,0,0,SColor(255,0,0,255),0,0); //Punkt H

	//Definieren der Indicies
	u16 uiIndicies[36] = {0, 1, 2, //A->B->C=Dreieck1 (Vorderseite)
		              2, 1, 3, //C->B->D=Dreieck2 (Vorderseite)
			      3, 6, 2, //D->G->C=Dreieck3 (Rechte Seite)
			      3, 7, 6, //D->H->G=Dreieck4 (Rechte Seite)		   
			      6, 7, 5, //G->H->F=Dreieck5 (Rückseite)
			      5, 4, 6, //F->E->G=Dreieck6 (Rückseite)
			      5, 1, 4, //F->B->E=Dreieck7 (Linke Seite)
			      4, 1, 0, //E->B->A=Dreieck8 (Linke Seite)
			      1, 5, 7, //B->F->H=Dreieck9 (Oberseite)
			      7, 3, 1, //H->D->B=Dreieck10 (Oberseite)
			      4, 0, 6, //E->A->G=Dreieck11 (Unterseite)
			      6, 0, 2};//G->A->C=Dreieck12 (Unterseite)			 

	//Während das Device aktiv ist ...
	while(device->run())
	{		
		//Szene beginnen
		driver->beginScene(true, true, SColor(3,150,203,255));
		
		//Aktuelle Zeit abholen
		uAktuelleZeit = device->getTimer()->getTime();

		//Gewünschte Zeit vergangen ?
		if (uAktuelleZeit >= (uZuletztGestoppt + uSchrittAlleMs))
		{
			uZuletztGestoppt = uAktuelleZeit; //Aktuelle Zeit stoppen

			//Den Winkel erhöhen
			fWinkel += 1.5f;
			//Nicht über 360 Grad drehen
			if (fWinkel > 360) fWinkel = 1;
		}
		
		//Material festlegen
		driver->setMaterial(material);		
		
		//Die komplette Szene über eine Matrix drehen
		core::matrix4 Matrix; //4x4 Matrix
		Matrix.makeIdentity(); //Initialisieren
		//Um die Y- u. Z-Achse drehen
		Matrix.setRotationDegrees(core::vector3df(0, fWinkel, fWinkel)); 

		//Übertragen der Matrix in die Weltmatrix
		driver->setTransform(video::ETS_WORLD, Matrix);

		//Zeichnen des Würfels
		driver->drawIndexedTriangleList(
			&vaVertices[0],		//Zeiger auf das erste Element im Vertices-Array
			8,					//Anzahl der Elemente im Vertices-Array
			&uiIndicies[0],		//Zeiger auf das erste Element in Indicies-Array
			12);				//Anzahl der zu zeichnenden Dreiecke		

		//Szene beenden
		driver->endScene();
	}
	//Das Device freigeben
	device->drop();
	
	//Keinen Fehler zurückgeben
	return 0;
}