Salut à tous!
Bon ça fait 2 jours que je trime sur une sorte d'essai d'architecture de jeu.. et maintenant que ça compile bien j'ai un problème lors de l'exécution du jeux... je vois absolument pas ou est le problème ...
voila les sources
main.cpp
#include <irr/irrlicht.h>
#include "game.h"
int main()
{
game game;
game.init();
return 0;
}
game.h
#pragma once #include <irr/irrlicht.h> #include <iostream> #include "graphicEngine.h" #pragma comment(lib, "Irrlicht.lib") using namespace irr; using namespace gui; using namespace core; using namespace video; using namespace scene; #ifndef DEF_GAME #define DEF_GAME class graphicEngine; class game { public : game(); ~game(); void init(); private : graphicEngine *ge; }; #endif
game.cpp
#include "game.h" game::game() { } game::~game() { } void game::init() { ge->init(); ge->rendu(); }
graphicEngine.h
#pragma once #ifndef DEF_GRAPHICENGINE #define DEF_GRAPHICENGINE #include <irr/irrlicht.h> #include <iostream> #include "game.h" using namespace std; using namespace irr; using namespace gui; using namespace core; using namespace video; using namespace scene; class graphicEngine { public : graphicEngine(); ~graphicEngine(); void init(); void rendu(); private : IrrlichtDevice *device; IVideoDriver *driver; ISceneManager *smgr; }; #endif
#include "graphicEngine.h" graphicEngine::graphicEngine() : device(0), driver(0), smgr(0) { } graphicEngine::~graphicEngine() { } void graphicEngine::init() { device = createDevice(EDT_DIRECT3D9, dimension2d<s32>(800,600), 32, false, true, false); //l'erreur se balade entre ICI driver = device->getVideoDriver(); smgr = device->getSceneManager(); } void graphicEngine::rendu() { while( device->run() ) { driver->beginScene(true, true, SColor(255, 128, 128, 128)); smgr->drawAll(); driver->endScene(); } //et LA device->drop(); }
Voila je ne sais pas qu'elle type d'erreur c'est, le programme compile bien, aucun problème.. mais après le programme arrive juste au DLL liée a ma carte graphique et il ne va pas plus loin, gros CRASH.. je vous propose donc de testé ce code, il ne demande pas d'autre bibliothèque que Irrlicht.
Voila merci d'avance pour votre aide !
Dernière modification par sharksfh (14-02-2009 11:31:02)
Hors ligne
Je viens de parcourir ton code, et il me semble qu'il n'y a aucune instanciation de ta classe graphicEngine *ge, ce qui conduit
immanquablement à un crash, surtout quand ton code arrive sur cette partie:
void game::init() { ge->init(); ge->rendu(); }
me trompe-je ?
Hors ligne
Ah oui c'est effectivement ça
j'avais oublié de faire le :
ge = new graphicEngine();
bon du coup faut pas que j'oublie de le désalouer après :
game::~game() { delete ge; }
Merci pour ton aide! Erreur du débutant
EDIT : Maintenant nouveau problème.. Bon soi j'ai un gros souci avec les classes... soit Visual C++ est contre moi...
Toujours un problème de classe.. ce que j'ai codé me semble pourtant correct :
main.cpp
#include <irr/irrlicht.h>
#include "game.h"
int main()
{
game game;
game.init();
return 0;
}
game.h
#pragma once #include <irr/irrlicht.h> #include <iostream> #include "graphicEngine.h" #pragma comment(lib, "Irrlicht.lib") using namespace irr; using namespace gui; using namespace core; using namespace video; using namespace scene; #ifndef DEF_GAME #define DEF_GAME class graphicEngine; class game { public : game(); ~game(); void init(); private : graphicEngine *ge; }; #endif
game.cpp
#include "game.h" game::game() { } game::~game() { delete ge; } void game::init() { ge = new graphicEngine(); ge->init(); ge->rendu(); }
graphicEngine.h
#pragma once #ifndef DEF_GRAPHICENGINE #define DEF_GRAPHICENGINE #include <irr/irrlicht.h> #include <iostream> #include "game.h" #include "SceneManager.h" using namespace std; using namespace irr; using namespace gui; using namespace core; using namespace video; using namespace scene; class SceneManager; class graphicEngine { public : graphicEngine(); ~graphicEngine(); void init(); void rendu(); void getDevice(IrrlichtDevice *cpyDevice); //qui sert a récupérer le device (peut etre l'erreur bien de la... je suis encore maladroit avec les // entrée/sortie entre les classes/fonction void getDriver(); private : IrrlichtDevice *device; IVideoDriver *driver; SceneManager *smgr; }; #endif
graphicEngine.cpp
#include "graphicEngine.h" graphicEngine::graphicEngine() : device(0), driver(0) { } graphicEngine::~graphicEngine() { delete smgr; } void graphicEngine::init() { device = createDevice(EDT_DIRECT3D9, dimension2d<s32>(800,600), 32, false, true, false); driver = device->getVideoDriver(); smgr = new SceneManager(); smgr->init(); } void graphicEngine::rendu() { while( device->run() ) { driver->beginScene(true, true, SColor(255, 128, 128, 128)); smgr->drawAll(); driver->endScene(); } device->drop(); } void graphicEngine::getDevice(IrrlichtDevice *cpyDevice) { cpyDevice = device; }
SceneManager.h
#pragma once #ifndef DEF_SCENEMANAGER #define DEF_SCENEMANAGER #include <irr/irrlicht.h> #include <iostream> #include "graphicEngine.h" using namespace std; using namespace irr; using namespace gui; using namespace core; using namespace video; using namespace scene; class graphicEngine; class SceneManager { public: SceneManager(); ~SceneManager(); void init(); void drawAll(); private: ISceneManager *smgr; graphicEngine *dev; IrrlichtDevice *copyDevice; }; #endif
SceneManager.cpp
#include "SceneManager.h" SceneManager::SceneManager() { dev = new graphicEngine(); dev->getDevice(copyDevice); } SceneManager::~SceneManager() { delete dev; } void SceneManager::init() { smgr = copyDevice->getSceneManager(); } void SceneManager::drawAll() { smgr->drawAll(); }
Alors enfaite j'voulais mettre le SceneManager à par pour pouvoir le traité à part.. Mais voilà.. ça compile bien mais ça crash encore... pourtant je pense avoir bien instancié tous les objets.
Dernière modification par sharksfh (14-02-2009 13:15:22)
Hors ligne
Je retire j'ai biglé...
Donne nous le output du debug ou alors fait nous un projet compilable parce que la tu balance du code sans qu'on puisse le tester et en regardant le code trouve l'erreur bien qu'on arrive a trouver certaines erreurs rapidement...
D'après ce que j'ai lu :
Tu crée un scene manager a parir du graphic engine, le scene manager créer un graphic engine qui va a son tour créer un scene manager...
Dernière modification par yamashi (15-02-2009 21:02:01)
Hors ligne
Oui j'avoue excusez moi :s
Voila le lien pour télécharger le fichier!
C'est tout en bas pour télécharger. On voit pas très bien le 'Click here'
Voilà.
Hors ligne
déjà il y a un truc dans ton code qui me chagrine beaucoup, tu ne passe nuls par le device entre les class, puis tu le récupère par la suite ...
donc en gros tu récupère un pointeur vide !
ou alors tu a définie un device en static qu'elle que par mais je ne les pas vue ....
Hors ligne
Ben enfaite j'aimerai récupérer le device de la classe graphicEngine dans la classe sceneManager.. Oui effectivement je pense qu'il y a un problème avec le pointeur. Mais justement je sais pas comment faire pour récupérer le Device. Alors j'voulais faire par pointeur mais s'il est vide le pointeur c'est sur ça va pas me servir a grand chose.. donc j'vois pas comment faire pour avoir réellement le pointeur sur le Device. :s
C'est vrai que j'ai de grosse l'accune sur tout se qui est passage de paramètre...
Si quelqu'un a une idée de comment faire. Je suis preneur!
Merci à tous!
Hors ligne
et bien tu peut crée ta fenêtre dans ta class la plus haut, puis dans le constructeur tu rajoute (IrrlichtDevice*device)
dans le cpp tu mais : (IrrlichtDevice*device) : leDeviceQuiEstDansLaClass(device) { ... ton code }
de se fait tu fait passé le pointeur de class en class
je te conseille également de faire un graphique de l'architecture de ton projet car, je sais pas se que tu veut faire mais cela est plutôt bizarre ...
Hors ligne
D'accord je vais tenté de faire comme tu m'as dis.
En tout cas merci beaucoup pour ton aide !
En attendant, bonne soirée à vous!
EDIT : Encore merci, je viens de changer le code, et ça marche très bien maintenant.
Dernière modification par sharksfh (17-02-2009 00:22:42)
Hors ligne