#1 

14-02-2009 10:28:14

sharksfh
Membres
Date d'inscription:
Messages: 8
IP: 86.77.133.200
Courriel

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 smile!


Hors ligne


#2 

14-02-2009 10:39:43

tmyke
Administrateurs
Avatar de tmyke
Date d'inscription:
Messages: 1025
IP: 90.56.65.90
Courriel

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 ?


Force et sagesse...

Hors ligne


#3 

14-02-2009 11:05:09

sharksfh
Membres
Date d'inscription:
Messages: 8
IP: 86.77.133.200
Courriel

Ah oui c'est effectivement ça smile

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 smile


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.


Hors ligne


#4 

15-02-2009 19:57:18

yamashi
Membres
Date d'inscription:
Messages: 50
IP: 75.56.199.48
Courriel

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...


Hors ligne


#5 

16-02-2009 09:51:31

sharksfh
Membres
Date d'inscription:
Messages: 8
IP: 86.69.227.152
Courriel

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


#6 

16-02-2009 15:12:35

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.115.102.59
Courriel  Site web

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 .... tongue

Hors ligne


#7 

16-02-2009 16:08:40

sharksfh
Membres
Date d'inscription:
Messages: 8
IP: 86.69.227.152
Courriel

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! smile

Merci à tous! smile


Hors ligne


#8 

16-02-2009 17:48:11

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 78.115.102.59
Courriel  Site web

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 ... wink

Hors ligne


#9 

16-02-2009 20:44:14

sharksfh
Membres
Date d'inscription:
Messages: 8
IP: 86.69.227.152
Courriel

D'accord je vais tenté de faire comme tu m'as dis.

En tout cas merci beaucoup pour ton aide smile!

En attendant, bonne soirée à vous!

EDIT : Encore merci, je viens de changer le code, et ça marche très bien maintenant.


Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
140 invités en ligne
membre en ligne: -
RSS Feed