Historique des modifications - Message

Message #3084

Sujet: [RESOLU] événement, écouteur


Type Date Auteur Contenu
Dernière modification 22-10-2007 20:25:20 bestben
Bonjours,
Bon voici mon problème, j'ai suivis plusieurs tuto, post, etc... sur les évènements mais à chaque fois je tombe sur la même erreur :

node.cpp:116: error: cannot declare variable `receiver' to be of type `CEventReceiver'
node.cpp:116: error:   because the following virtual functions are abstract:
C:/Program Files/CodeBlocks/include/IRR/IEventReceiver.h:256: error:  virtual bool irr::IEventReceiver::OnEvent(const irr::SEvent&)

et donc voici mes codes :
Node.cpp :
#include "CEventReceiver.h"

using namespace irr;
//-------------------------------------------------------------------------------

void closeDevice();
 //---------------------------------------------------------------------------------
 // 2 fonctions toutes nulles pour tester que le perso bouge , tourne et avance
void moveISceneNode(scene::ISceneNode* node,core::vector3df  vector)
{
     node->getRelativeTransformation().rotateVect(vector);
     node->setPosition(  node->getPosition()+vector);

}
void turnISceneNode(scene::ISceneNode* node,core::vector3df vector)
{
     node->setRotation( node->getRotation()+vector);
}

int main(void)
{

    IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 16,false,false,false);
      video::IVideoDriver* driver = device->getVideoDriver ();
    scene::ISceneManager* scenegraph = device->getSceneManager ();
    scene::ISceneManager* smgr = device->getSceneManager();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager ();

    //On rend invisible le curseur
    device->getCursorControl ()-> setVisible (false);



 scene::IAnimatedMesh *room = scenegraph->getMesh("room.3ds");
    if (room == 0)
    {
        std::cout << "problème de chargement de la salle" << std::endl;
        return 1;
    }
    scene::IMeshSceneNode *Nroom = scenegraph->addMeshSceneNode(room->getMesh(0));
    Nroom->setPosition(core::vector3df(0,-80,0));
//On applique une texture à la salle.
    scenegraph->getMeshManipulator()->makePlanarTextureMapping(
        room->getMesh(0), 0.004f);
    Nroom->setMaterialTexture( 0, driver->getTexture("rockwall.bmp") );





        //On cree la keymap associe a la camera
    irr::SKeyMap keyMap[5];
    //avancer
    keyMap[0].Action = irr::EKA_MOVE_FORWARD;
    keyMap[0].KeyCode = irr::KEY_KEY_Z;
    //reculer
    keyMap[1].Action = irr::EKA_MOVE_BACKWARD;
    keyMap[1].KeyCode = irr::KEY_KEY_S;
    //a gauche
    keyMap[2].Action = irr::EKA_STRAFE_LEFT;
    keyMap[2].KeyCode = irr::KEY_KEY_Q;
    //a droite
    keyMap[3].Action = irr::EKA_STRAFE_RIGHT;
    keyMap[3].KeyCode = irr::KEY_KEY_D;
    //saut
    keyMap[4].Action = irr::EKA_JUMP_UP;
    keyMap[4].KeyCode = irr::KEY_SPACE;



scene::ITriangleSelector* selector = 0;

//et tu lui associ le node :
selector = smgr->createOctTreeTriangleSelector(room->getMesh(0), Nroom, 128);
Nroom->setTriangleSelector(selector);
selector->drop();


    //Sydney
    irr::scene::IAnimatedMeshMD2* modele;
    modele = (irr::scene::IAnimatedMeshMD2*)sceneManager->getMesh("sydney.md2");
    irr::scene::IAnimatedMeshSceneNode* Nmodele =
    sceneManager->addAnimatedMeshSceneNode(modele);

    //On modifie les proprietes de Sydney
    Nmodele->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    Nmodele->setFrameLoop(0, 0);
    Nmodele->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );

   // creation de la cam , rien de mystique
   scene::ICameraSceneNode * camera=smgr->addCameraSceneNode(Nmodele,core::vector3df(0,0,0),core::vector3df(0,0,0));
   // on place la cam en 0,20,-30 qui sont des coords locals mais comme le cube n'a pas bouger elles correspondent au coord global ie par rapport a 0
   camera->setPosition(core::vector3df(0,20,-30));

