#0 

31-05-2008 11:31:45

nikska
Membre
Lieu: Montpellier
Date d'inscription: 12-05-2008
Messages: 36

bonjour,
Alors à partir de l'exemple 7 sur les collisions, j'ai fait quelque petite modification :
lorsque je clique sur un objet, je récupère le ISceneNode seulement j'aimerai pouvoir accéder au méthodes de l'IAnimatedMeshSceneNode.
J'ai essayé plusieurs choses, mais malheureusement ça plante.

voici la code :

Code:

#include <irrlicht.h>
#include <iostream>


using namespace irr;

class MyEventReceiver : public irr::IEventReceiver
{

    public:
    MyEventReceiver( scene::ISceneManager* smgr, gui::ICursorControl* curseur)
    {
        //node=0;

        selectedSceneNode = 0;
        lastSelectedSceneNode = 0;
        m_smgr = smgr;
        m_curseur = curseur;

    }

    bool OnEvent(const SEvent& event)
    {

        if (event.EventType == EET_MOUSE_INPUT_EVENT && event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
        {
            core::line3d<f32> line;


            line.start = m_smgr->getActiveCamera()->getPosition();

            line.end = line.start + (m_smgr->getActiveCamera()->getTarget() - line.start).normalize() * 1000.0f;

            core::vector3df intersection;
            core::triangle3df tri;

            selectedSceneNode = m_smgr->getSceneCollisionManager()->getSceneNodeFromScreenCoordinatesBB(m_curseur->getPosition());


            if (lastSelectedSceneNode){
                lastSelectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, true);
            }


            if (selectedSceneNode){
                selectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
                scene::IAnimatedMeshSceneNode* node=0;

                selectedSceneNode->addChild(node);   //essai1 avec addchild
                //node->setParent(selectedSceneNode);  //essai2 avec set parent
                std::cout<<"modifie animaion speed :"<<std::endl;
                node->setAnimationSpeed(5); //fait planter l'application
                std::cout<<"fin modifie :"<<std::endl;

                lastSelectedSceneNode = selectedSceneNode;

                /**
                Ici je voudrai acceder au methodes de l'AnimatedMeshSceneNode !!
                Par exemple : utiliser setAnimationSpeed(5);
                    ou  récupéré le nom du personnage pour une classe qui herite de AnimatedMeshSceneNode
                **/

            }
        }
    }

    protected:
        //scene::IAnimatedMeshSceneNode* node;
        scene::ISceneNode* selectedSceneNode;
        scene::ISceneNode* lastSelectedSceneNode;
        scene::ISceneManager* m_smgr;
        gui::ICursorControl* m_curseur;
};



int main()
{
    // create device

    IrrlichtDevice *device =
        createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 32, false);
    irr::gui::ICursorControl* monCurseur = device->getCursorControl();


    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();

    scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeMaya(0);
    camera->setPosition(core::vector3df(0, 0, 0));
    camera->setTarget(core::vector3df(-70,0,-20));


    video::SMaterial material;
    material.setTexture(0, driver->getTexture("../../media/faerie2.bmp"));
    material.Lighting = true;

    scene::IAnimatedMeshSceneNode* node = 0;
    scene::IAnimatedMesh* faerie = smgr->getMesh("../../media/faerie.md2");

    if (faerie)
    {
        scene::IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(faerie);
        node1->setPosition(core::vector3df(-70,0,0));
        node1->setMD2Animation(scene::EMAT_RUN);
        node1->getMaterial(0) = material;
        std::cout<<(&node)<<std::endl;

        scene::IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode(faerie);
        node2->setPosition(core::vector3df(-70,0,-30));
        node2->setMD2Animation(scene::EMAT_SALUTE);
        node2->getMaterial(0) = material;
        std::cout<<(&node)<<std::endl;

        scene::IAnimatedMeshSceneNode* node3 = smgr->addAnimatedMeshSceneNode(faerie);
        node3->setPosition(core::vector3df(-70,0,-60));
        node3->setMD2Animation(scene::EMAT_JUMP);
        node3->getMaterial(0) = material;

    }

    material.setTexture(0, 0);
    material.Lighting = false;


    smgr->addLightSceneNode(0, core::vector3df(-60,100,400),
                            video::SColorf(1.0f,1.0f,1.0f,1.0f),
                            600.0f);


    MyEventReceiver receiver(smgr, monCurseur);
    device->setEventReceiver(&receiver);

    while (device->run())
        if (device->isWindowActive())
        {
            driver->beginScene(true, true, 0);

            smgr->drawAll();

            driver->endScene();


        }

    device->drop();

    return 0;
}

Hors ligne


#1 

31-05-2008 12:20:27

nikska
Membre
Lieu: Montpellier
Date d'inscription: 12-05-2008
Messages: 36

lol bon je crois que j'ai trouvé la solution à mon problème :
Pour convertir : ((scene::IAnimatedMeshSceneNode*) unSceneNode)
Pour récupéré la pointeur de cette conversion : scene::IAnimatedMeshSceneNode* nouveauSceneNode = ((scene::IAnimatedMeshSceneNode*)selectedSceneNode);

Après on peut très bien utiliser les méthodes normalement : nouveauSceneNode->getFrameNr();

J'ai un peu de mal a comprendre comment la conversion peut récupéré les attributs de l'AnimatedMeshSceneNode mais bon au moins ca marche.

Hors ligne


#2 

31-05-2008 13:48:33

Perceval
Abonné
Date d'inscription: 20-10-2006
Messages: 105

La classe IAnimatedMeshSceneNode dérive de la classe ISceneNode. Tu fais ce qu'on appelle un "cast" en C++, c'est-à-dire que tu dis au compilateur "cet objet est un IAnimatedMeshSceneNode", donc si ton objet est vraiment un IAnimatedMeshSceneNode ,  c'est normal que ca marche sans problème.
Par contre, si l'ISceneNode que tu récupères n'est pas aussi un IAnimatedMeshSceneNode , tu risques de te prendre des erreurs à l'exécution.
Le cast est donc très pratique, mais à manipuler avec précaution smile

Hors ligne


#3 

31-05-2008 14:36:14

nikska
Membre
Lieu: Montpellier
Date d'inscription: 12-05-2008
Messages: 36

Ok merci pour ces précisions,
Je débute en c++,  j'avais mit de coté le chapitre sur cette histoire de cast mais maintenant, je pense pouvoir les utiliser correctement grâce à cette exemple. Il y a encore pas mal de thème que je maitrise pas bien en c++ et irrlicht semble les utiliser tous lol.

Hors ligne


#4 

31-05-2008 17:09:21

Aranoth
Abonné
Lieu: Toulouse
Date d'inscription: 25-09-2006
Messages: 242
Site web

lol bon je crois que j'ai trouvé la solution à mon problème :
Pour convertir : ((scene::IAnimatedMeshSceneNode*) unSceneNode)
Pour récupéré la pointeur de cette conversion : scene::IAnimatedMeshSceneNode* nouveauSceneNode = ((scene::IAnimatedMeshSceneNode*)selectedSceneNode);


Utilise plutôt les vrais casts du C++ :

Code:

IAnimatedMeshSceneNode* nouveauSceneNode = reinterpret_cast< IAnimatedMeshSceneNode* > ( selectedSceneNode );

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
51 invités en ligne
Aucun membre connecté
RSS Feed