#0 

14-02-2009 11:28:14

sharksfh
Petit nouveau
Date d'inscription: 13-02-2009
Messages: 8

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

Code:

#include <irr/irrlicht.h>




#include "game.h"



int main()
{
    game game;
    game.init();
    return 0;
}

game.h

Code:

#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

Code:

#include "game.h"


game::game()
{


}


game::~game()
{


}


void game::init()
{
    ge->init();
    ge->rendu();

}

graphicEngine.h

Code:

#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

Code:

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

Dernière modification par sharksfh (14-02-2009 11:31:02)

Hors ligne


#1 

14-02-2009 11:39:43

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

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:

Code:

void game::init()
{
    ge->init();
    ge->rendu();

}

me trompe-je ?


Force et sagesse...

Hors ligne


#2 

14-02-2009 12:05:09

sharksfh
Petit nouveau
Date d'inscription: 13-02-2009
Messages: 8

Ah oui c'est effectivement ça smile

j'avais oublié de faire le :

Code:

ge = new graphicEngine();

bon du coup faut pas que j'oublie de le désalouer après :

Code:

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

Code:

#include <irr/irrlicht.h>
#include "game.h"


int main()
{
    game game;
    game.init();
    return 0;
}

game.h

Code:

#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

Code:

#include "game.h"


game::game()
{
    
}


game::~game()
{
    delete ge;
}


void game::init()
{
    ge = new graphicEngine();
    ge->init();
    ge->rendu();

}

graphicEngine.h

Code:

#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

Code:

#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

Code:

#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

Code:

#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


#3 

15-02-2009 20:57:18

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

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


#4 

16-02-2009 10:51:31

sharksfh
Petit nouveau
Date d'inscription: 13-02-2009
Messages: 8

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


#5 

16-02-2009 16:12:35

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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


#6 

16-02-2009 17:08:40

sharksfh
Petit nouveau
Date d'inscription: 13-02-2009
Messages: 8

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


#7 

16-02-2009 18:48:11

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
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


#8 

16-02-2009 21:44:14

sharksfh
Petit nouveau
Date d'inscription: 13-02-2009
Messages: 8

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.

Dernière modification par sharksfh (17-02-2009 00:22:42)

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
80 invités en ligne
Aucun membre connecté
RSS Feed