#1 

08-03-2008 21:13:21

quarty
Membres
Date d'inscription:
Messages: 10
IP: 90.8.59.217
Courriel

Salut

J'ai trouvé un super tuto sur Le site du zéro, pour le moment j'en suis à la partie qui traite des events, j'ai donc suivis le tuto mais j'arrive à une erreur lors de la compilation:


main.cpp(32) : error C2259: 'CEventReceiver' : impossible d'instancier une classe abstraite
à cause des membres suivants :
'bool irr::IEventReceiver::OnEvent(const irr::SEvent &)' : est abstrait
c:\\program files\\microsoft visual studio 9.0\\vc\\include\\irrlich\\ieventreceiver.h(256) : voir la déclaration de 'irr::IEventReceiver::OnEvent'

voila le code (copié directement depuis le site du zéro:

Main.cpp:

#include "CEventReceiver.h"


int main(void)
{

//Device, driver et graphe de scene.
irr::IrrlichtDevice* device = irr::createDevice(irr::video::EDT_OPENGL,
irr::core::dimension2d<irr::s32>(800,800),32,false,false,false);
irr::video::IVideoDriver* driver = device->getVideoDriver ();
irr::scene::ISceneManager *sceneManager = device->getSceneManager ();

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

//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") );

//La camera
irr::scene::ICameraSceneNode *camera;
camera = sceneManager->addCameraSceneNodeFPS (0,100.0f,300.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())
{
driver->beginScene(true, true, irr::video::SColor(0,200,200,200));
//Met a jour la position du mesh
receiver.majPosMesh();
sceneManager->drawAll ();
driver->endScene ();
}

device->drop ();
return 0;
}

CEventReceiver.h:
#include <irr/irrlicht.h>

class CEventReceiver : public irr::IEventReceiver
{

public :

//Le constructeur.
CEventReceiver(irr::scene::IAnimatedMeshSceneNode* Nmodele);
//Capte automatiquement les events.
bool OnEvent(const 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;
};

CEventReceiver.pp:
#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(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
//Qu'il s'agit de la touche z
&& event.KeyInput.Key == irr::KEY_KEY_Z)
{
//Si il s'agit d'un appui
if(event.KeyInput.PressedDown == true)
m_isMoving = true;
//Sinon c'est un relachement
else
m_isMoving = false;
//L'event est traite, on retourne true
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);
}
}

J'espere que quelqu'un pourras m'aider smile, si vous avez un autre tuto sur les events avec irrlicht je prend aussi smile

Merci


"Le pingouin mange la pomme mais le pingouin et la pomme tombent par la fenêtre"

Hors ligne


#2 

08-03-2008 21:53:04

Willikus
Membres
Avatar de Willikus
Date d'inscription:
Messages: 150
IP: 86.220.205.200
Courriel  Site web

Salut !

Remplace les "bool CEventReceiver::OnEvent(const irr::SEvent event)" par bool CEventReceiver::OnEvent(const irr::SEvent& event)


a+
w

EDIT : quelques explications bonus : depuis irrlicht 1.3, ça a changer et donc de nombreux tutos ont des défault tel que celui là (pas mal de syntaxe qui a changer)


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#3 

08-03-2008 22:06:19

quarty
Membres
Date d'inscription:
Messages: 10
IP: 90.8.59.217
Courriel

Salut,

j'ai remplacé ce que tu m'as dit mais ca ne fonctionne toujours pas, je colle le le rapport complet de compilation:

  • ----- Début de la génération : Projet : tuto_3d, Configuration : Debug Win32 ------

Compilation en cours...
main.cpp
c:\\users\\prêt fnac 164\\documents\\visual studio 2008\\projects\ uto_3d\ uto_3d\\main.cpp(32) : error C2259: 'CEventReceiver' : impossible d'instancier une classe abstraite
à cause des membres suivants :
'bool irr::IEventReceiver::OnEvent(const irr::SEvent &)' : est abstrait
c:\\program files\\microsoft visual studio 9.0\\vc\\include\\irrlich\\ieventreceiver.h(256) : voir la déclaration de 'irr::IEventReceiver::OnEvent'
CEventReceiver.cpp
c:\\users\\prêt fnac 164\\documents\\visual studio 2008\\projects\ uto_3d\ uto_3d\\ceventreceiver.cpp(13) : error C2511: 'bool CEventReceiver::OnEvent(const irr::SEvent &)' : impossible de trouver la fonction membre surchargée dans 'CEventReceiver'
c:\\users\\prêt fnac 164\\documents\\visual studio 2008\\projects\ uto_3d\ uto_3d\\ceventreceiver.h(3) : voir la déclaration de 'CEventReceiver'
Génération de code en cours...
Le journal de génération a été enregistré à l'emplacement "file://c:\\Users\\Prêt Fnac 164\\Documents\\Visual Studio 2008\\Projects\ uto_3d\ uto_3d\\Debug\\BuildLog.htm"
tuto_3d - 2 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========

EDIT : quelques explications bonus : depuis irrlicht 1.3, ça a changer et donc de nombreux tutos ont des défault tel que celui là (pas mal de syntaxe qui a changer)

Merci pour l'info

edit: J'ai encore une question smile Avec irrlicht on peux créer des boutons, les boutons ont un "theme" est-ce qu'on peux changer de theme ou est-ce qu'on dois utiliser une autre librairie (comme gtk) pour gérer les boutons ?


"Le pingouin mange la pomme mais le pingouin et la pomme tombent par la fenêtre"

Hors ligne


#4 

09-03-2008 10:25:41

Willikus
Membres
Avatar de Willikus
Date d'inscription:
Messages: 150
IP: 86.220.205.200
Courriel  Site web

Désolé, je n'avais pas vu celui la : "bool OnEvent(const irr::SEvent event);" à remplacer par "bool OnEvent(const irr::SEvent& event);"

Pour les boutons nous on crée à crée des fonctions pour charger des images et les modifié lors du survol : l'effet est bouton, et avec des if/else on verifie le clic et la position


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


#5 

09-03-2008 10:57:24

quarty
Membres
Date d'inscription:
Messages: 10
IP: 90.17.140.134
Courriel

Ca fonctionne Merci beaucoup


"Le pingouin mange la pomme mais le pingouin et la pomme tombent par la fenêtre"

Hors ligne


#6 

09-03-2008 11:27:05

Willikus
Membres
Avatar de Willikus
Date d'inscription:
Messages: 150
IP: 86.220.205.200
Courriel  Site web

Si tu commence je te conseil de cherche de tel erreur dans la doc de irrlicht : tu repert la fn qui deconne dans le rapport du compilateur puis tu la cherche dans la doc... apres tu compart, comme ça ça fait travailler ^^
(Même si ça devient vite chiant, et qu'a force, je demande aussi ><)

a+
w


Athlon 3000+ / 1024Mo PC3200 /8800 GTS

Hors ligne


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