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
Dernière modification par bestben (22-10-2007 22:25:20)
Hors ligne
Non je n'avais pas essayer mais ça ne me fait aucune différence
Hors ligne
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
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
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
Non toujours pareil
merci quand même ^^
Hors ligne
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
Hors ligne
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
No problem ...Content que ça fonctionne à présent
Hors ligne