#1 

22-10-2007 17:56:29

bestben
Membres
Date d'inscription:
Messages: 133
IP: 84.98.115.179
Courriel

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


Hors ligne


#2 

22-10-2007 18:43:50

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 90.5.159.25
Courriel  Site web

j'ai pas tout lu mais t'a essayé :
bool CEventReceiver::OnEvent(const irr::SEvent &event) à la place de bool CEventReceiver::OnEvent(irr::SEvent event) ?


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

22-10-2007 18:59:16

bestben
Membres
Date d'inscription:
Messages: 133
IP: 84.98.115.179
Courriel

Non je n'avais pas essayer mais ça ne me fait aucune différence


Hors ligne


#4 

22-10-2007 20:01:54

Kevin Leonhart
Membres
Date d'inscription:
Messages: 33
IP: 83.192.209.128
Courriel  Site web

Salut.

Le souci vient peut être de tes inclusions.
Dans certains fichier, tu inclues plusieurs fois des headers.
Dans aucun tu ne met de "gardes anti-multi-inclusions.


Hors ligne


#5 

24-10-2007 17:05:11

bestben
Membres
Date d'inscription:
Messages: 133
IP: 84.98.115.179
Courriel

Oui j'y est pensé un peut après avoir posté j'ai donc effacer certaine inclusions :
Dans Main.cpp et CEventReceiver.cpp je n'ai inclus que "CEventReceiver.h"
et dans CEventReceiver.h j'ai inclus IRR/irrlicht.h IEventReceiver.h iostream.h
Jai edit mon post
Mais sa marche toujours pas ^^
EDIT: je suis *** pas besoin d'inclure IEventReceiver.h puisque tous s'inclut grace à Irrlicht.h (enfin je crois)
help please ^^


Hors ligne


#6 

24-10-2007 18:58:53

firnafin
Membres
Avatar de firnafin
Date d'inscription:
Messages: 150
IP: 78.114.39.27
Courriel

saut,

il me semble que j'avais eu un probleme du meme style, essaye de mettre le code de la methode OnEvent dans le .h directement.


Hors ligne


#7 

24-10-2007 19:57:11

bestben
Membres
Date d'inscription:
Messages: 133
IP: 84.98.112.223
Courriel

Non toujours pareil
merci quand même ^^


Hors ligne


#8 

25-10-2007 15:46:19

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 90.30.68.79
Courriel  Site web

Ta façon de programmer je la trouve bizarre quand même :p.
je comprends pas pourquoi tu fais comme ça déjà :

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

remplace le plustot par :

bool CEventReceiver::OnEvent(const 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


blabla }

Ensuite dans ton .h je mettrai plustot ça en private :
bool OnEvent(const irr::SEvent &event);

Ca serai bien aussi de préciser sur quelle version d'irrlicht tu travailles parceque cette méthode à été modifiée à plusieurs reprise


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#9 

25-10-2007 16:14:30

bestben
Membres
Date d'inscription:
Messages: 133
IP: 84.98.112.223
Courriel

Copland tu est comment dire... Un GENIE!!!!
Merci de ta réponse sa marche
Et merci aussi aux autres personne m'ayant rep


Hors ligne


#10 

25-10-2007 16:18:20

Copland
Modérateurs
Date d'inscription:
Messages: 657
IP: 90.30.68.79
Courriel  Site web

No problemsmile...Content que ça fonctionne à présentwink


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
81 invités en ligne
membre en ligne: -
RSS Feed