#0 

04-11-2007 10:37:44

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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

Code:

#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

Code:

#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

Code:

#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


#1 

04-11-2007 11:09:01

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
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


#2 

04-11-2007 11:25:52

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Copland a raison, tu as un pointeur vide smile

Code:

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 :

Code:

this.fen_inv = fen_inv;

Bref, une petite erreur d'inattention wink

Dernière modification par Perceval (04-11-2007 11:26:27)

Hors ligne


#3 

04-11-2007 11:37:01

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

A ouai merci de vos rep rapide
Par contre tu as fait une erreur c'est pas     

Code:

this.fen_inv = fen_inv;

Mais

Code:

this->fen_inv = fen_inv;

Dernière modification par bestben (04-11-2007 11:40:48)

Hors ligne


#4 

04-11-2007 11:38:32

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

Lol, ouais c'est vrai. Je fais du Java en ce moment, déformation professionnelle wink

Hors ligne


#5 

04-11-2007 11:41:07

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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

Dernière modification par bestben (04-11-2007 11:41:35)

Hors ligne


#6 

04-11-2007 12:25:58

gp2mv3
Abonné
Date d'inscription: 27-06-2007
Messages: 103
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


#7 

04-11-2007 13:18:13

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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


#8 

04-11-2007 23:53:34

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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

Dernière modification par bestben (05-11-2007 12:04:27)

Hors ligne


#9 

05-11-2007 10:21:57

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
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


#10 

05-11-2007 12:09:56

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

Ouai mais si je la détruit sa plante

Hors ligne


#11 

05-11-2007 19:04:11

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
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


#12 

07-11-2007 00:46:00

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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


#13 

07-11-2007 10:30:52

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
Site web

Dans la fonction dans laquelle tu veux détruire la camera :

Code:

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


#14 

07-11-2007 12:46:26

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

ba j'ai écrit

Code:

    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


#15 

07-11-2007 17:34:52

izguit
Administrateur
Lieu: 127.0.0.1
Date d'inscription: 14-09-2006
Messages: 306
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


#16 

07-11-2007 22:29:11

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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é
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
42 invités en ligne
Aucun membre connecté
RSS Feed