Tu prends tout les animators comme des collision reponse, il faudrait peut-être prendre : ISceneNodeAnimator::getType() et le comparé à (irr::scene::ESCENE_NODE_ANIMATOR_TYPE) ESNAT_COLLISION_RESPONSE. Ainsi, tu ne modifies que l'animator concerné par la modif.
Pas besoin de créer une classe pour ce que tu veux faire.
/// création de la caméra
ISceneNodeAnimatorCameraFPS *camera = smgr->addCameraSceneNodeFPS(...);
/// création du selector
/*je te laisse le faire*/
/// création de la collision
irr::scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( selector, camera, irr::core::vector3df(50,20,50), irr::core::vector3df(0,0,0), irr::core::vector3df(0,30,0));
selector->drop();
camera->addAnimator(anim);
anim->drop();
/// dans OnEvent(const SEvent& event)
if (event.EventType == EET_KEY_INPUT_EVENT)
{
if(event.KeyInput.PressedDown)
if(event.KeyInput.Key == KEY_LCONTROL )
{
const irr::scene::ISceneNodeAnimatorList& animatorCamera = camera->getAnimators();
it = animatorCamera.begin();
while(it != animatorCamera.end())
{
if( it->getType() == ESNAT_COLLISION_RESPONSE) /// on ne s'intéresse qu'à l'AnimatorCollisionResponse
{
collisionResponse = static_cast<irr::scene::ISceneNodeAnimatorCollisionResponse *>(*it);
if(!collisionResponse->isFalling())
collisionResponse->setEllipsoidRadius(irr::core::vector3df(30, 20, 30)); /// se baisse
}
it++;
}
return true;
}
else
{
const irr::scene::ISceneNodeAnimatorList& animatorCamera = camera->getAnimators();
it = animatorCamera.begin();
while(it != animatorCamera.end())
{
if( it->getType() == ESNAT_COLLISION_RESPONSE) /// on ne s'intéresse qu'à l'AnimatorCollisionResponse
{
collisionResponse = static_cast<irr::scene::ISceneNodeAnimatorCollisionResponse *>(*it);
if(!collisionResponse->isFalling())
collisionResponse->setEllipsoidRadius(irr::core::vector3df(50, 20, 50));/// se relève
}
it++;
}
return true;
}
}
Bon après comme tu le vois, il y a répétition du code donc une fonction te permettrait de ne pas avoir à appeler ta camera dans le OnEvent :
bool modifyEllipsoidRadius(irr::core::vector3df newradius)
{
const irr::scene::ISceneNodeAnimatorList& animatorCamera = camera->getAnimators();
it = animatorCamera.begin();
while(it != animatorCamera.end())
{
if( it->getType() == irr::scene::ESNAT_COLLISION_RESPONSE)
{
collisionResponse = static_cast<irr::scene::ISceneNodeAnimatorCollisionResponse *>(*it);
if(!collisionResponse->isFalling())
collisionResponse->setEllipsoidRadius(newradius);
}
it++;
}
return true;
}
Il y a certainement des erreurs, je suis à moitié endormi ^^, je n'ai pas essayé le code parce que je l'ai tapé directement dans mon post. Donc je te laisses corriger.