Bonjours,
Voici mon problème,
Je voudrais faire un menu qui s'ouvre quand on presse une touche,
Mais le truc c'est que quand je presse ma touche dans le jeux une belle fenêtre windows (Envoyer, ne pas envoyer) s'affiche,
Donc je vois pas d'où peut provenir ce problème
Voici mon code :
main.cpp
#include "CEventReceiver.h" using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; using namespace std; int main(void) { IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(1000, 700), 32,false,false,false); video::IVideoDriver* driver = device->getVideoDriver (); scene::ISceneManager* scenegraph = device->getSceneManager (); scene::ISceneManager* smgr = device->getSceneManager(); irr::scene::ISceneManager *sceneManager = device->getSceneManager (); gui::IGUIEnvironment *gui = scenegraph->getGUIEnvironment(); ..... gui::IGUIButton *btn_quit = gui->addButton(core::rect<s32>(20,50,120,70), 0, -1, L"Quit"); gui::IGUIButton *btn_inv = gui->addButton(core::rect<s32>(20,70,120,90), 0, -1, L"Invetaire"); IGUIWindow* fen_inv = gui->addWindow( core::rect< s32 >(40,20,400,450), false, L"", 0, -1 ); CIEventReceiver receiver2(fen_inv); device->setEventReceiver(&receiver2); while (device->run()) { driver->beginScene(true,true,video::SColor(0,200,200,200)); scenegraph->drawAll (); gui->drawAll(); driver->endScene (); fen_inv->gui::IGUIElement::setVisible(false); receiver2.majInv(); } device->drop (); return 0; }
CEventReceiver.cpp
#include "CEventReceiver.h" using namespace irr; using namespace gui; CIEventReceiver::CIEventReceiver(irr::gui::IGUIWindow* fen_inv) { //On pointe le mesh passe en parametre. //Par defaut on ne bouge pas m_isVisible = false; } bool CIEventReceiver::OnEvent(const irr::SEvent &event2) { if(fen_inv != 0 && event2.EventType == irr::EET_KEY_INPUT_EVENT && event2.KeyInput.PressedDown == true && event2.KeyInput.Key == irr::KEY_KEY_I) { if(m_isVisible == false) m_isVisible = true; return true; } if(fen_inv != 0 && event2.EventType == irr::EET_KEY_INPUT_EVENT && event2.KeyInput.PressedDown == false && event2.KeyInput.Key == irr::KEY_KEY_I) { //La touche est relachee, on arrete de bouger m_isVisible = false; return false; } return false; } void CIEventReceiver::majInv() { //On verifie que le pointeur vers le mesh est //ok et que la touche est enfoncee if(fen_inv != 0 && m_isVisible == true) { fen_inv->irr::gui::IGUIElement::setVisible(true); } }
CEventReceiver.h
Merci pour vos réponses
Hors ligne
Salut,
Je présume que tu programmes avec Microsoft visual C++ ? Si tel est le cas il y a un débugueur très puissant intégré, je pense que la meilleurre des solutions et de tracer ton programme, mais si t'a un rapport d'erreur qui s'affiche, y'a de forte chance pour qu'un pointeur "vide" se promene dans ton code.
@+
Hors ligne
Copland a raison, tu as un pointeur vide
Tu passes un paramètre mais tu ne l'utilises pas. Il te manque ceci je suppose :
this.fen_inv = fen_inv;
Bref, une petite erreur d'inattention
Dernière modification par Perceval (04-11-2007 11:26:27)
Hors ligne
A ouai merci de vos rep rapide
Par contre tu as fait une erreur c'est pas
this.fen_inv = fen_inv;
Mais
this->fen_inv = fen_inv;
Dernière modification par bestben (04-11-2007 11:40:48)
Hors ligne
Lol, ouais c'est vrai. Je fais du Java en ce moment, déformation professionnelle
Hors ligne
Par contre j'ai un autre prob comme j'ai 2 class pour recevoir les evenements (une pour faire bouger un perso et une pour le menu) celle du perso marche plus
Dernière modification par bestben (04-11-2007 11:41:35)
Hors ligne
Salut,
Tu dois détruire celle du menu.
Gp2mv3
Hors ligne
ok je vais essayer
EDIT : Ba en faite j'arrive pas à trouver ou le détruire
le fonction c'est :
fen_inv->drop (); (je crois ^^)
Mais j'arrive pas à trouver ou le mettre
Et puis un autre truc comment faire pour que quand je met le menu la cam se détruise pour que la souris soit libéré car la sa me met une erreur quand je la détruit (envoyer ne pas envoyer)
Dernière modification par bestben (04-11-2007 14:25:14)
Hors ligne
bon petit point pour vous dire où j'en suis :
j'ai réussi à mettre le menu en appuyan sur une touche (mais maintenant mes autres event marche plus )
je voudrais que quand le menu s'affiche la souris soit libéré
pour le premier prob : détruire le menu (oui mais où?)
pour le second j'ai vu sur le forum qu'il fallait créer 2 cam, mais j'arrive pas à intégré la fonction pour changé de cam à l'événement
Dernière modification par bestben (05-11-2007 12:04:27)
Hors ligne
dans la fonction majInv, si le menu est visible on le cache, sinon on le montre. Faut pas le détruire sinon tu pourra l'afficher qu'une fois.
Pour la libération de la souris, je suppose que t'as une camera fps. Tu met le pointeur de la camera en paramètre de majInv() et tu la détruit si ce pointeur renvoit quelque chose, sinon tu créées une autre cam
Hors ligne
Ouai mais si je la détruit sa plante
Hors ligne
ton pointeur renvoie probablement vers null
test si il l'est avant, affiche un message dans la console par exemple.
Hors ligne
Eu je vois pas comment tu veux que j'écrive un message dans la console (je me suis surement trompé en faisant mon pointeur) les voici :
irr::scene::ISceneManager* smgr;
irr::scene::ICameraSceneNode* camerafps;
irr::scene::ICameraSceneNode* camera;
et pour le truc de caché le menu a marche pas (je me suis surement trompé aussi )
Hors ligne
Dans la fonction dans laquelle tu veux détruire la camera :
if (camerafps) camerafps->drop(); else std::cout << "ça marche pas" << std::endl;
Un truc du style, fais pas de copier/coller direct hein
Hors ligne
ba j'ai écrit
if(fen_inv != 0 && m_isVisible == true && camerafps) { camerafps->drop (); } else std::cout << "ba non sa marche pas" << std::endl ;
et dans la console sa m'écrit : ba non sa marche pas
Hors ligne
Je te conseille vivement de faire la structure de ton code en "francais" d'abord (càd sans ouvrir ton ide), t'y verra plus clair.
Parce que là c'est plus des problèmes d'irrlicht mais des soucis d'algorithmique
camerafps est bien passée en paramètre à ta fonction? Ca vient soit de fen_inv/m_isvisible/camerafps de toute façon T'as juste a les tester un par un et tu remontes pour voir où est la couille
Hors ligne
c'est bon j'ai trouvé d'où vient l'erreur,
comme je le pensé il ne faut pas utilisé
camerafps->drop();
car cette fonction ne fait que détruire la caméra elle ne fait pas basculé sur l'autre caméra,
il faut utilisé la fonction
smgr->setActiveCamera(camera);
Le seul problème qu'il me reste à réglé c'est que quand le menu est caché mes autres évènements ne marchent pas
Merci déjà pour votre aide
Hors ligne