Historique des modifications - Message

Message #11644

Sujet: Système d'animation d'irrlicht


Type Date Auteur Contenu
Dernière modification 12-06-2015 21:35:48 jonath313
J'ai fais des modifs :

Code c++ :


#ifndef CPLAYERANIMATION_H
#define CPLAYERANIMATION_H

#include <irr/irrlicht.h>

class AnimationBinder

{
    public:
        virtual void bind() = 0;
        virtual void unbind() = 0;
        virtual int priority() = 0;

        bool operator < (AnimationBinder *other)
        {
            return priority() < other->priority();
        }

        bool activated;
        bool binded;
};

class AnimationManager
{
    public:
        AnimationManager()
        {
            anim.push_back(new "?");
            ///...
            anim.sort();
        }
        void activate(int animNumber, bool value)
        {
            auto current = anim[animNumber];
            current->activated = value;

            if(current->binded && !value)
                current->unbind();

            current = anim[0];
            for(auto it : anim)
                if(current < it && it.activated)
                    current = it;

            if(current->activated && !current->binded)
                current->bind();
        }
    private:
        irr::core::array<AnimationBinder*> anim;
};


class RunningState : public AnimationBinder
{
    public:
        virtual void bind()
        {
           binded = true;
         /*  NePlayer->setAnimationSpeed(ANIMATION_SPEED);
           NePlayer->setLoopMode(true);
           NePlayer->setFrameLoop(0,80);*/
        }
        virtual void unbind()
        {
           binded = false;
          /* NePlayer->setAnimationSpeed(ANIMATION_SPEED);
           NePlayer->setLoopMode(false);
           NePlayer->setFrameLoop(0,0);*/
        }
        virtual int priority()
        {
            return 0;
        }
};

#endif // CPLAYERANIMATION_H



Après j'ai beau insister mais j'ai même pas d'idée pour completer le code... Alors trouver les réponses ne doit pas être de mon ressort au niveau programmation. J'ai l'impression que peut de personnes se sont lancer sur ce sujet, ce qui est sûr c'est que ce n'est pas simple.

Désolé de "traîner" la patte mais je fais ce que je peux, j'ai résolu pas mal de problêmes sur des sujets auxquels je t'ai sollicité mais plus j'avance et plus les interrogations deviennent complexes.

...Sinon j'ai eu une inspiration en regardant des videos ...
Vue que je dispose d'un piètre niveau d'inspiration à ce sujet, pourrait-on le faire comme ceci :

Code c++ :


CPlayer::CPlayer(ISceneManager *smgr){
     IAnimatedMesh* mesh = smgr->getMesh("Player.B3D");
     playerNode = smgr->addAnimatedMeshSceneNode(mesh);
     currentAnimation = IDLE_ANIM_PLAYER;
}

void CPlayer::setAnimation(PlayerAnimation animation){
    if(currentAnimation  != animation){
       currentAnimation  = animation;

       switch(animation){
                 case IDLE_ANIM_PLAYER:
                           playerNode -> setFrameLoop(0,80); 
                           playerNode -> setCurrentFrame(0); 
                           break;
                 case RUN_ANIM_PLAYER:
                           playerNode -> setFrameLoop(80,120); 
                           playerNode -> setCurrentFrame(80); 
                           break;
                 case ATTACK_ANIM_PLAYER:
                           playerNode -> setFrameLoop(120,160); 
                           playerNode -> setCurrentFrame(120); 
                           break;
        };
     }
}
Création du message 12-06-2015 21:16:47 jonath313
J'ai fais des modifs :

Code c++ :


#ifndef CPLAYERANIMATION_H
#define CPLAYERANIMATION_H

#include <irr/irrlicht.h>

class AnimationBinder

{
    public:
        virtual void bind() = 0;
        virtual void unbind() = 0;
        virtual int priority() = 0;

        bool operator < (AnimationBinder *other)
        {
            return priority() < other->priority();
        }

        bool activated;
        bool binded;
};

class AnimationManager
{
    public:
        AnimationManager()
        {
            anim.push_back(new "?");
            ///...
            anim.sort();
        }
        void activate(int animNumber, bool value)
        {
            auto current = anim[animNumber];
            current->activated = value;

            if(current->binded && !value)
                current->unbind();

            current = anim[0];
            for(auto it : anim)
                if(current < it && it.activated)
                    current = it;

            if(current->activated && !current->binded)
                current->bind();
        }
    private:
        irr::core::array<AnimationBinder*> anim;
};


class RunningState : public AnimationBinder
{
    public:
        virtual void bind()
        {
           binded = true;
         /*  NePlayer->setAnimationSpeed(ANIMATION_SPEED);
           NePlayer->setLoopMode(true);
           NePlayer->setFrameLoop(0,80);*/
        }
        virtual void unbind()
        {
           binded = false;
          /* NePlayer->setAnimationSpeed(ANIMATION_SPEED);
           NePlayer->setLoopMode(false);
           NePlayer->setFrameLoop(0,0);*/
        }
        virtual int priority()
        {
            return 0;
        }
};

#endif // CPLAYERANIMATION_H



Après j'ai beau insister mais j'ai même pas d'idée pour completer le code... Alors trouver les réponses ne doit pas être de mon ressort au niveau programmation. J'ai l'impression que peut de personnes se sont lancer sur ce sujet, ce qui est sûr c'est que ce n'est pas simple.

Désolé de "traîner" la patte mais je fais ce que je peux, j'ai résolu pas mal de problêmes sur des sujets auxquels je t'ai sollicité mais plus j'avance et plus les interrogations deviennent complexes.

...Sinon j'ai eu une inspiration en regardant des videos ...
Vue que je dispose d'un piètre niveau d'inspiration à ce sujet, pourrait-on le faire comme ceci :

Code c++ :


CPlayer::CPlayer(ISceneManager *smgr){
     IAnimatedMesh* mesh = smgr->getMesh("Player.B3D");
     playerNode = smgr->addAnimatedMeshSceneNode(mesh);
     currentAnimation = IDLE_ANIM_PLAYER;
}

void CPlayer::setAnimation(PlayerAnimation animation){
    if(currentAnimation  != animation){
       currentAnimation  = animation;

       switch(animation){
                 case IDLE_ANIM_PLAYER:
                           playerNode -> setFrameLoop(0,80); 
                           playerNode -> setCurrentFrame(0); 
                           break;
                 case RUN_ANIM_PLAYER:
                           playerNode -> setFrameLoop(80,120); 
                           playerNode -> setCurrentFrame(80); 
                           break;
                 case ATTACK_ANIM_PLAYER:
                           playerNode -> setFrameLoop(120,160); 
                           playerNode -> setCurrentFrame(120); 
                           break;
        };
     }
}

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