#0 

22-10-2007 19:56:29

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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 :

Code:

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 :

Code:

#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

Code:

#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

Code:

#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


#1 

22-10-2007 20:43:50

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
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


#2 

22-10-2007 20:59:16

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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

Hors ligne


#3 

22-10-2007 22:01:54

Kevin Leonhart
Membre
Date d'inscription: 07-01-2007
Messages: 33
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


#4 

24-10-2007 19:05:11

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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


#5 

24-10-2007 20:58:53

firnafin
Abonné
Date d'inscription: 31-03-2007
Messages: 150

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


#6 

24-10-2007 21:57:11

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

Non toujours pareil
merci quand même ^^

Hors ligne


#7 

25-10-2007 17:46:19

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
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


#8 

25-10-2007 18:14:30

bestben
Abonné
Date d'inscription: 20-10-2007
Messages: 133

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


#9 

25-10-2007 18:18:20

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

No problem smile...Content que ça fonctionne à présent wink


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

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
22 invités en ligne
Aucun membre connecté
RSS Feed