//puis tu lui associ la collision avec comme surface "selector" :
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(50,50,50),
core::vector3df(0,-1,0),
core::vector3df(0,0,0));
camera->addAnimator(anim);
anim->drop();



   //lumiere
    scene::ILightSceneNode* lum1 = scenegraph->addLightSceneNode(Nroom, core::vector3df(150,210,250),video::SColorf(0.4f, 0.4f, 0.4f, 0.4f), 30.0f);



    //On cree le capteur d'event et on l'associe au device.


CEventReceiver receiver(Nmodele);
    device->setEventReceiver(&receiver);
    //La boucle de rendu

    while (device->run())
    {
                  //la cam look le cube
          camera->setTarget(Nmodele->getPosition());
              driver->setFog(video::SColor(0,215,215,224), false, 2.0,200.0,0.01, true);
        driver->beginScene(true,true,video::SColor(0,200,200,200));
        //Met a jour la position du mesh
        //Met a jour la position du mesh
        receiver.majPosMesh();
        scenegraph->drawAll ();
        driver->endScene ();
        device->setWindowCaption(L"room");


}

    device->drop ();
    return 0;
}

CEventReceiver.cpp
#include "CEventReceiver.h"


CEventReceiver::CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele)
{
    //On pointe le mesh passe en parametre.
    m_Nmodele = Nmodele;
    //Par defaut on ne bouge pas
    m_isMoving = false;
}


bool CEventReceiver::OnEvent(irr::SEvent event)
{
    //On verifie que le pointeur est ok
    if(m_Nmodele != 0
    //Qu'il s'agit d'un event concernant un appui/relachement de touche
    && event.EventType == irr::EET_KEY_INPUT_EVENT
    //Qu'il s'agit d'un appui
    && event.KeyInput.PressedDown == true
    //Qu'il s'agit de la touche z
    && event.KeyInput.Key == irr::KEY_KEY_Z)
    {
        //Si on n'est pas en train de bouger, on s'y met
        if(m_isMoving == false)
            m_isMoving = true;
        //L'event est traite, on retourne true
        return true;
    }


    if(m_Nmodele != 0
    && event.EventType == irr::EET_KEY_INPUT_EVENT
    && event.KeyInput.PressedDown == false
    && event.KeyInput.Key == irr::KEY_KEY_Z)
    {
        //La touche est relachee, on arrete de bouger
        m_isMoving = false;
        return true;
    }

    //Si on arrive la, c'est qu'on a pas traite l'event
    return false;
}


void CEventReceiver::majPosMesh()
{
    //On verifie que le pointeur vers le mesh est
    //ok et que la touche est enfoncee
    if(m_Nmodele != 0 && m_isMoving == true)
    {
        //On commence par recuperer la position actuelle
        irr::core::vector3df v = m_Nmodele->getPosition();
        //On y ajoute la valeur de deplacement
        v.X += 1.0f;
        //On renvoie la nouvelle position
        m_Nmodele->setPosition(v);
    }
}

CEventReceiver.h
#include <IRR/irrlicht.h>
#include <IEventReceiver.h>
#include <iostream>

class CEventReceiver : public irr::IEventReceiver
{

public :

    //Le constructeur.
    CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele);
    //Capte automatiquement les events.
    bool OnEvent(irr::SEvent event);
    //Met a jour la position du mesh.
    void majPosMesh();


private :

    //Le modele qu'on va controler.
    irr::scene::IAnimatedMeshSceneNode* m_Nmodele;
    //Indique si on est deja en mouvement ou pas.
    bool m_isMoving;
};

J'ai essayer plusieurs tutos, post mais à chaque fois pareille et j'ai aussi essayer de remplacer :
CEventReceiver receiver(Nmodele);
par:
CEventReceiver *receiver = new CEventReceiver(Nmodel);
Mais la même erreur
Merci d'avance pour vos réponses
Création du message 22-10-2007 17:56:29 bestben
Bonjours,
Bon voici mon problème, j'ai suivis plusieurs tuto, post, etc... sur les évènements mais à chaque fois je tombe sur la même erreur :

