Historique des modifications - Message

Message #11678

Sujet: Système d'animation d'irrlicht


Type Date Auteur Contenu
Dernière modification 18-06-2015 20:14:40 Magun
uhm uhm smile
merci pour ce long post, avec de bonne explication et constructif ça fait plaisir

Enfait, je lance une animation en appuyant sur un bouton, si j'appui sur un autre bouton, une nouvelle animation se lance. Le souci est que si le bouton précédent reste appuyé, l'animation précédente devrait reprendre quand la nouvelle se termine :

très bien dans ce cas, j'en conclue que soit tu as un soucis avec la gestions de évènement (point #1)
soit unbind interfère totalement avec le fonctionnement voulue, et donc tu as raison sur ce que tu explique (point #2)

pour le point #1:
je te met les deux codes

Code c++ :


          if(event.eventype == irr::quelquechose_JOYSTIC)
          {
              int keys = event.blabla.State;
              anim.active(EAS_RUNNING, keys & 0b000001 && onGround);
              anim.active(EAS_SWIMMING, keys & 0b000001 && onWater);
              ... etc
              anim.active(EAS_ATTACKING, keys & 0b001000);
          }

Code c++ :


if(event.EventType == irr::EET_KEY_INPUT_EVENT ){
animat->activate(EAS_SWIMING, event.KeyInput.Key == irr::KEY_SPACE && event.KeyInput.PressedDown == true & 0b000001); // Fonctionne
animat->activate(EAS_RUNNING, event.KeyInput.Key == irr::KEY_KEY_Z && event.KeyInput.PressedDown == true & 0b000001); // Fonctionne pas
}

voila quelle est la grosse différence ?
et bien déjà je passe par le joystick et donc comme tu l'avais demander dans un autre topic
event.blabla.State détermine l'état des boutons, et leurs états reste actif tout au long de l’appuie (bit 1 boutton 1, bit 2 ... etc)
et donc quand je fait anim.active(EAS_RUNNING, keys & 0b000001 && onGround) le resultat ne change pas si une autre touche est impliquer
en ce qui concerne "&0b00001" c'est une simple opération binnaire que tu a recopier un peut "bêtement", ici "event.blabla.State" est un entier
en electronique tu utilise la même chose avec les portes "AND", donc keys & 0b00001 détermine si le bit 1 est a 1 c'est tout

tu comprendra aussi que dans ton code "&0b000001" est inutile ? true = 1 et "1 & 0b000001 = 1" c'est l'opération que tu fait !

or toi tu test sur event.KeyInput.Key, c'est un entier représentant une énumeration, donc une seul valeurs possible, pour preuve tu fait un test d'égalité
donc comme tu fait, l'un va s'activer, puis l'autre jamais les deux en même temps, logique ...
ce que tu doit faire donc c'est un truc du genre:

Code c++ :


if(event.EventType == irr::EET_KEY_INPUT_EVENT ){
	if(event.KeyInput.Key == irr::KEY_SPACE)
		animat->activate(EAS_SWIMING, event.KeyInput.PressedDown);
	if(event.KeyInput.Key == irr::KEY_KEY_Z)
		animat->activate(EAS_RUNNING, event.KeyInput.PressedDown);
}


donc pour le point #2:
Je devrais regarder si une autre animation est active, le cas échéant, lancer l'animation IDLE. çà implique un fonctionnement "inter-classe" si je puis me permettre d'appeler çà comme çà. Peut être que çà ne vient pas de là non-plus, je peux me planter, mais c'est une idée à laquelle j'ai réfléchie. Au niveau algorythmique çà donnerai :

oui tu as raison, mais dans ce cas, j'opterais simplement pour ne rien mettre dans unbind (excepter binded = false), et pour l'animation "IDLE" avoir une classe personnaliser
puisque effectivement lorsque tu fait des opération sur "NePlayer" elle désactive la précédente animation

Code c++ :

class IdleState : public AnimationBinder
{
	public:
		IdleState()
		{
			activated = true;
			bind();
		}
		virtual void bind()
		... etc
		virtual int priority()
		{
			return -99;
		}
};

pourquoi ? et bien déjà par ce que si aucune animation est active, celle-ci le resteras, et donc ce binderas en dernier
et finalement unbind ne réalisais que l'appelle a idle donc inutile

bon par contre je voie un autre soucis, c'est si tu utilise une animation en loop = false
que ce passe t'il lorsque l'animation ce finie ? ba rien, elle est toujours considéré comme active, donc comment le régler ?
barf, tu peut simplement faire une classes qui dérive de irr::scene::IAnimationEndCallBack, tu passe AnimationManager en temps que pointeur dans la constructeur de tas nouvelle class
tu le stock et dans OnAnimationEnd tu desactive ton animation, tu peut regarder JumpState comme exemple, je te laisse bidouiller un peut (ça te feras un peut d'exercice ... )
puis bon si tout fois tu n'y arrive pas je passerais voir ce qu'il en est

edit/ps:
bon par contre, tu fait de l'électronique, j'en est fait durant mais études, je vais voir quelle genre d'analogie je peut faire
mais honnêtement je n'en voie pas une grosse différence avec la programmations surtout quand on ce raproche des micro-controlleur & porte logique & module
Création du message 18-06-2015 20:09:25 Magun
uhm uhm smile
merci pour ce long post, avec de bonne explication et constructif ça fait plaisir

Enfait, je lance une animation en appuyant sur un bouton, si j'appui sur un autre bouton, une nouvelle animation se lance. Le souci est que si le bouton précédent reste appuyé, l'animation précédente devrait reprendre quand la nouvelle se termine :

très bien dans ce cas, j'en conclue que soit tu as un soucis avec la gestions de évènement (point #1)
soit unbind interfère totalement avec le fonctionnement voulue, et donc tu as raison sur ce que tu explique (point #2)

pour le point #1:
je te met les deux codes

Code c++ :


          if(event.eventype == irr::quelquechose_JOYSTIC)
          {
              int keys = event.blabla.State;
              anim.active(EAS_RUNNING, keys & 0b000001 && onGround);
              anim.active(EAS_SWIMMING, keys & 0b000001 && onWater);
              ... etc
              anim.active(EAS_ATTACKING, keys & 0b001000);
          }

Code c++ :


if(event.EventType == irr::EET_KEY_INPUT_EVENT ){
animat->activate(EAS_SWIMING, event.KeyInput.Key == irr::KEY_SPACE && event.KeyInput.PressedDown == true & 0b000001); // Fonctionne
animat->activate(EAS_RUNNING, event.KeyInput.Key == irr::KEY_KEY_Z && event.KeyInput.PressedDown == true & 0b000001); // Fonctionne pas
}

voila quelle est la grosse différence ?
et bien déjà je passe par le joystick et donc comme tu l'avais demander dans un autre topic
event.blabla.State détermine l'état des boutons, et leurs états reste actif tout au long de l’appuie (bit 1 boutton 1, bit 2 ... etc)
et donc quand je fait anim.active(EAS_RUNNING, keys & 0b000001 && onGround) le resultat ne change pas si une autre touche est impliquer
en ce qui concerne "&0b00001" c'est une simple opération binnaire que tu a recopier un peut "bêtement", ici "event.blabla.State" est un entier
en electronique tu utilise la même chose avec les portes "AND", donc keys & 0b00001 détermine si le bit 1 est a 1 c'est tout

tu comprendra aussi que dans ton code "&0b000001" est inutile ? true = 1 et "1 & 0b000001 = 1" c'est l'opération que tu fait !

or toi tu test sur event.KeyInput.Key, c'est un entier représentant une énumeration, donc une seul valeurs possible, pour preuve tu fait un test d'égalité
donc comme tu fait, l'un va s'activer, puis l'autre jamais les deux en même temps, logique ...
ce que tu doit faire donc c'est un truc du genre:

Code c++ :


if(event.EventType == irr::EET_KEY_INPUT_EVENT ){
	if(event.KeyInput.Key == irr::KEY_SPACE)
		animat->activate(EAS_SWIMING, event.KeyInput.PressedDown);
	if(event.KeyInput.Key == irr::KEY_KEY_Z)
		animat->activate(EAS_RUNNING, event.KeyInput.PressedDown);
}


donc pour le point #2:
Je devrais regarder si une autre animation est active, le cas échéant, lancer l'animation IDLE. çà implique un fonctionnement "inter-classe" si je puis me permettre d'appeler çà comme çà. Peut être que çà ne vient pas de là non-plus, je peux me planter, mais c'est une idée à laquelle j'ai réfléchie. Au niveau algorythmique çà donnerai :

oui tu as raison, mais dans ce cas, j'opterais simplement pour ne rien mettre dans unbind (excepter binded = false), et pour l'animation "IDLE" avoir une classe personnaliser
puisque effectivement lorsque tu fait des opération sur "NePlayer" elle désactive la précédente animation

Code c++ :

class IdleState : public AnimationBinder
{
	public:
		IdleState()
		{
			activated = true;
			bind();
		}
		virtual void bind()
		... etc
		virtual int priority()
		{
			return -99;
		}
};

pourquoi ? et bien déjà par ce que si aucune animation est active, celle-ci le resteras, et donc ce binderas en dernier
et finalement unbind ne réalisais que l'appelle a idle donc inutile

bon par contre je voie un autre soucis, c'est si tu utilise une animation en loop = false
que ce passe t'il lorsque l'animation ce finie ? ba rien, elle est toujours considéré comme active, donc comment le régler ?
barf, tu peut simplement faire une classes qui dérive de irr::scene::IAnimationEndCallBack, tu passe AnimationManager en temps que pointeur dans la constructeur de tas nouvelle class
tu le stock et dans OnAnimationEnd tu desactive ton animation, tu peut regarder JumpState comme exemple, je te laisse bidouiller un peut (ça te feras un peut d'exercice ... )
puis bon si tout fois tu n'y arrive pas je passerais voir ce qu'il en est

edit/ps:
bon par contre, tu fait de l'électronique, j'en est fait durant mais études, je vais voir quelle genre d'analogie je peut faire
mais honnêtement je n'en voie pas une grosse différence avec la programmations surtout quand on ce raproche des micro-controlleur & porte logique & module

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