Pages: 1
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 :
#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
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
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
Hors ligne
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
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++ :
IAnimatedMeshSceneNode* nouveauSceneNode = reinterpret_cast< IAnimatedMeshSceneNode* > ( selectedSceneNode );
Hors ligne
Pages: 1
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 34 invités en ligne Aucun membre connecté RSS Feed |