Historique des modifications - Message

Message #10610

Sujet: S'accroupir Irrlicht


Type Date Auteur Contenu
Création du message 08-07-2012 12:44:47 johnplayer
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.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
510 invités en ligne
membre en ligne: -
RSS Feed