Comment est écrit ta classe d'animation ?
J'ai mis dans mon premier poste un lien vers les classes que j'utilise pour mes animations. Je n'ai pas écris ces classes moi même.
Comment l'invoque tu dans ton main() ?
Ce n'est pas directement dans le main, c'est un petit peu plus compliqué que ça...
Ma classe Enemy hérite de Unit. La création de l'animation d'explosion se fait dans le constructeur de Unit. de la manière suivante :
//Création de l'animation de l'animation et chargement de l'image
m_animatedExplosion = new Animated();
imageExplosion = new Image();
*imageExplosion = m_imageManager.getImage("images/explosion1.png");
//Je découpe l'image en frame que j'ajoute à l'objet Anim
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(0, 0, EXPLOS_WIDTH, EXPLOS_HEIGHT) ));
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH, 0, EXPLOS_WIDTH*2, EXPLOS_HEIGHT) ));
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*2, 0, EXPLOS_WIDTH*3, EXPLOS_HEIGHT) ));
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*3, 0, EXPLOS_WIDTH*4, EXPLOS_HEIGHT) ));
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*4, 0, EXPLOS_WIDTH*5, EXPLOS_HEIGHT) ));
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*5, 0, EXPLOS_WIDTH*6, EXPLOS_HEIGHT) ));
m_animExplosion.PushFrame(Frame(imageExplosion, sf::Rect<int>(EXPLOS_WIDTH*6, 0, EXPLOS_WIDTH*7, EXPLOS_HEIGHT) ));
//J'associe les frame à l'animation avec quelques détails en plus.
m_animatedExplosion->SetAnim(&m_animExplosion);
m_animatedExplosion->SetLoop(false);
m_animatedExplosion->SetFrameTime(0.07f);
m_animatedExplosion->SetPosition(m_position.x, m_position.y);
Ma liste d'ennemis est géré par une classe population qui els fait apparaître / bouger / tirer / mourir. Quand un ennemi n'a plus de points de vie, il est copié dans une liste d'ennemis morts : le sprite de l'ennemis n'est plus dessiné et laisse place à l'animation d'explosion. Voilà comment c'est appelé :
void Population::manageExplosion()
{
if(!m_deadEnemies.empty())
{
short currentFrame;
list<Enemy*>::iterator lit(m_deadEnemies.begin());
for(; lit!=m_deadEnemies.end();lit++)
{
//Si l'animation est en pause
if((*lit)->getAnimationExplosion()->IsPaused())
(*lit)->getAnimationExplosion()->Play();//On relance l'animation
//On récupère le numéro de l'image qui est affichée
currentFrame = (*lit)->getAnimationExplosion()->GetCurrentFrame();
//On positionne l'animation sur l'ennemi qui a explose
(*lit)->getAnimationExplosion()->SetPosition((*lit)->getPositionAxis(0)-((*lit)->getExploWidth()/2), (*lit)->getPositionAxis(2)-((*lit)->getExploHeight()/2)+30);
//On dessine l'explosion
(*lit)->drawExplosion();
//Si l'image actuelle correspond à la dernière image de l'animation
if(currentFrame == (*lit)->getAnimationExplosion()->GetAnim()->Size()-1)
{
lit = m_deadEnemies.erase(lit);//On détruit l'objet ennemi
}
}
}
}
Je viens de réaliser que j'utilise une liste ici alors qu'un Vector correspondrait mieux, je vais modifier ça.
Voilà voilà, si tu as besoin de plus d'information sur une partie du code n'hésite pas à demander.