Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: freeze & app.Draw()  (Lu 2947 fois)

0 Membres et 1 Invité sur ce sujet

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
freeze & app.Draw()
« le: Septembre 28, 2012, 05:35:44 pm »
Voilà un petit moment que je bosse sur un projet et j'ai remarqué un problème avec l'affichage de mon animation d'explosion. Le chargement de l'image et la gestion de l'animation ne pose pas de problème mais à partir du moment où l'animation est affichée à l'écran, l'ensemble de l'application freeze pendant une fraction de seconde.

J'utilise les classes Animated, Anime et Frame trouvées ici http://www.sfml-dev.org/wiki/fr/sources/animation

Ca fonctionne évidemment correctement quand je fait un projet avec seulement cette animation mais je ne vois pas bien d'où vient le problème ici puisque tout le traitement sur l'animation et autour ne pose pas de problème  et seul la ligne app.Draw(*animation) fait freeze le jeu quand je la dé-commente.

Je ne vois pas trop quel code poster du coup, si jamais vous voulez des infos supplémentaire n'hésitez pas.

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : freeze & app.Draw()
« Réponse #1 le: Septembre 28, 2012, 07:18:17 pm »

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : freeze & app.Draw()
« Réponse #2 le: Septembre 28, 2012, 07:44:12 pm »
Me concernant ça le fait à chaque explosion, ce qui est très gênant dans un shooter vertical...

J'ai pas pensé à le tester sur un autre pc pour voir si le hardware posait problème. Je vais faire ça !

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : freeze & app.Draw()
« Réponse #3 le: Septembre 28, 2012, 09:35:49 pm »
Bon je confirme que le problème n’apparaît pas sur mon pc fixe... Question de performance ou question de carte graphique ?

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : freeze & app.Draw()
« Réponse #4 le: Septembre 28, 2012, 10:05:23 pm »
Oui c'est une question de performance , le codage doit avoir un problème qui est imperceptible avec un pc de bureau plus puissant.

Comment est écrit ta classe d'animation ?
Comment l'invoque tu dans ton main() ?

Sans code, personne ne pourra te répondre.

Hindi

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : Re : freeze & app.Draw()
« Réponse #5 le: Septembre 30, 2012, 11:21:50 am »
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.