Pages: 1
- Accueil forums
- » Mesh
- » [Debutant]plantage de programme lors de la creation de mesh
01-04-2012 23:09:55
- Dante03
- Membres
- Date d'inscription:
- Messages: 5
- IP: 46.193.133.60
- Courriel
Bonsoir je suis débutant avec irrlicht et je tente de développer un simple jeu de plateau (jeu de go plus exactement) pour l'instant j'ai un mesh en forme de pierre de go que je peut balader sur le Goban (plateau du jeu de go),je voudrais lors d'un clic placer la pierre en question , problème la pierre ce place le programme cesse de fonctionner plante et puis demande a être fermer ,je vous poste mon code en espérant recevoir un peu d'aide ^^ ,aussi je n'aipas beaucoup d'idées de comment structurer mon programme pour gerer les évènement sur le code présenter j'utilise une Class imbriquer ,peut etre y'a t'il un meilleur moyen (je suis a l’écoute de toute proposition ^^).
l'erreur ce produit lors de l’appelle de la fonction addStone
Code c++ :
#include "C:\\Users\\Dante\\Desktop\\projet rogrammation s6\\jeuDeGo\\include\\Display.h"
#include <irrlicht.h>
Display::Display()
{
IrrlichtDevice* device = createDevice(EDT_OPENGL,dimension2d<u32>(640,480),32);
IVideoDriver* driver = device->getVideoDriver ();
ISceneManager* sceneManager =device->getSceneManager ();
device->getCursorControl ()-> setVisible (true);
/* GOBAN */
IMeshSceneNode* cube =sceneManager->addCubeSceneNode(1,0,-1,vector3df(0,0,0),vector3df(0,0,0),vector3df(1,0.2,1));
cube->setMaterialFlag(video::EMF_LIGHTING, false);
cube->setMaterialTexture( 0, driver->getTexture("C:\\\\Users\\\\Dante\\\\Desktop\\\\projet rogrammation s6\\\\jeuDeGo\\\\9x9.png") );
/* STONE*/
IMeshSceneNode* sphere =sceneManager->addSphereSceneNode(0.4f,100,0,-1,vector3df(0,0.12,0),vector3df(0, 0, 0),vector3df(0.1, 0.06, 0.1));
sphere->setMaterialFlag(video::EMF_LIGHTING, false);
sphere->setMaterialTexture( 0, driver->getTexture("C:\\\\Users\\\\Dante\\\\Desktop\\\\projet rogrammation s6\\\\jeuDeGo\\\\stone_black.png") );
/* CAMERA */
sceneManager->addCameraSceneNode (0,vector3df (0,0.8,0),vector3df (0,0.1,0));
/*gestion de l'evenement*/
Display::CEventReceiver receiver(sphere);
device->setEventReceiver(&receiver);
/* RENDU */
SColor color( // contient la couleur blanc
255, // composante A alpha (transparence)
255, // composante R rouge
255, // composante G verte
255); // composante B bleue
while (device->run()) { // la boucle de rendu
driver->beginScene(true, true, color); // demarre le rendu
if(receiver.getM_isAdded())
{
addStone(receiver.getXref(),0.8,receiver.getYref());
receiver.setM_isAdded(false);
}
receiver.majPosMesh();
sceneManager->drawAll (); // calcule le rendu
driver->endScene (); // affiche le rendu
}
device->drop (); // libere la memoire
}
Display::CEventReceiver::CEventReceiver(irr::scene::IMeshSceneNode* Nmodele)
{
//On pointe le mesh passe en parametre.
m_Nmodele = Nmodele;
//Par defaut on ne bouge pas
m_isMoving = false;
m_isAdded =false;
}
bool Display::CEventReceiver::OnEvent(const irr::SEvent &event){
//On verifie que le pointeur est ok et que cest un evenemetn liée a la souris
if(m_Nmodele != 0 && event.EventType == irr::EET_MOUSE_INPUT_EVENT)
{
m_isMoving = true;
//on recupereles coordonee exacte par rapport au goban
xref = -(event.MouseInput.Y-240)*0.002;
yref = -(event.MouseInput.X-320)*0.002;
if(event.MouseInput.Event== irr::EMIE_LMOUSE_PRESSED_DOWN){
std::cout<<"xref egal a "<<xref<<std::endl;
std::cout<<"Yref egal a "<<yref<<std::endl;
m_isAdded=true;
}
//L'event est traite, on retourne true
return true;
}
//Si on arrive la, c'est qu'on a pas traite l'event
m_isMoving = false;
return false;
}
//on ajoute une pierre au goban
void Display::addStone(float x,float y,float z){
IMeshSceneNode* Stone =sceneManager->addSphereSceneNode(0.4f,1000,0,0,vector3df(x, 0.12, y),vector3df(0, 0, 0),vector3df(0.1, 0.06, 0.1));
Stone->setMaterialFlag(video::EMF_LIGHTING, false);
Stone->setMaterialTexture( 0, driver->getTexture("C:\\\\Users\\\\Dante\\\\Desktop\\\\projet rogrammation s6\\\\jeuDeGo\\\\stone_black.png") );
}
void Display::CEventReceiver::majPosMesh(){
//On verifie que le pointeur vers le mesh est
//ok et que la touche est enfoncee
if(m_Nmodele != 0 && m_isMoving == true)
{
//On commence par recuperer la position actuelle
irr::core::vector3df v = m_Nmodele->getPosition();
//On y ajoute la valeur de deplacement
v.X =xref;
v.Z= yref;
//On renvoie la nouvelle position
m_Nmodele->setPosition(v);
}
}
Hors ligne
02-04-2012 08:25:15
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.227.52
- Courriel
Si j'étais toi, je mettrais mes variables (surtout les pointeurs) en variables de la classe Display. Sinon pour libérer la mémoire...
Donc : IrrlichtDevice* device, IVideoDriver* driver, ISceneManager* sceneManager, CEventReceiver receiver et tes trois nodes, je les mettrais en variables de classe. Tu n'auras plus besoin de passer sphere en paramètre.
De plus, si je ne me trompe pas, CEventReceiver receiver est détruite à la fin du constructeur donc la référence que tu donnes à device n'existe plus et l'espace mémoire que device va essayer de lire sera certainement réatribué à un autre programme par l'OS.
Pour event receiver fait plutot :
Dans Display.h
CEventReceiver* receiver;
Dans Display.cpp
CEventReceiver receiver = new CEventReceiver();
device->setEventReceiver(receiver);
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne
02-04-2012 14:04:50
- Dante03
- Membres
- Date d'inscription:
- Messages: 5
- IP: 46.193.133.60
- Courriel
j'ai écouté tes conseil et effectivement ça a régler le problème de plantage ^^ je te remercie d'avoir pris de ton temps pour m'aider
.
Hors ligne
02-04-2012 21:42:37
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.198.227.52
- Courriel
De rien, il n'y a plus grand monde sur le forum mais on aide quand l'on peut.
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne



