Problem mit der Irrlicht engine!
-
Hallo! Momentan habe ich wieder angefangen mit der Irrlicht-Engine zu arbeiten, nachdem ich vorher schon (mit einem entsprechenden Wrapper) in einer anderen Programmiersprache damit gearbeitetet habe.
Leider gibts direkt schon schwierigkeiten.
Ich habe Beispielcode versucht zu kompilieren, welches zwar machbar ist, sich aber dann mit einem "ABC.exe funktioniert nicht mehr" verabschiedet.//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( EDT_DIRECT3D9, dimension2d<u32>(1024, 768), 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"Das Koordinatensystem"); //Den Videotreiber erstellen und Zeiger aus dem Device abholen IVideoDriver* driver = device->getVideoDriver(); //Ein Material deklarieren SMaterial mat; //Das Material nimmt kein Licht an //Während das Device aktiv ist ... while(device->run()) { //Szene beginnen driver->beginScene(true, true, SColor(3,150,203,255)); driver->setMaterial(mat); //Hier wird die Szene gezeichnet (Objekte, Meshes, 2D Bitmaps usw.) //Rote Linie (X-achse) driver->draw3DLine(vector3df(-0.5f, 0, 0), //Startvektor vector3df(0.5f, 0, 0), //Schlußvektor SColor(255,255,0,0)); //Farbwert //Grüne Linie (Y-Achse) driver->draw3DLine(vector3df(0, -0.5f, 0), //Startvektor core::vector3df(0, 0.5f, 0), //Schlußvektor video::SColor(255,0,255,0)); //Farbwert //Blaue Linie (Z-Achse) driver->draw3DLine(core::vector3df(-0.25f, -0.25f, -0.5f), //Startvektor core::vector3df(0.25f, 0.25f, 0.5f), //Schlußvektor video::SColor(255,0,0,255)); //Farbwert //Szene beenden driver->endScene(); } //Das Device freigeben device->drop(); //Keinen Fehler zurückgeben return 0; }
Das ist der gesamte Code, sobald ich
driver->setMaterial(mat);
weg lasse, läuft das ganze zwar, aber das ist ja auch keine Lösung.
Ich hab schon überlegt dass es vllt an meiner Hardware / an meinem OS liegen kann, deshalb mal hier mein System:
Windows 7 Home Premium 64 Bit
4GB Ram
Intel i3-2120 @ 3,30 GhZ
Radeon HD7770Hoffe jemand kann mir helfen.
-
Zuerst einmal, was bring es dir, ein Material zu erstellen, bei dem du nichteinmal einstellungen änderst? kapier ich nicht..
könnte auch daran liegen, ist aber eher unwarscheinlich, ändere einfach mal ein paar sachen an dem material und teste noch einmalZweitens, versuch doch mal das material als pointer zu erstellen. hatte schon öffters fehler (hab zwar noch nie mit irrlicht gearbeitet aber bei anderen projekten), dass manche klassen nur als pointer richtig weiterverarbeitet werden konnten.
also:
SMaterial *mat;
-
Ein defaultkonstruiertes Material sollte kein Problem sein, siehe hier.
InsoNB, versuche herauszufinden, wo das Programm abstürzt. Ist die gelinkte Irrlicht.lib kompatibel zu deinem Compiler (d.h. mit der gleichen Konfiguration gebaut worden)?
gamer8o4 schrieb:
Zweitens, versuch doch mal das material als pointer zu erstellen.
Nein, tu das nicht. Damit handelst du dir nur manuelle Speicherverwaltung und die damit verbundenen Probleme ein.
gamer8o4 schrieb:
hatte schon öffters fehler [...], dass manche klassen nur als pointer richtig weiterverarbeitet werden konnten.
Wäre vielleicht eine gute Idee gewesen, dem auf den Grund zu gehen. Zeiger lösen nicht auf magische Weise Probleme
-
wo ihr hier grad bei pointern seid: irrlicht will ja ziemlich einfach und auch sicher sein. d.h. es soll der speicher von irrlicht verwaltet bzw freigegeben werden (angeblich)
aber sehe ich das richtig, dass irrlicht an jeder stelle rohe pointer hin und her schiebt?
und was bringt das drop und grab?
genau das müsste doch eigentlich den pointer releasen bzw den referenz counter erhöhen
-
Skym0sh0 schrieb:
aber sehe ich das richtig, dass irrlicht an jeder stelle rohe pointer hin und her schiebt?
Ja, aber rohe Pointer != manuelle Speicherverwaltung. Die meisten Zeiger gehören den Irrlicht-Klassen.
Skym0sh0 schrieb:
wo ihr hier grad bei pointern seid: irrlicht will ja ziemlich einfach und auch sicher sein. d.h. es soll der speicher von irrlicht verwaltet bzw freigegeben werden (angeblich)
Nein, man muss teilweise manuelles Reference-Counting verwenden.
grab()
erhöht den Counter,drop()
erniedrigt ihn.