node.cpp:116: error: cannot declare variable `receiver' to be of type `CEventReceiver'
node.cpp:116: error:   because the following virtual functions are abstract:
C:/Program Files/CodeBlocks/include/IRR/IEventReceiver.h:256: error:  virtual bool irr::IEventReceiver::OnEvent(const irr::SEvent&)

et donc voici mes codes :
Node.cpp :
#include "CEventReceiver.h"

using namespace irr;
//-------------------------------------------------------------------------------

void closeDevice();
 //---------------------------------------------------------------------------------
 // 2 fonctions toutes nulles pour tester que le perso bouge , tourne et avance
void moveISceneNode(scene::ISceneNode* node,core::vector3df  vector)
{
     node->getRelativeTransformation().rotateVect(vector);
     node->setPosition(  node->getPosition()+vector);

}
void turnISceneNode(scene::ISceneNode* node,core::vector3df vector)
{
     node->setRotation( node->getRotation()+vector);
}

int main(void)
{

    IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 16,false,false,false);
      video::IVideoDriver* driver = device->getVideoDriver ();
    scene::ISceneManager* scenegraph = device->getSceneManager ();
    scene::ISceneManager* smgr = device->getSceneManager();
    irr::scene::ISceneManager *sceneManager = device->getSceneManager ();

    //On rend invisible le curseur
    device->getCursorControl ()-> setVisible (false);



 scene::IAnimatedMesh *room = scenegraph->getMesh("room.3ds");
    if (room == 0)
    {
        std::cout << "problème de chargement de la salle" << std::endl;
        return 1;
    }
    scene::IMeshSceneNode *Nroom = scenegraph->addMeshSceneNode(room->getMesh(0));
    Nroom->setPosition(core::vector3df(0,-80,0));
//On applique une texture à la salle.
    scenegraph->getMeshManipulator()->makePlanarTextureMapping(
        room->getMesh(0), 0.004f);
    Nroom->setMaterialTexture( 0, driver->getTexture("rockwall.bmp") );





        //On cree la keymap associe a la camera
    irr::SKeyMap keyMap[5];
    //avancer
    keyMap[0].Action = irr::EKA_MOVE_FORWARD;
    keyMap[0].KeyCode = irr::KEY_KEY_Z;
    //reculer
    keyMap[1].Action = irr::EKA_MOVE_BACKWARD;
    keyMap[1].KeyCode = irr::KEY_KEY_S;
    //a gauche
    keyMap[2].Action = irr::EKA_STRAFE_LEFT;
    keyMap[2].KeyCode = irr::KEY_KEY_Q;
    //a droite
    keyMap[3].Action = irr::EKA_STRAFE_RIGHT;
    keyMap[3].KeyCode = irr::KEY_KEY_D;
    //saut
    keyMap[4].Action = irr::EKA_JUMP_UP;
    keyMap[4].KeyCode = irr::KEY_SPACE;



scene::ITriangleSelector* selector = 0;

//et tu lui associ le node :
selector = smgr->createOctTreeTriangleSelector(room->getMesh(0), Nroom, 128);
Nroom->setTriangleSelector(selector);
selector->drop();


    //Sydney
    irr::scene::IAnimatedMeshMD2* modele;
    modele = (irr::scene::IAnimatedMeshMD2*)sceneManager->getMesh("sydney.md2");
    irr::scene::IAnimatedMeshSceneNode* Nmodele =
    sceneManager->addAnimatedMeshSceneNode(modele);

    //On modifie les proprietes de Sydney
    Nmodele->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    Nmodele->setFrameLoop(0, 0);
    Nmodele->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );

   // creation de la cam , rien de mystique
   scene::ICameraSceneNode * camera=smgr->addCameraSceneNode(Nmodele,core::vector3df(0,0,0),core::vector3df(0,0,0));
   // on place la cam en 0,20,-30 qui sont des coords locals mais comme le cube n'a pas bouger elles correspondent au coord global ie par rapport a 0
   camera->setPosition(core::vector3df(0,20,-30));

