Pages: 1
Bonjour,
J'ai mis dans mon programme un récepteur d'évènement pour la gestion des boutons, mais à chaque fois qu'il charge il plante.
Est ce que quelqu'un peut m'aider svp.
Voici mon code (character.cpp)
char character::draw() { cEventReceiver eventReceiver; device->setEventReceiver(&eventReceiver); return 0; }
et celui là c'est l'écouteur:
#ifndef EVENEMENT_H_INCLUDED #define EVENEMENT_H_INCLUDED #include <irrlicht.h> #include <iostream> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; enum { GUI_ID_VAL1, GUI_ID_VAL2, GUI_ID_VAL3 }; class cEventReceiver : public IEventReceiver { public: cEventReceiver() {} virtual bool OnEvent(const SEvent& event) { if (event.EventType == EET_GUI_EVENT) { s32 id = event.GUIEvent.Caller->getID(); IGUIEnvironment* env = device->getGUIEnvironment(); if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) { if (id == GUI_ID_VAL1 || id == GUI_ID_VAL2 || id == GUI_ID_VAL3) { IDChar = IDperso; } } } return false; } private: int IDChar,IDperso; IrrlichtDevice *device; }; #endif // EVENEMENT_H_INCLUDED
J'ai des ptits soucis, et ca me bloque pour la suite.
Merci de votre aide par avance.
Hors ligne
Combien de fois appel tu draw, de plus device n'est pas initialisé...
Hors ligne
Draw est utilisé comme ceci:
Voici mon coreApp.cpp, qui est la gestion graphique de mon programme.
#include "coreApp.h" coreApp::coreApp() { device = createDevice(EDT_OPENGL,dimension2d<s32>(1024,768), 32); //MyEvent *event = new MyEvent(); //device->setEventReceiver(MyEvent); driver = device->getVideoDriver(); env = device->getGUIEnvironment(); scenegraph = device->getSceneManager(); gui = scenegraph->getGUIEnvironment(); LOGIN = new login(device); wchar_t titre[100]; swprintf(titre, 100, L"Akhynia"); device->setWindowCaption(titre); s32 pos = 255;//no alpha for (u32 i=0; i<EGDC_COUNT ; ++i) { SColor col = gui->getSkin()->getColor((EGUI_DEFAULT_COLOR)i); col.setAlpha(pos); gui->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col); } } coreApp::~coreApp() { device->closeDevice(); } void coreApp::draw() { while(device->run() /*&& (eventReceiver.Keys[KEY_ESCAPE] == false)*/) { driver->beginScene(true, true, SColor(255,100,101,140)); env->drawAll(); gui->drawAll(); scenegraph->drawAll(); driver->endScene(); if(LOGIN && LOGIN->draw() == 2) { delete LOGIN; LOGIN = false; Carac = new character(device); } if(LOGIN && LOGIN->draw() == 3) { env->addMessageBox(L"Erreur", L"Votre mot de passe est mauvais merci de le saisir de nouveau!"); } if(Carac) { Carac->draw(); } if(Carac && Carac->draw() == 4) { int spouet = Carac->fonction(); delete Carac; Carac = false; World = new world(device,spouet); } if(World) { World->draw(); } } device->drop(); }
Et pour device je l'initialise dans ma partie character.cpp que voici:
#include "character.h" #include "eventvalidchar.h" #include <iostream> #include <fstream> character::character(IrrlichtDevice* Device) { device = Device; driver = device->getVideoDriver (); scenegraph = device->getSceneManager (); gui = scenegraph->getGUIEnvironment(); env = device->getGUIEnvironment(); scenegraph->addCameraSceneNode (0, core::vector3df (0,0,0), core::vector3df (50,0,0)); IGUIImage *img = env->addImage(rect<s32>(0,0,1024,768)); img->setImage(driver->getTexture("media/cadre.jpg")); int IDperso = 11; // Perso 1 modele2 = scenegraph->getMesh("persos/11.x"); Nmodele2 = scenegraph->addAnimatedMeshSceneNode(modele2); Nmodele2->setPosition(core::vector3df(150,-30,70)); Nmodele2->setRotation(core::vector3df(0,80,0)); Nmodele2->setMaterialFlag(video::EMF_LIGHTING, false); Nmodele2->setFrameLoop(0,0); Nmodele2->setMaterialTexture( 0, driver->getTexture("persos/dwarf.jpg") ); // Perso 2 modele = scenegraph->getMesh("persos/test/player.x"); Nmodele = scenegraph->addAnimatedMeshSceneNode(modele); Nmodele->setPosition(core::vector3df(10.5,0.5,-0.5)); Nmodele->setRotation(core::vector3df(0,-90,0)); Nmodele->setMaterialFlag(video::EMF_LIGHTING, false); env->addButton(core::rect<s32>(190,600,330,650), 0, GUI_ID_VAL1, L"Selection"); env->addButton(core::rect<s32>(460,600,600,650), 0, GUI_ID_VAL2, L"Selection"); env->addButton(core::rect<s32>(740,600,880,650), 0, GUI_ID_VAL3, L"Selection"); IGUIStaticText* choixperso = env->addStaticText(L"Choix du personnage",rect<s32>(380,700,670,750),false); } character::~character() { scenegraph->clear(); env->clear(); gui->clear(); driver->removeAllTextures(); } char character::draw() { cEventReceiver eventReceiver; device->setEventReceiver(&eventReceiver); return 0; }
Merci pour tes réponses
Dernière modification par ayboangelus (03-01-2009 08:43:52)
Hors ligne
Il ne faut pas utiliser l'event manager plusieurs fois c'est un callback automatique...
Hors ligne
euuhh tu vois ou que je m'en sers plusieurs fois ?
Et j'ai oublié de publié l'event:
#ifndef EVENEMENT_H #define EVENEMENT_H #include <irrlicht.h> #include <iostream> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; enum { GUI_ID_VAL1, GUI_ID_VAL2, GUI_ID_VAL3 }; class cEventReceiver : public IEventReceiver { public: cEventReceiver() {} virtual bool OnEvent(const SEvent& event) { if (event.EventType == EET_GUI_EVENT) { s32 id = event.GUIEvent.Caller->getID(); env = device->getGUIEnvironment(); if (event.GUIEvent.EventType == EGET_BUTTON_CLICKED) { if (id == GUI_ID_VAL1 || id == GUI_ID_VAL2 || id == GUI_ID_VAL3) { IDChar = IDperso; return true; } } } return false; } private: int IDChar,IDperso; IrrlichtDevice *device; IGUIEnvironment* env; }; #endif // EVENEMENT_H_INCLUDED
Hors ligne
Salut
Je sais pas à quoi sert la fonction character::draw(), mais comme l'a plus ou moins dits yamashi, setEventReceiver ne doit être appelé qu'une fois, à moins que tu changes d'event receiver en cours de route.
Enfin je connais pas assez ton code pour dire mais appelé une fonction draw me fait penser que tu vas l'appeler à chaque boucle, dans ce cas cela est inutile, une fois que l'event receiver est affecté il y reste.
Enfin le problème ne vient pas vraiment de la tu cree dans la fonction draw un cEventReceiver dans la pile qui sera donc détruit à la fin de la fonction draw. Comme tu passe l'adresse de cet objet au device, celui-ci conserve l'adresse, et quand un event est crée il prends l'adresse et va chercher l'eventReceiver qui s'y trouve mais qui a été détruit, donc l'emplacement mémoire ne correspond pas => segfault.
je suis pas sur d'avoir été bien explicite, mais en gros tu dois creer l'event receiver en tant qu'attribut de charactere ou bien le creer dans le tas(avec new) et penser à le détruire en fin de prog
n'hésite pas à redemander si tu comprends pas
dark calculator
Hors ligne
Y a aussi effectivement un problème avec le device, comme le dit yamashi.
Dans ton event receiver, il y a bien un bien une variable privée device, mais elle est initialisée nulle part, donc ça va planter quand tu vas arriver sur la ligne :
env = device->getGUIEnvironment();
Sinon, je rejoins yamashi et darkcalculator pour dire qu'il y a un gros problème avec la méthode draw de character (en plus elle est censée rendre un char et tu retournes 0, c'est pas très propre ).
Le destructeur aussi est bizarre. Je sais pas ce que tu veux faire, mais c'est étrange d'effacer toute la scène quand tu supprimes un character.
Je pense que tu devrais te repencher un peu sur l'architecture de ton programme avant d'aller plus loin.
Hors ligne
J'ai refais un peu mon code qui est plus propre mais qui ne fonctionne toujours pas.
En fait le draw, contient ce qu'il y à dans la boucle de rendu. donc si je n'ai rien le core affiche sa boucle classique, si je mets des choses le core ke rajoute dans la boucle de rendu. Il n'est appelé qu'une fois par le core. (enfin normalement sauf si je me suis planté quelque part) ^^
#ifndef CHARACTER_H #define CHARACTER_H #include "Login.h" #include <irrlicht.h> using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace gui; struct SAppContext { IrrlichtDevice *device; }; enum { GUI_ID_VAL1, GUI_ID_VAL2, GUI_ID_VAL3 }; class MyEventReceiver : public IEventReceiver { public: MyEventReceiver(SAppContext & context) : Context(context) { } virtual bool OnEvent(const SEvent& event) { if (event.EventType == EET_GUI_EVENT) { s32 id = event.GUIEvent.Caller->getID(); IGUIEnvironment* env = Context.device->getGUIEnvironment(); if(event.GUIEvent.EventType == EGET_BUTTON_CLICKED) { if (id == GUI_ID_VAL1 || id == GUI_ID_VAL2 || id == GUI_ID_VAL3) { IDChar = 11; stringw temp = L" "; temp += IDChar; env->addStaticText(temp.c_str(),rect<s32>(380,700,670,750),false); } return true; } return false; } return false; } private: int IDChar, IDperso; SAppContext & Context; }; class character { public: character(IrrlichtDevice* Device); ~character(); int draw(); int IDChar, IDperso; int fonction() { return IDChar; } private: IrrlichtDevice* device; IVideoDriver *driver; ISceneManager *scenegraph; IGUIEnvironment *env; IGUIImage *img; IAnimatedMesh* modele; IAnimatedMeshSceneNode* Nmodele; IAnimatedMesh* modele2; IAnimatedMeshSceneNode* Nmodele2; IGUIEnvironment *gui; int GUI_ID_VAL1,GUI_ID_VAL2,GUI_ID_VAL3; }; #endif
et voici mon character.cpp
#include "character.h" #include <iostream> #include <fstream> character::character(IrrlichtDevice* Device) { device = Device; driver = device->getVideoDriver (); scenegraph = device->getSceneManager (); gui = scenegraph->getGUIEnvironment(); env = device->getGUIEnvironment(); scenegraph->addCameraSceneNode (0, vector3df (50,0,0), vector3df (0,0,0)); IGUIImage *img = env->addImage(rect<s32>(0,0,1024,768)); img->setImage(driver->getTexture("media/cadre.jpg")); int IDperso = 11; // Perso 1 modele2 = scenegraph->getMesh("persos/11.x"); Nmodele2 = scenegraph->addAnimatedMeshSceneNode(modele2); Nmodele2->setPosition(core::vector3df(-90,-30,-65)); Nmodele2->setRotation(core::vector3df(0,-100,0)); Nmodele2->setMaterialFlag(video::EMF_LIGHTING, false); Nmodele2->setFrameLoop(0,0); Nmodele2->setMaterialTexture( 0, driver->getTexture("persos/dwarf.jpg") ); // Perso 2 modele = scenegraph->getMesh("persos/test/player.x"); Nmodele = scenegraph->addAnimatedMeshSceneNode(modele); Nmodele->setPosition(core::vector3df(38,0.5,0.5)); Nmodele->setRotation(core::vector3df(0,90,0)); Nmodele->setMaterialFlag(video::EMF_LIGHTING, false); env->addButton(core::rect<s32>(190,600,330,650), 0, GUI_ID_VAL1, L"Selection"); env->addButton(core::rect<s32>(460,600,600,650), 0, GUI_ID_VAL2, L"Selection"); env->addButton(core::rect<s32>(740,600,880,650), 0, GUI_ID_VAL3, L"Selection"); IGUIStaticText* choixperso = env->addStaticText(L"Choix du personnage",rect<s32>(380,700,670,750),false); SAppContext context; context.device = device; MyEventReceiver receiver(context); device->setEventReceiver(&receiver); } character::~character() {} int character::draw() {}
Je l'ai amélioré avec les différents commentaires que l'on m'a fait. Mais celà ne suffit pas vu que je ne peux afficher ma selection de perso.
Merci pour votre aide en tout cas
Hors ligne
Problème résolu grace à Magun, merci
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 22 invités en ligne Aucun membre connecté RSS Feed |