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

Auteur Sujet: Création de classes pour le graphique, problèmes de textures et de clock  (Lu 2329 fois)

0 Membres et 1 Invité sur ce sujet

Saphirant

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Bonjour,
Je viens poster sur ce forum pour essayer de trouver des solutions et de comprendre ce que je fais mal. Il existe peut être des réponses similaires à mon problèmes, n'hésitez pas à me les linker, je ne sais juste pas quoi chercher pour les trouver.
Ensuite voilà mes problèmes:
-J'essaye de réaliser un jeu, pour cela je créer une classe spéciale pour gérer les animations. Cette classe hérite sf::Drawable et de sf::Transformable pour pouvoir l'afficher à l'écran. La fonction virtual draw est juste copiée depuis le tutoriel (aucune modification). Cette classe est composée d'une liste d'image, chaque image étatnt une frame de la texture. Ce que je fais est, quand j'appelle une fonction, si un certain est écoulé (temps entre deux frame), je change la frame a affiché. Pour cela, j'ai un nombre qui me permet de choisir la bonne image dans la liste, puis j'update la texture avec la fonction en question. Cependant cela ne fonctionne pas, rien n'est affiché à l'écran.
Mon deuxième problème est pour gérer le delai entre deux frame. Pour cela, je déclare une Clock spécifique à ma classe, que je restart à chaque fois qu'une animation passe. Cependant, cette clock ne restart jamais.
Voila à quoi resemble ma fonction update de ma classe animation (Dans le main, pour l'affichage, j'appelle la fonction update puis draw)
//m_clock étant la clock créer pour gérer le temps, m_delay le temps entre deux animation et
//m_frame** les différents liste comprenant les image des animations (une pour chaque direction)
void Animation::update()
{
        if (m_clock.getElapsedTime().asMilliseconds() >= m_delay) {

                m_clock.restart();

                m_index++;
                if (m_index < m_frame)
                        m_index = 0;


                switch (m_dir)
                {
                case 0:
                        m_texture.update(m_frameUP[m_index]);
                        break;
                case 1:
                        m_texture.update(m_frameRI[m_index]);
                        break;
                case 2:
                        m_texture.update(m_frameDO[m_index]);
                        break;
                case 3:
                        m_texture.update(m_frameLE[m_index]);
                        break;

                default:
                        m_texture.update(m_frameUP[m_index]);
                        break;
                }

        }



}

Qu'est-ce qui ne marche pas dans ce code? Est-ce la bonne solution pour faire des animations (utilisés des liste d'image) ou est-ce qu'il y a une autre solution?
Merci d'avance pour vos réponses et vos indications,
Saphirant

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #1 le: Juillet 03, 2017, 12:07:03 pm »
Le morceau de code que tu montres semble correct. Le problème doit venir d'ailleurs. Tu devrais essayer de nous montrer un code complet minimal qui reproduit le problème.

Ensuite, ta façon de gérer les animations est la pire possible, n'hésite pas à t'inspirer des nombreux exemples que tu pourras facilement trouver sur le forum, le wiki, les bibliothèques tierces pour SFML, etc. ;)
Laurent Gomila - SFML developer

Saphirant

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #2 le: Juillet 03, 2017, 12:26:10 pm »
Merci pour ta réponse, je regarderais pour d'autre façons de faire des animations. Ensuite le code de ma classe ressemble à ceci:
-constructeur (on spécifie le chemin des fichiers, le nombre de frame, le délai)
dedans on charge toutes les images (selon le chemin spécifié) et on mets ces images dans les listes (des vector<sf::Image>)
Voila le code de chargement des images:
for (int i = 0; i < 4; i++) { //on répète pour les 4 directions
                for (int j = 0; j < m_frame; j++) { //pour toutes les frames
                        sf::Image img;
                        if (i == 0) { //selon la direction, cela change l'image à charger
                                if (!img.loadFromFile(m_path + "UP_0" + std::to_string(j) + ".png"))
                                        std::cout << "Error loading character" << std::endl;

                                m_frameUP.push_back(img);
                        }
                        if (i == 1) {
                                if (!img.loadFromFile(m_path + "RI_0" + std::to_string(j) + ".png"))
                                        std::cout << "Error loading character" << std::endl;

                                m_frameRI.push_back(img);
                        }
                        if (i == 2) {
                                if (!img.loadFromFile(m_path + "DO_0" + std::to_string(j) + ".png"))
                                        std::cout << "Error loading character" << std::endl;

                                m_frameDO.push_back(img);
                        }
                        if (i == 3) {
                                if (!img.loadFromFile(m_path + "LE_0" + std::to_string(j) + ".png"))
                                        std::cout << "Error loading character" << std::endl;

                                m_frameLE.push_back(img);
                        }


                }
        }

        if(!m_texture.create(m_size.x, m_size.y)) //on créer la texture pour pouvoir lui mettre une image après
                std::cout << "Error loading character" << std::endl;
