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
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
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
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
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
24-10-2007 18:58:53
- firnafin
- Membres

- 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
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
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
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
25-10-2007 16:18:20
- Copland
- Modérateurs
- Date d'inscription:
- Messages: 657
- IP: 90.30.68.79
- Courriel Site web
No problem
...Content que ça fonctionne à présent ![]()
Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.
Hors ligne



