04-11-2007 09:37:44
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 77.192.125.173
- Courriel
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
#include <IRR/irrlicht.h>
#include <iostream>
class CIEventReceiver : public irr::IEventReceiver
{
public :
CIEventReceiver(irr::gui::IGUIWindow* fen_inv);
void majInv();
private :
bool OnEvent(const irr::SEvent &event2);
irr::gui::IGUIWindow* fen_inv;
bool m_isVisible;
};Merci pour vos réponses
Hors ligne
04-11-2007 10:09:01
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.5.108.64
- Courriel Site web
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.
@+
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne
04-11-2007 10:25:52
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.32.147.225
- Courriel
Copland a raison, tu as un pointeur vide
CIEventReceiver::CIEventReceiver(irr::gui::IGUIWindow* fen_inv)
{
//On pointe le mesh passe en parametre.
//Par defaut on ne bouge pas
m_isVisible = false;
}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
Hors ligne
04-11-2007 10:37:01
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 77.192.125.173
- Courriel
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;Hors ligne
04-11-2007 10:38:32
- Perceval
- Membres

- Date d'inscription:
- Messages: 105
- IP: 90.32.147.225
- Courriel
Lol, ouais c'est vrai. Je fais du Java en ce moment, déformation professionnelle ![]()
Hors ligne
04-11-2007 10:41:07
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 77.192.125.173
- Courriel
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 ![]()
Hors ligne
04-11-2007 11:25:58
- gp2mv3
- Membres
- Date d'inscription:
- Messages: 103
- IP: 81.244.94.82
- Courriel Site web
Salut,
Tu dois détruire celle du menu.
Gp2mv3
Hors ligne
04-11-2007 12:18:13
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 77.192.125.173
- Courriel
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)
Hors ligne
04-11-2007 22:53:34
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 77.192.125.173
- Courriel
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
Hors ligne
05-11-2007 09:21:57
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.154.40.238
- Courriel Site web
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
Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250
Hors ligne
05-11-2007 11:09:56
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 77.192.125.173
- Courriel
Ouai mais si je la détruit sa plante
Hors ligne
05-11-2007 18:04:11
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.154.40.238
- Courriel Site web
ton pointeur renvoie probablement vers null
test si il l'est avant, affiche un message dans la console par exemple.
Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250
Hors ligne
06-11-2007 23:46:00
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.99.103.187
- Courriel
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
07-11-2007 09:30:52
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.154.41.124
- Courriel Site web
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
Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250
Hors ligne
07-11-2007 11:46:26
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.99.103.187
- Courriel
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
07-11-2007 16:34:52
- izguit
- Administrateurs

- Date d'inscription:
- Messages: 306
- IP: 83.154.41.124
- Courriel Site web
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
Athlon 64 3000+ // 1Go RAM // Geforce 6600GT 128Mo
Turion 64 X2 // 1Go RAM // ATI X1250
Hors ligne
07-11-2007 21:29:11
- bestben
- Membres
- Date d'inscription:
- Messages: 133
- IP: 84.99.103.187
- Courriel
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



