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

Auteur Sujet: Déplacement sprite animé - C++  (Lu 10927 fois)

0 Membres et 1 Invité sur ce sujet

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Déplacement sprite animé - C++
« le: Décembre 07, 2013, 10:24:19 pm »
Bonjour à tous et à toutes je suis le petit nouveau ^^ Bon comme premier post je ne fais pas dans l'original je viens vous demander de l'aide... (De l'aide concernant ?)Je suis en train d'essayer de faire une méthode d'une classe Personnage permettant au joueur de se déplacer dans quatre directions (gauche, droite, en-haut, en-bas). Cependant vous vous en doutez sans quoi j'aurai jamais créé ce post, mon code ne fonctionne pas :(
Voici la déclaration de la méthode :
void move(sf::Event event, sf::RenderWindow &app);
 

Et voilà la méthode :
void Personnage::move(sf::Event event, sf::RenderWindow &app) //Méthode de déplacement
{
    switch(event.type)
    {
        case sf::Event::KeyPressed:
            if(event.key.code == sf::Keyboard::Left){
                sf::Clock clock;
                sf::Time time;
                time = clock.restart();
                float sec = time.asSeconds();
                if(sec <= 0.15f){
                    m_sprite.setTextureRect(sf::IntRect(96, 48, 32, 48));
                }else if(sec >= 0.30f){
                    m_sprite.setTextureRect(sf::IntRect(64, 48, 32, 48));
                }else if(sec >= 0.45f){
                    m_sprite.setTextureRect(sf::IntRect(96, 48, 32, 48));
                }
                time = clock.restart();
                m_sprite.move(sf::Vector2f(-1, 0));
            }else if(event.key.code == sf::Keyboard::Right){
                m_sprite.setTextureRect(sf::IntRect(0, 96, 32, 48));
                m_sprite.move(sf::Vector2f(1, 0));
            }else if(event.key.code == sf::Keyboard::Up){
                m_sprite.setTextureRect(sf::IntRect(0, 144, 32, 48));
                m_sprite.move(sf::Vector2f(0, -1));
            }else if(event.key.code == sf::Keyboard::Down){
                m_sprite.setTextureRect(sf::IntRect(0, 0, 32, 48));
                m_sprite.move(sf::Vector2f(0, 1));
            }
        break;
    }
    app.draw(m_sprite);
}
Merci d'avance pour l'aide et l'attention que vous avez porté à ce post,
Cordialement Bilt

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Déplacement sprite animé - C++
« Réponse #1 le: Décembre 07, 2013, 10:56:47 pm »
Je te confirme qu'on a fait mieux comme premier post. Déjà tu postes dans le forum du binding C, je vois vraiment pas le rapport (et en plus tu mets bien "C++" dans le titre, là c'est limite de la provoc' ;D).

Ensuite, "mon code ne fonctionne pas" c'est vraiment le pire truc que tu puisses dire sur un forum. Tu te doutes bien que ça ne va pas nous avancer à grand chose, et qu'il faut un minimum de détail si tu veux qu'on t'aide.

Bon et pour terminer ton code comporte de grosses erreurs, mais je ne te dirais pas lesquelles tout de suite pour te laisser le temps de rattraper tes erreurs de "petit nouveau" :P
Laurent Gomila - SFML developer

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #2 le: Décembre 07, 2013, 11:11:37 pm »
Désolé je pensais de le forum C comportait tous les C(C#, C++, etc...) ^^
Hum... Mes erreurs disons que ça fait un petit moment que je taff sur ce code je suis pratiquement sûr que la solution vient du fait que les conditions sont mal implémenté avec le temps en fonction de la boucle. Enfin j'attends tout de même un petit indice pour me sortir de ce mauvais pas ;) (clin d’œil complice).
En gros pour vous résumer se qui ne fonctionne pas dans ma méthode c'est que la déplacement se faire sans soucis mais l'animation pas du tout... J'ai essayé de faire de multiple essaie sur la direction de gauche comme vous pouvez le constater mais sans résultat l'animation bloque à son début car la boucle recommencer l'horloge tout le temps. Or je suis bloqué précisément à cet endroit.
Encore désolé pour le peu d'information que j'avais fourni et le mauvais "postage".
Cordialement Bilt

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Déplacement sprite animé - C++
« Réponse #3 le: Décembre 08, 2013, 08:17:04 am »
Citer
Désolé je pensais de le forum C comportait tous les C(C#, C++, etc...)
Les forums de la dernière catégorie concernent les bindings (SFML dans d'autres langages). Pour les demandes d'aide sur l'API de base (C++), il y a tous les forums de la catégorie du milieu, un pour chaque module + un pour les problèmes généraux.

Citer
Hum... Mes erreurs disons que ça fait un petit moment que je taff sur ce code je suis pratiquement sûr que la solution vient du fait que les conditions sont mal implémenté avec le temps en fonction de la boucle. Enfin j'attends tout de même un petit indice pour me sortir de ce mauvais pas

Citer
                sf::Clock clock;
                sf::Time time;
                time = clock.restart();
                float sec = time.asSeconds();
Tu crées une clock puis mesure le temps écoulé depuis sa création. Tu ne penses pas que ça te donnera toujours 0 ? ;)
Laurent Gomila - SFML developer

FeelZoR

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #4 le: Décembre 08, 2013, 12:30:25 pm »
Juste je ne suis pas sûr, mais clock.restart() ne remettrais pas clock à 0 ??? Je dis peut-être une connerie ça fait longtemps que j'ai pas utilisé le temps en C++/SFML... donc je ne suis pas très avancé là-dessus. Il ne serait pas plus juste de faire time = clock ??? Je ne suis pas sûr, donc j'attends confirmation de votre part, Laurent.
Débutant en C++ et SFML, qui tente tant bien que mal de se frayer un chemin parmi tous ces bons développeurs pour un jour (peut-être ?) être bon et pouvoir aider à son tour.

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #5 le: Décembre 08, 2013, 01:33:20 pm »
Dans la documentation il est dis :
Citer
Notez que restart renvoie également le temps écoulé, de façon à éviter le tout petit écart de temps qui existerait si vous aviez à appeler getElapsedTime explicitement avant restart.
J'ai essayé de faire ceci :
void Personnage::move(sf::Event event, sf::RenderWindow &app) //Méthode de déplacement
{
    sf::Clock clock;
    sf::Time time;
    switch(event.type)
    {
        case sf::Event::KeyPressed:
            if(event.key.code == sf::Keyboard::Left){
                time = clock.getElapsedTime();
                float sec = time.asSeconds();
Cependant je rencontre toujours le même problème :/
Cordialement Bilt

FeelZoR

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #6 le: Décembre 08, 2013, 01:54:35 pm »
sf::Clock clock;
sf::Time time = clock.restart();
bool isFinish = false;
while(!isFinish)
{
    time = clock.getElapsedTime();
    if (time.asSeconds() >= 1)
    {
        isFinish = true;
    }
}
 

Adapte ce code à tes besoins, inutile de créer un float qui a pour valeur time.asSeconds(); ça utilise de la mémoire pour rien...
Débutant en C++ et SFML, qui tente tant bien que mal de se frayer un chemin parmi tous ces bons développeurs pour un jour (peut-être ?) être bon et pouvoir aider à son tour.

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #7 le: Décembre 08, 2013, 02:22:56 pm »
Oui c'est vrai que pour le côté mémoire c'est un must mais franchement ça ne change rien au côté fonctionnel dans le cas présent ^^'

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #8 le: Décembre 08, 2013, 06:07:16 pm »
Up ! (Désolé pour le double post)
Citer
Tu crées une clock puis mesure le temps écoulé depuis sa création. Tu ne penses pas que ça te donnera toujours 0 ? ;)
En effet j'ai affiché le temps dans la fenêtre de console quand je déplace le joueur vers la gauche ça affiche continuellement 0 comme valeur mais alors comment faire ?
Avec JB_les_amis on a un peu trifouillé le code sur skype sans résultat convenable :(
Voici le code à l'heure actuel :
void Personnage::mooving(sf::Event event, sf::RenderWindow &app) //Méthode de déplacement
{
    sf::Clock clock;
    switch(event.type)
    {
        case sf::Event::KeyPressed:
            sf::Time time = clock.getElapsedTime();
            if(event.key.code == sf::Keyboard::Left){
                if(time.asMilliseconds() <= 250){
                std::cout << time.asMilliseconds() << std::endl;
                    m_sprite.setTextureRect(sf::IntRect(96, 48, 32, 48));
                }else if(time.asMilliseconds() >= 500){
                    m_sprite.setTextureRect(sf::IntRect(64, 48, 32, 48));
                }else if(time.asMilliseconds() >= 750){
                    m_sprite.setTextureRect(sf::IntRect(96, 48, 32, 48));
                }
                m_sprite.move(sf::Vector2f(-1, 0));
            }else if(event.key.code == sf::Keyboard::Right){
                m_sprite.setTextureRect(sf::IntRect(0, 96, 32, 48));
                m_sprite.move(sf::Vector2f(1, 0));
            }else if(event.key.code == sf::Keyboard::Up){
                m_sprite.setTextureRect(sf::IntRect(0, 144, 32, 48));
                m_sprite.move(sf::Vector2f(0, -1));
            }else if(event.key.code == sf::Keyboard::Down){
                m_sprite.setTextureRect(sf::IntRect(0, 0, 32, 48));
                m_sprite.move(sf::Vector2f(0, 1));
            }
        break;
    }
    app.draw(m_sprite);
}
Amicalement Bilt
« Modifié: Décembre 08, 2013, 07:00:14 pm par Bilt »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Déplacement sprite animé - C++
« Réponse #9 le: Décembre 08, 2013, 06:42:20 pm »
Ta clock est créé à chaque appel de la fonction. Donc elle repart à zéro à chaque appel. Il faut la déclarer dans une portée un peu plus conséquente, afin qu'elle reste en vie entre deux appels de la fonction.
Laurent Gomila - SFML developer

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #10 le: Décembre 08, 2013, 06:45:18 pm »
J'y ai pensé et j'ai pris les devant en la créant dans le main je vais réessayé et je viens répondre
Merci à toi, cordialement Bilt
Ps : Si ça fonctionne je te ferai mille bisous :p

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #11 le: Décembre 08, 2013, 07:25:57 pm »
Bon pour le temps tout est bon mais je pense que je me suis un peu pommé là dedans xD
            if(event.key.code == sf::Keyboard::Left){
                if(time.asMilliseconds() <= 250 && time.asMilliseconds() <= 500){
                    m_sprite.setTextureRect(sf::IntRect(32, 48, 32, 48));
                }else if(time.asMilliseconds() >= 500 && time.asMilliseconds() <= 750){
                    m_sprite.setTextureRect(sf::IntRect(64, 48, 32, 48));
                }else if(time.asMilliseconds() >= 750){
                    m_sprite.setTextureRect(sf::IntRect(96, 48, 32, 48));
                }
                m_sprite.move(sf::Vector2f(-1, 0));
                clock.restart();
            }
 
Donc je vais expliquer un peu mon code pour vous donner un peu se que je veux obtenir. En gros si le joueur appuie sur le touche de gauche et que le temps de pression est compris en 250 millisecondes et 500 millisecondes alors j'affiche la première frame, sinon si le temps est compris entre 500 millisecondes et 750 millisecondes j'affiche la suite de l'animation et au final si le temps est supérieux à 750 millisecondes j'affiche le reste (Je sais que le code est pas optimiser mais je veux déjà partir sur ça). Cependant l'animation ne se fait pas je pense qu'il faut faire quelque chose comme ça :
si temps(entre 250 et 500){
=>anim1
    si temps(entre 500 et 750){
         =>anim2
         si temps(sup à 700){
               =>fin anim
         }
    }
}
(Le code reste à être optimisé mais autant faire les choses dans l'ordre)
Merci à tous de votre aide présente et futur.
Bilt.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Déplacement sprite animé - C++
« Réponse #12 le: Décembre 08, 2013, 08:48:39 pm »
Tu redémarres ta clock à chaque fois, comment veux-tu qu'elle augmente ? Est-ce que tu sais ce que tu fais, ou bien tu écris des trucs au hasard ? ;D
Laurent Gomila - SFML developer

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #13 le: Décembre 08, 2013, 09:27:15 pm »
Habituellement oui mais je dois t'avouer que dernièrement j'ai la tête ailleurs je dors peu, enfin je crois que je suis en train de mettre mon avenir en péril mais il faut que je reprenne ^^'
Merci de ton aide, cela n'a pas rectifié mon code mais je vais essayer de trouver :p

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Déplacement sprite animé - C++
« Réponse #14 le: Décembre 09, 2013, 03:23:31 pm »
Mille bisous j'ai réussi mais je suis en train de me rendre compte que mon objectif de base je m'en suis écarté énormément :/ Je voulais faire le déplacement animé chaque pixel, le hic c'est comment mettre en place ça ?
Je n'ai pas encore assez approfondit la lib pour savoir quels outils utiliser, vous pouvez me conseiller (Un coup je tutoie, un coup je vouvoie xD) ?
Merci d'avance, amicalement Bilt