//puis tu lui associ la collision avec comme surface "selector" :
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(50,50,50),
core::vector3df(0,-1,0),
core::vector3df(0,0,0));
camera->addAnimator(anim);
anim->drop();



   //lumiere
    scene::ILightSceneNode* lum1 = scenegraph->addLightSceneNode(Nroom, core::vector3df(150,210,250),video::SColorf(0.4f, 0.4f, 0.4f, 0.4f), 30.0f);



    //On cree le capteur d'event et on l'associe au device.


CEventReceiver receiver(Nmodele);
    device->setEventReceiver(&receiver);
    //La boucle de rendu

    while (device->run())
    {
                  //la cam look le cube
          camera->setTarget(Nmodele->getPosition());
              driver->setFog(video::SColor(0,215,215,224), false, 2.0,200.0,0.01, true);
        driver->beginScene(true,true,video::SColor(0,200,200,200));
        //Met a jour la position du mesh
        //Met a jour la position du mesh
        receiver.majPosMesh();
        scenegraph->drawAll ();
        driver->endScene ();
        device->setWindowCaption(L"room");


}

    device->drop ();
    return 0;
}

CEventReceiver.cpp
#include "CEventReceiver.h"


CEventReceiver::CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele)
{
    //On pointe le mesh passe en parametre.
    m_Nmodele = Nmodele;
    //Par defaut on ne bouge pas
    m_isMoving = false;
}


bool CEventReceiver::OnEvent(irr::SEvent event)
{
    //On verifie que le pointeur est ok
    if(m_Nmodele != 0
    //Qu'il s'agit d'un event concernant un appui/relachement de touche
    && event.EventType == irr::EET_KEY_INPUT_EVENT
    //Qu'il s'agit d'un appui
    && event.KeyInput.PressedDown == true
    //Qu'il s'agit de la touche z
    && event.KeyInput.Key == irr::KEY_KEY_Z)
    {
        //Si on n'est pas en train de bouger, on s'y met
        if(m_isMoving == false)
            m_isMoving = true;
        //L'event est traite, on retourne true
        return true;
    }


    if(m_Nmodele != 0
    && event.EventType == irr::EET_KEY_INPUT_EVENT
    && event.KeyInput.PressedDown == false
    && event.KeyInput.Key == irr::KEY_KEY_Z)
    {
        //La touche est relachee, on arrete de bouger
        m_isMoving = false;
        return true;
    }

    //Si on arrive la, c'est qu'on a pas traite l'event
    return false;
}


void CEventReceiver::majPosMesh()
{
    //On verifie que le pointeur vers le mesh est
    //ok et que la touche est enfoncee
    if(m_Nmodele != 0 && m_isMoving == true)
    {
        //On commence par recuperer la position actuelle
        irr::core::vector3df v = m_Nmodele->getPosition();
        //On y ajoute la valeur de deplacement
        v.X += 1.0f;
        //On renvoie la nouvelle position
        m_Nmodele->setPosition(v);
    }
}

CEventReceiver.h
#include <IRR/irrlicht.h>
#include <IEventReceiver.h>
#include <iostream>

class CEventReceiver : public irr::IEventReceiver
{

public :

    //Le constructeur.
    CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele);
    //Capte automatiquement les events.
    bool OnEvent(irr::SEvent event);
    //Met a jour la position du mesh.
    void majPosMesh();


private :

    //Le modele qu'on va controler.
    irr::scene::IAnimatedMeshSceneNode* m_Nmodele;
    //Indique si on est deja en mouvement ou pas.
    bool m_isMoving;
};

J'ai essayer plusieurs tutos, post mais à chaque fois pareille et j'ai aussi essayer de remplacer :
CEventReceiver receiver(Nmodele);
par:
CEventReceiver *receiver = new CEventReceiver(Nmodel);
Mais la même erreur
Merci d'avance pour vos réponses

Retour

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
121 invités en ligne
membre en ligne: -
RSS Feed