Historique des modifications - Message

Message #11683

Sujet: Système d'animation d'irrlicht


Type Date Auteur Contenu
Création du message 19-06-2015 19:39:57 jonath313
Bon je me suis arraché pas mal de cheveux pour trouver un cas que je ne traite pas pour le moment. Déjà il y a quelque chose de sûr, avant de dire que le priorité est inéfficace, il faudrait qu'elle soit rafraichie au bon moment... Pour une foi que je suis sûr de quelque chose smile

Je t'explique :
Pour le moment, quand j'appui sur un bouton de la manette je bind une animation, elle se joue, pas de soucis.
J'appui sur un autre bouton , une autre animation se joue, tout va bien, c'est ce qu'on veut.

J'ai visualisé la valeur de la priorité au moment du bind() et au moment du unbind() et voici ce qu'il se passe :
Quand j'appui sur le bouton("marcher" -> priorité = 10) au moment de l'appui je bind() donc je vois s'afficher 10, tout va bien.
Je laisse appuyé le bouton marcher et maintenant j'appui sur sauter (priorité = 2) et là l'animation sauter se lance alors que marcher est active (on voit sur la console 2 qui s'affiche pour la priorité). Déjà là j'ai vue qu' il y a quelque chose qui ne va pas et c'est logique en même temps car dans le code si j'active une animation, j'écrase la priorité sans vérifier avant si elle est supérieure.

Après, je pense que la priorité devrait aussi être rafraîchi au moment du unbind() car ensuite j'ai relâché le bouton sauter en gardant toujours marcher appuyer et là j'ai vue sur la console "2" -> qui correspond à la priorité de sauter (normal vue que je rafraîchi la priorité que quand j'active et non quand je désactive).

Bon, ce poste m'a permis de poser le problème et prendre du recul, je pense avoir déniché ce qui me convient pas.

Donc du coups, j'ai compris que quand on jouait les frames 0,0 dans unbind(), on forçait le node sur cette animation.

Après niveau code j'ai pas changé grand chose, j'essai d'utiliser GenericState, plutôt que de créer une nouvelle classe IdleState.
Dans ma classe application je test les événements comme ceci:

Code c++ :


           if(event.JoystickEvent.Joystick == 0){   /*Si c'est la manette du player 1 ...*/
               //!--- Position du personnage:
               player1.SetPlayerState(event.JoystickEvent.Axis[1] <  -5000,     //! STICK GCHE => AVANCER
                                      event.JoystickEvent.Axis[1] >  5000,      //! STICK GCHE => RECULER
                                      event.JoystickEvent.IsButtonPressed(0));  //! BOUTON A => SAUTER
...
}

Dans ma classe player je fais :

Code c++ :


 void CPlayer::LoadPersoPhysics(video::IVideoDriver* driver,scene::ISceneManager* smgr,btDiscreteDynamicsWorld *mWorld, btAxisSweep3 *sweep,int ID){
 //Load du mesh ...
 ...
 animati = new AnimationManager(NePlayer);
 animati->activate(EAS_IDLE, true /*& 0b000001*/);
}

void CPlayer::SetPlayerState(bool Forward, bool Backward,bool Jump){
            if(Forward == true) goForward = true;
            else goForward = false;

            if(Backward == true) goBackward = true;
            else goBackward = false;

            if(Jump == true) goJump = true;
            else goJump = false;
}

void CPlayer::UpdatePlayerAnimation(){
        animati->activate(EAS_RUNNING, goForward);
        animati->activate(EAS_SWIMING,goJump);
}

    void CPlayer::UpdatePlayer(ICameraSceneNode *camera,
                               scene::ISceneManager* smgr,
                               irrklang::ISoundEngine* SoundEngine,
                               f32 TimeElap,
                               btVector3 Position,
                               btVector3 Rotation,
                               int hitState,
                               bool EnnemiIsAttackin)
{
            /*Update des Animations du personnage*/
            UpdatePlayerAnimation();

            /*Update de la position Rotation du personnage*/
            UpdatePersoDeplacement(camera,smgr,TimeElap);

            /*Update de la position Rotation de la camera personnage*/
            UpdateCameraMovement(camera,smgr,TimeElap);

            /*Update par rapport au vehicule*/
            ///UpdatePlayerInVehicule(Position,Rotation);

            /*Update si le player est touché par l'ennemi*/
            ///UpdateTestIFPlayerTouched(hitState, EnnemiIsAttackin);

            /*Update des sons du player*/
            ///UpdatePlayerSound(SoundEngine);
    }


Voila c'est pas glorieux mais je fais comme je peux smile

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