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;
}