#1 

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


#2 

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


#3 

04-11-2007 10:25:52

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.147.225
Courriel

Copland a raison, tu as un pointeur vide smile

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 wink


Hors ligne


#4 

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


#5 

04-11-2007 10:38:32

Perceval
Membres
Avatar de Perceval
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 wink


Hors ligne


#6 

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 lol


Hors ligne


#7 

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


Mon projet sous Irrlicht : RoM : Rebuilding on Mars
N'hésitez pas à y faire un tour wink

Hors ligne


#8 

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


#9 

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 lol )
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


#10 

05-11-2007 09:21:57

izguit
Administrateurs
Avatar de izguit
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


#11 

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


#12 

05-11-2007 18:04:11

izguit
Administrateurs
Avatar de izguit
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


#13 

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 lol )


Hors ligne


#14 

07-11-2007 09:30:52

izguit
Administrateurs
Avatar de izguit
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


#15 

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


#16 

07-11-2007 16:34:52

izguit
Administrateurs
Avatar de izguit
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 smile

camerafps est bien passée en paramètre à ta fonction? Ca vient soit de fen_inv/m_isvisible/camerafps de toute façon smile 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


#17 

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


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
119 invités en ligne
membre en ligne: -
RSS Feed