#0 

03-01-2009 00:10:38

ayboangelus
Membre
Date d'inscription: 08-12-2008
Messages: 53

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)

Code:

char character::draw()
{
    cEventReceiver eventReceiver;
    device->setEventReceiver(&eventReceiver);
    return 0;
}

et celui là c'est l'écouteur:

Code:

#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.


Akhynia - MMORPG en projet => http://www.akhynia.fr

Hors ligne


#1 

03-01-2009 03:19:00

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

Combien de fois appel tu draw, de plus device n'est pas initialisé...

Hors ligne


#2 

03-01-2009 08:41:57

ayboangelus
Membre
Date d'inscription: 08-12-2008
Messages: 53

Draw est utilisé comme ceci:

Voici mon coreApp.cpp, qui est la gestion graphique de mon programme.

Code:

#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:

Code:

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


Akhynia - MMORPG en projet => http://www.akhynia.fr

Hors ligne


#3 

03-01-2009 08:49:34

yamashi
Membre
Date d'inscription: 02-01-2009
Messages: 50

Il ne faut pas utiliser l'event manager plusieurs fois c'est un callback automatique...

Hors ligne


#4 

03-01-2009 10:09:08

ayboangelus
Membre
Date d'inscription: 08-12-2008
Messages: 53

euuhh tu vois ou que je m'en sers plusieurs fois ?

Et j'ai oublié de publié l'event:

Code:

#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

Akhynia - MMORPG en projet => http://www.akhynia.fr

Hors ligne


#5 

03-01-2009 12:24:30

dark calculator
Abonné
Date d'inscription: 25-02-2007
Messages: 153

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


#6 

03-01-2009 12:42:12

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

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 :

Code:

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 smile).

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


#7 

03-01-2009 12:53:05

ayboangelus
Membre
Date d'inscription: 08-12-2008
Messages: 53

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

Code:

#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

Code:

#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


Akhynia - MMORPG en projet => http://www.akhynia.fr

Hors ligne


#8 

04-01-2009 00:28:55

ayboangelus
Membre
Date d'inscription: 08-12-2008
Messages: 53

Problème résolu grace à Magun, merci


Akhynia - MMORPG en projet => http://www.akhynia.fr

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
129 invités en ligne
Aucun membre connecté
RSS Feed