Historique des modifications - Message

Message #11634

Sujet: Système d'animation d'irrlicht


Type Date Auteur Contenu
Dernière modification 10-06-2015 22:05:26 jonath313
Je tiens à te remercier pour ton aide,

Actuellement mon code ressemble à çà :

Code c++ :

    
void CPlayer::SetPlayerAnimation(int NoAnim){
            switch(NoAnim){
                case 0:
                    AnimStand = true;
                    break;
                case 1:
                    AnimWalk = true;
                    break;
                case 2:
                    break;
                default:
                    AnimStand = false;
                    AnimWalk = false;
                    break;
            }
}

    void CPlayer::UpdatePlayerAnimation(){
   ///!--- Si le perso n'est pas dans un vehicule:
        if(IsInVehicule == false){
            if(AnimStand == false){
               //Pas traité
            }
            if(AnimWalk == false && goForward == true){
                ///NePlayer->setAnimationSpeed(10);
                NePlayer->setAnimationSpeed(50);
                NePlayer->setFrameLoop(0,80);
                AnimWalk = true;
                SfootStepActif = false;
            }
            if(AnimWalk ==true && goForward == false){
                NePlayer->setAnimationSpeed(0);
                NePlayer->setFrameLoop(0,0);
                AnimWalk = false;
               SfootStepActif = true;

            }
        }
        //!--- Sinon le perso est dans un vehicule:
        else{
            NePlayer->setAnimationSpeed(0);
            NePlayer->setFrameLoop(0,0);

        }
}

Seulement une seule animation peut être gérée correctement . Après si je veux faire une autre animation je dois faire des tests sur tous les cas et çà çà me plait pas.

J'ai essayé de converger vers quelque chose de plus structuré du genre :

Code c++ :

void CPlayer::setState(eAnimState newState)
{
   oldState = curState;
   curState = newState;
}
CPlayer::eAnimState CPlayer::getState()
{
   return curState;
}

void CPlayer::idle()
{
///NePlayer->animateJoints();
   setState(CPlayer::eAnimState::Idle);

   NePlayer->setAnimationSpeed(ANIMATION_SPEED);
   NePlayer->setLoopMode(true);
   NePlayer->setFrameLoop(90,113);
}

void CPlayer::walk()
{
   setState(CPlayer::eAnimState::Walk);

   NePlayer->setAnimationSpeed(ANIMATION_SPEED);
   NePlayer->setLoopMode(true);
   NePlayer->setFrameLoop(0,80);
}

Mais au final je me suis retrouvé avec le même problème -> complexité des tests if, j'ai seulement remplacé les booléens par des énumérations.

Je cherche à converger d'abord vers un moyen simple de jouer des animations les unes après les autres (j'utilise une manette xbox360 pc):

Stick gauche haut -> animation en cours = Anim avancer
Si je tire -> le personnage s’arrête et joue l'animation tirer
Si je relâche le bouton du tire et si j'ai laissé le stick gauche bloqué vers le haut, l'animation marcher se joue.

Après, j'aimerai ajouter le contrôle des bones pour que quand je tire et que je vise le bras se déplace mais que çà joue l'animation tirer quand même.

Je sais pas si j'ai été assez clair car c'est pas évident à expliquer. En gros je voudrais réussir à manager pleins d'animations frame sans avoir à utiliser des milliers de booléens et de tests if à rallonge. Il faut aussi que ce soit à ma porté niveau codage.

Un exemple de ce que je recherche à faire :
https://www.youtube.com/watch?v=77wfrXvOkIQ

Puis par la suite, arriver à quelque chose de plus fluide tel que:
https://www.youtube.com/watch?v=0ea-CXxBEYg
Création du message 10-06-2015 21:59:19 jonath313
Je tiens à te remercier pour ton aide,

Actuellement mon code ressemble à çà :

Code c++ :

    
void CPlayer::SetPlayerAnimation(int NoAnim){
            switch(NoAnim){
                case 0:
                    AnimStand = true;
                    break;
                case 1:
                    AnimWalk = true;
                    break;
                case 2:
                    break;
                default:
                    AnimStand = false;
                    AnimWalk = false;
                    break;
            }
}

    void CPlayer::UpdatePlayerAnimation(){
   ///!--- Si le perso n'est pas dans un vehicule:
        if(IsInVehicule == false){
            if(AnimStand == false){
               //Pas traité
            }
            if(AnimWalk == false && goForward == true){
                ///NePlayer->setAnimationSpeed(10);
                NePlayer->setAnimationSpeed(50);
                NePlayer->setFrameLoop(0,80);
                AnimWalk = true;
                SfootStepActif = false;
            }
            if(AnimWalk ==true && goForward == false){
                NePlayer->setAnimationSpeed(0);
                NePlayer->setFrameLoop(0,0);
                AnimWalk = false;
               SfootStepActif = true;

            }
        }
        //!--- Sinon le perso est dans un vehicule:
        else{
            NePlayer->setAnimationSpeed(0);
            NePlayer->setFrameLoop(0,0);

        }
}

Seulement une seule animation peut être gérée correctement . Après si je veux faire une autre animation je dois faire des tests sur tous les cas et çà çà me plait pas.

J'ai essayé de converger vers quelque chose de plus structuré du genre :

Code c++ :

void CPlayer::setState(eAnimState newState)
{
   oldState = curState;
   curState = newState;
}
CPlayer::eAnimState CPlayer::getState()
{
   return curState;
}

void CPlayer::idle()
{
///NePlayer->animateJoints();
   setState(CPlayer::eAnimState::Idle);

   NePlayer->setAnimationSpeed(ANIMATION_SPEED);
   NePlayer->setLoopMode(true);
   NePlayer->setFrameLoop(90,113);
}

void CPlayer::walk()
{
   setState(CPlayer::eAnimState::Walk);

   NePlayer->setAnimationSpeed(ANIMATION_SPEED);
   NePlayer->setLoopMode(true);
   NePlayer->setFrameLoop(0,80);
}

Mais au final je me suis retrouvé avec le même problème -> complexité des tests if, j'ai seulement remplacé les booléens par des énumérations.

Je cherche à converger d'abord vers un moyen simple de jouer des animations les unes après les autres (j'utilise une manette xbox360 pc):

Stick gauche haut -> animation en cours = Anim avancer
Si je tire -> le personnage s’arrête et joue l'animation tirer
Si je relâche le bouton du tire et si j'ai laissé le stick gauche bloqué vers le haut, l'animation marcher se joue.

Après, j'aimerai ajouter le contrôle des bones pour que quand je tire et que je vise le bras se déplace mais que çà joue l'animation tirer quand même.

Je sais pas si j'ai été assez clair car c'est pas évident à expliquer. En gros je voudrais réussir à manager pleins d'animations frame sans avoir à utiliser des milliers de booléens et de tests if à rallonge. Il faut aussi que ce soit à ma porté niveau codage.

Un exemple de ce que je recherche à faire :
https://www.youtube.com/watch?v=77wfrXvOkIQ

Puis par la suite, arriver à quelque chose de plus fluide tel que:
https://www.youtube.com/watch?v=0ea-CXxBEYg

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
241 invités en ligne
membre en ligne: -
RSS Feed