La fin de la classe est uniquement composé de la focntion virtual draw, reprise du tutoriel correspondant.
Pour la clock qui ne redémarre pas, en passant comme argument une référence de la clock fonctionne, cependant ce n'est plus une clock interne à l'animation dans ce cas.
Ensuite dans le main, on initalise l'animation, et dans la boucle principale, on appelle la fonction update (détaillé dans le poste au dessus) puis window.draw(animation) pour l'afficher.
J'espère avoir été plus clair,
Saphirant

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #3 le: Juillet 03, 2017, 12:40:56 pm »
Ce code n'est ni complet ni minimal. Enfin bref. On va essayer de tatônner ;)

Comment gères-tu la ou les instance(s) de la classe Animation (création, stockage, utilisation), dans le main ?
Laurent Gomila - SFML developer

Saphirant

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #4 le: Juillet 03, 2017, 12:56:34 pm »
Désolé, je n'ai pas bien compris la demande en effet. Je vais faire des pastebins pour le main et la classe animation:
-main: https://pastebin.com/kFa2pvxh
-Animation.h: https://pastebin.com/WiGx8AbQ
-Animation.ccp: https://pastebin.com/b8EA1epp
Il reste encore une autre classe, mais qui n'est pas importante ici je pense (la classe du personnage, par lequel je veux faire passer mes animations, mais j'essaye déjà sans).
J'initialise donc mon animation dans le main ligne 41 avec comme arguemnst: le nom du personnage, le type de l'animation, la direction (0 = haut, 1 = droite, etc.), le nombre de frame de mon animation, le délai entre les animations et enfin la taille de l'image.

Après quelque recherche je pense utilisé ceci : https://github.com/SFML/SFML/wiki/Source:-AnimatedSprite,mais j'aimerais tout de même comprendre d'où vienne mes erreurs. Merci pour ton aide,
Saphirant

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #5 le: Juillet 03, 2017, 01:37:33 pm »
Citer
states.texture = &m_texture;
target.draw(m_sprite, states);

Ce n'est pas la bonne façon de faire. Pour affecter une texture à ton sprite, appelle simplement m_sprite.setTexture. Tu n'as besoin de le faire qu'une seule fois à l'initialisation, par contre si la taille de la texture change après un update n'oublie pas d'appeler m_sprite.setTextureRect pour donner la nouvelle taille (mais ça n'a pas l'air d'être le cas pour toi).
Laurent Gomila - SFML developer

Saphirant

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #6 le: Juillet 03, 2017, 01:50:07 pm »
En effet, cela s'affiche bien maintenant, merci beaucoup pour l'aide.
Cependant j'ai un deuxième problème avec une clock. En effet, je la déclare en tant qu'attribut de ma classe Animation, puis dans la fonction update je la compare avec un temps donné, avant d’appeler la fonction restart() pour la remettre à 0 (ça me permet de voir si le temps entre les animations se sont déroulés). Cependant, la fonction restart() ne semble pas marcher, car quand j'affiche le temps passé par la clock, il ne fait qu'augmenté.
Dans Animation.h, déclarés en private:
sf::Clock m_clock
Puis dans Animation.ccp, dans la fonction update():
if (m_clock.getElapsedTime().asMilliseconds() >= m_delay) {

                m_clock.restart();
                //La clock ne se réinitialise pas, lorsqu'on affiche le temps écoulé
 
Cependant, si je transforme un peu la fonction update, en utilisant une clock externe à l'objet:
void Animation::update(sf::Clock &clock)
{
        if (clock.getElapsedTime().asMilliseconds() >= m_delay) {

                clock.restart();
Cela fonctionne, cependant, je suis obligé d'avoir une clock pour gérer cela.
Saphirant

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #7 le: Juillet 03, 2017, 02:37:21 pm »
Ca devrait bien fonctionner, tu dois avoir un problème ailleurs.
Laurent Gomila - SFML developer

Saphirant

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re: Création de classes pour le graphique, problèmes de textures et de clock
« Réponse #8 le: Juillet 03, 2017, 02:45:22 pm »
D'accord, merci pour tes réponses, ca m'a bien aidé a avancé.
Saphirant