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

Auteur Sujet: Animation, position et selection sprite dans une feuille de sprites en SFML2  (Lu 7331 fois)

0 Membres et 1 Invité sur ce sujet

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Bonjour,

J'ai un petit probleme lors de l'animation qui continue et surtout la selection du sprite à l'ecran qui s'affiche !
Je pense que cela vient des events (mais je suis pas sur, j'ai essayé pas mal de choses)

Donc dés que j'appuie par exemple à droite, le perso va bien sur la droite (je n'ai pas geré aucune vitesse encore) mais l'animation continue ... quand je relache, il faut que j'appuie une fois à gauche pour la stopper et en reappuyant a gauche le perso va à gauche mais l'animation continue ...

Au démarrage du programme haut et bas fonctionne aussi en selectionnant bien la bonne animation mais si j'appuie sur droite ou gauche cela ne fonctionne plus ...

Comme un code vaut plus qu'un long discours le voici:

Sprite.h

#ifndef SPRITE_H_INCLUDED
#define SPRITE_H_INCLUDED

#include <SFML/Graphics.hpp>
#include <iostream>

class SpriteHero
{
    private :

    //Chargement de la feuille de sprites
    sf::Image hero_marche_nu_unarmed;

    //Application image dans une texture
    sf::Texture texture_hero_marche_nu_unarmed;

    //Decoupes sprites
    sf::Sprite sprite_hero_marche_droite_nu_unarmed[16];
    sf::Sprite sprite_hero_marche_gauche_nu_unarmed[16];
    sf::Sprite sprite_hero_marche_bas_nu_unarmed[16];
    sf::Sprite sprite_hero_marche_haut_nu_unarmed[16];

    //ANIMATION
    //Position de départ
    int positionX, positionY;
    //sa vitesse de deplacement
    //droite, gauche
    int velocityX;
    //haut, bas
    int velocityY;
    //sa frame courante
    int frame;
    //Son status d'animation
    int status;



    public :

    SpriteHero(); //Constructeur
    void decoupe_hero_marche_nu_unarmed(); // Decoupe des feuilles de sprites
    void events_clavier(); //Gestion clavier
    void afficher(sf::RenderTarget &target); //Affiche a l'ecran les direction du Hero à prendre

};


#endif // SPRITE_H_INCLUDED

 

Sprite.cpp

#include "Sprite.h"

SpriteHero::SpriteHero()
{
    //Initialisation des attributs
    positionX = 150;
    positionY = 450;
    velocityX = 0;
    velocityY = 0;
    frame = 0;
    status = 8;

}


void SpriteHero::decoupe_hero_marche_nu_unarmed()
{
    //Chargement Feuille de sprite
    hero_marche_nu_unarmed.LoadFromFile("test.png");
    //Maque de transparence
    hero_marche_nu_unarmed.CreateMaskFromColor(sf::Color(0 ,0, 255));
    //Chargement de l'image dans la texture
    texture_hero_marche_nu_unarmed.LoadFromImage(hero_marche_nu_unarmed);

    for(int i = 0; i < 16; i++)
    {
        sprite_hero_marche_droite_nu_unarmed[i].SetTexture(texture_hero_marche_nu_unarmed);
        sprite_hero_marche_gauche_nu_unarmed[i].SetTexture(texture_hero_marche_nu_unarmed);
        sprite_hero_marche_bas_nu_unarmed[i].SetTexture(texture_hero_marche_nu_unarmed);
        sprite_hero_marche_haut_nu_unarmed[i].SetTexture(texture_hero_marche_nu_unarmed);
    }
    //Découpe des sprites
    for(int i = 0; i < 16; i++)
    {
        sprite_hero_marche_droite_nu_unarmed[i].SetTextureRect(sf::IntRect(140 * i, 0, 140, 160));
        sprite_hero_marche_gauche_nu_unarmed[i].SetTextureRect(sf::IntRect(2100 - (140 * i), 160, 140, 160));
        sprite_hero_marche_bas_nu_unarmed[i].SetTextureRect(sf::IntRect(140 * i, 320, 140, 160));
        sprite_hero_marche_haut_nu_unarmed[i].SetTextureRect(sf::IntRect(140 * i, 480, 140, 160));
    }
    //Position du sprite au départ
    for(int i = 0; i < 16; i++)
    {
        sprite_hero_marche_droite_nu_unarmed[i].SetPosition(positionX, positionY);
        sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(positionX, positionY);
        sprite_hero_marche_bas_nu_unarmed[i].SetPosition(positionX, positionY);
        sprite_hero_marche_haut_nu_unarmed[i].SetPosition(positionX, positionY);
    }
}

void SpriteHero::events_clavier()
{
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Left))
    {
        velocityX -= 140;
    }
    else if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Right))
    {
        velocityX += 140;
    }
    else if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Up))
    {
        velocityY -= 160;
    }
    else if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Down))
    {
        velocityY += 160;
    }


}

void SpriteHero::afficher(sf::RenderTarget &target)
{

    //Mouvement
    positionX += velocityX;
    positionY += velocityY;

    //On garde le personnage dans les limites de la fenêtre
    if(positionX < -40 || positionX + 100 > 800)
    {
        positionX -= velocityX;
    }

    if(positionY < -30 || positionY + 140 > 600)
    {
        positionY -= velocityY;
    }

    //Si Hero bouge à droite
    if(velocityX > 0)
    {
        //On prend le hero qui marche a droite
        status = 8;
        //Mise à jour de la position
        for(int i = 0; i < 16; i++)
        sprite_hero_marche_droite_nu_unarmed[i].SetPosition(positionX, positionY);
        //On bouge à la prochaine image de l'animation
        frame++;
    }
    //Si Hero bouge à gauche
    else if(velocityX < 0)
    {
        //On prend le hero qui marche a gauche
        status = 9;
        //Mise à jour de la position
        for(int i = 0; i < 16; i++)
        sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(positionX, positionY);
        //On bouge à la prochaine image de l'animation
        frame++;
    }
    //Si Hero bouge en bas
    else if(velocityY > 0)
    {
        //On prend le hero qui marche en bas
        status = 10;
        //Mise à jour de la position
        for(int i = 0; i < 16; i++)
        sprite_hero_marche_bas_nu_unarmed[i].SetPosition(positionX, positionY);
        //On bouge à la prochaine image de l'animation
        frame++;
    }
     //Si Hero bouge en haut
    else if(velocityY < 0)
    {
        //On prend le hero qui marche en haut
        status = 11;
        //Mise à jour de la position
        for(int i = 0; i < 16; i++)
        sprite_hero_marche_haut_nu_unarmed[i].SetPosition(positionX, positionY);
        //On bouge à la prochaine image de l'animation
        frame++;
    }
    //Si l'animation ne bouge plus
    else
    {
        //Recommencer l'animation
        frame = 0;
    }

    //Boucle l'animation
    if(frame >= 16)
    {
        frame = 0;
    }

    //Affichage
    if(status == 8)
    {
        target.Draw(sprite_hero_marche_droite_nu_unarmed[frame]);
    }
    else if(status == 9)
    {
        target.Draw(sprite_hero_marche_gauche_nu_unarmed[frame]);
    }
    else if(status == 10)
    {
        target.Draw(sprite_hero_marche_bas_nu_unarmed[frame]);
    }
    else if(status == 11)
    {
        target.Draw(sprite_hero_marche_haut_nu_unarmed[frame]);
    }
}

 

main.cpp

#include <SFML/Graphics.hpp>
#include <iostream>
#include "Sprite.h"



int main()
{
    sf::RenderWindow App(sf::VideoMode(800, 600, 32), "Test Animation sprite");

    sf::Texture background;
    background.LoadFromFile("back.jpg");

    sf::Sprite back;
    back.SetTexture(background);

    SpriteHero hero;
    hero.decoupe_hero_marche_nu_unarmed();

    while (App.IsOpen())
    {
        sf::Event Event;
        while (App.PollEvent(Event))
        {
            switch (Event.Type) // Type de l'évènement en attente :
            {
                case sf::Event::Closed : // Croix en haut à droite
                App.Close();
                break;

                break;
            }
        }
        hero.events_clavier();

        App.Clear();

        App.Draw(back);
        hero.afficher(App);

        App.Display();

    }

    return EXIT_SUCCESS;
}

 

Voila j'espère avoir été clair et merci d'avance

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Salut, j'ai pas regardé le code en détails, mais il a l'air cohérent. Petite question qui n'a peut etre rien à voir avec le problème, mais il ne manquerais pas le cas par défaut dans le switch du main ?

switch (Event.Type) // Type de l'évènement en attente :
{
   case sf::Event::Closed : // Croix en haut à droite
   App.Close();
   break;

   default:  // <----- ici
   break;
}


Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
oui c'est un petit oublie mais ça ne change pas toujours le même problème!

Je ne comprend pas pourquoi des que j'appuie sur droite ou gauche l'animation haut ou bas ne fonctionne plus!
Si je change le status d'animation au démarrage, ca prend bien la bonne animation pourtant.

Et quand je n'appuie plus sur une touche normalement l'animation devrait s'arreter ...

Avant de passer à la sfml, j'avais fait ce code avec la sdl et cela fonctionnait bien ...
J'ai du mal géré les events, je vais encore me pencher sur la doc pour voir si y'as pas moyen de faire mieux ...

virelio

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
Bonjour,
Quand tu appuies sur une touche tu changes la vélocité. Quand tu relâches la touche, la vélocité reste inchangée. Tu pourrais remettre systématiquement tes vélocités à 0 au début de ta procédure hero.events_clavier()

virelio

  • Newbie
  • *
  • Messages: 42
    • Voir le profil
une remarque: rien n'empêche ton sprite dans l'état actuel d'accélérer son mouvement sans vitesse limite (!) et d'avoir un mouvement en diagonale ce qui semble en contradiction avec ton choix de texture.
S'il va vite vers le haut et que tu tapes une seule fois flèche_à_droite, il va revêtir l'anim je vais à droite alors que le mouvement sera globalement vers le haut.

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
merci beaucoup pour ta réponse en remettant la velocité à 0 cela fonctionne parfaitement maintenant :)

void SpriteHero::events_clavier()
{
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Left))
    {
        velocityX -= 140;
    }
    else if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Right))
    {
        velocityX += 140;
    }
    else if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Up))
    {
        velocityY -= 160;
    }
    else if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Down))
    {
        velocityY += 160;
    }
    else
    {
        velocityX = 0;
        velocityY = 0;
    }
}
 

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
bonsoir,

Au lieu de réouvrir un sujet j'ai bossé sur mon code et revu la gestion du clavier (j'étais à coté de la plaque au départ maintenant ca fonctionne)

Maintennt j'ai voulu gérer le clic droit de la souris pour que mon sprite vienne à l'endroit du clic en choisissant
le bon sprite à prendre (pour l'instant je ne gère pas l'affichage des sprites en diagonales).

Le souci c'est que le resultat est aléatoire des fois ca fonctionne des fois non, je ne comprend pas ...
Voici mon code (partie event_souris):

void SpriteHero::events_souris(sf::Window &win)
{
    if (sf::Mouse::IsButtonPressed(sf::Mouse::Right))
    {
        pos_souris = sf::Mouse::GetPosition(win);
        //Centre du sprite
        pos_souris.x = pos_souris.x - 70;
        pos_souris.y = pos_souris.y - 80;
    }

    if(pos_souris.x > pos_hero.x)
    {
        //Choix du status d'animation
        status = 8;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge à droite
            sprite_hero_marche_droite_nu_unarmed[i].Move(2,0);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_droite_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    if(pos_souris.x < pos_hero.x)
    {
        //Choix du status d'animation
        status = 9;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge à gauche
            sprite_hero_marche_gauche_nu_unarmed[i].Move(-2,0);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_gauche_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    if(pos_souris.y < pos_hero.y)
    {
        //Choix du status d'animation
        status = 10;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge en haut
            sprite_hero_marche_haut_nu_unarmed[i].Move(0,-2);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_haut_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    if(pos_souris.y > pos_hero.y)
    {
        //Choix du status d'animation
        status = 11;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge en bas
            sprite_hero_marche_bas_nu_unarmed[i].Move(0,2);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_bas_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
}
 

Voila bon l'animation est moche car trop rapide en + elle ne s'arrete pas tout le temps ...
Par rapport à mon code pour le clavier lui fonctionne trés bien :

void SpriteHero::events_clavier()
{
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Right))
    {
        //Choix du status d'animation
        status = 8;
        //On incrémente les frames pour l'animation
        frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge à droite
            sprite_hero_marche_droite_nu_unarmed[i].Move(5,0);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_droite_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Left))
    {
        //Choix du status d'animation
        status = 9;
        //On incrémente les frames pour l'animation
        frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge à gauche
            sprite_hero_marche_gauche_nu_unarmed[i].Move(-5,0);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_gauche_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Up))
    {
        //Choix du status d'animation
        status = 10;
        //On incrémente les frames pour l'animation
        frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge en haut
            sprite_hero_marche_haut_nu_unarmed[i].Move(0,-5);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_haut_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    if (sf::Keyboard::IsKeyPressed(sf::Keyboard::Down))
    {
        //Choix du status d'animation
        status = 11;
        //On incrémente les frames pour l'animation
        frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge en bas
            sprite_hero_marche_bas_nu_unarmed[i].Move(0,5);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_bas_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
}

 

D'ailleur je ne sais pas pourquoi l'animation est plus lente qu'avec la souris (je pense que c'est l'appui de la touche qui fait ralentir).
« Modifié: Avril 09, 2012, 08:41:36 pm par Arnibou »

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Citer
Le souci c'est que le resultat est aléatoire des fois ca fonctionne des fois non, je ne comprend pas ...
Voici mon code (partie event_souris):

Un peu plus de précisions pourraient aider.
Sinon une petite question, tous les tests if(pos_souris.x > pos_hero.x) pour savoir quel sprite choisir et le déplacer ne drevraient ils pas se trouver dans le premier test if (sf::Mouse::IsButtonPressed(sf::Mouse::Right)) ?
if (sf::Mouse::IsButtonPressed(sf::Mouse::Right))
{
   // ton code

   if(pos_souris.x > pos_hero.x)
   {
   }

// etc, etc..
}

En gros tant que l'on clique on déplace le sprite.

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
Un peu plus de précisions pourraient aider.

En faite si je clic à droite du sprite il va prendre souvent la directon du bas comme s'il qu'il descendait (d'ailleur il prend souvent le haut et le bas comme anim malgré qu'il va bien à droite ou gauche) et souvent l'anim ne s'arrete pas (malgré qu'il est arrivé à destination il continue le frame ++, mais pas tout le temps)

Peut etre que les infos à tariter sont trop rapide et que je devrait faire jouer le temp?

Citer
En gros tant que l'on clique on déplace le sprite.

Non justement je veux que l'on clic une fois à un endroit sur la fenetre et que le sprite se déplace tout seul à ce dedit endroit

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
J'ai trouvé j'avais le même problème.
tu as mis que des blocs "if" successifs alors qu'il faut faire mettre des "else if".
En gros il va évaluer si le x de la souris et du sprite choisir la bonne anime puis évaluer le y. Du coup il reste bloqué sur la dernière évaluation. En l'occurrence le le test du Y.

Je suis pas sur d'avoir été clair :-\
« Modifié: Avril 10, 2012, 09:54:07 pm par Koryushin »

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
avec else if ca ne fonctionne plus du tout :x

en faite mon probleme ne se situe pas au niveau du sprite qui va à la souris mais de l'affichage du bon sprite (son status).

Pour voir ou se situe le probleme du choix du status c'est justement afficher le contenu de la variable status directement dans la fenetre comme ca je pourrais voir d'ou vient le probleme mais je vois pas comment m'y prendre sachant que sf::text n'affiche que du text !

Si quelqu'un pourrait me donner la marche à suivre ça m'avancerait et je lui en serait reconnaissant :)

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
std::ostringstream oss;
oss << status;
m_text.SetText(oss.str());

On peut même faire une petite fonction pour ca. (Repiqué d'un post de laurent)
template <typename T>
std::string to_string(T value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

ca convertira une valeur en std::string pour l'utiliser avec sf::Text par exemple.

Et pour ton problème je reste sur l'idée des else if.
Imaginons tu cliques a droite du sprite, rien ne te dit que le y sera le même que celui du sprite.
a l'heure actuel avec ton code si le x et le y de la souris sont différents  y a 2 blocs if qui sont évalués et le dernier blocs prends le dessus. En ayant que 4 directions il faut se debrouiller pour clamper les valeurs.

// au debut de ta fonction
Si la ||distance X|| entre le sprite et la souris est plus grande que la ||distance Y|| entre le sprite et la souris.
alors  souris.y = sprite.y
sinon souris.x = sprite.x

||distance X|| veut dire valeur absolue de distance X. la fonction std::abs
ensuite le reste est inchangé. Cet algo est pas terrible si on fait des petits déplacements mais en gros l'idée est là. Le plus simple serait d'avoir des déplacement en diagonale.

void SpriteHero::events_souris(sf::Window &win)
{
    if (sf::Mouse::IsButtonPressed(sf::Mouse::Right))
    {
        pos_souris = sf::Mouse::GetPosition(win);
        //Centre du sprite
        pos_souris.x = pos_souris.x - 70;
        pos_souris.y = pos_souris.y - 80;
    }

int DiffX = pos_souris.x - pos_hero.x;
int DiffY = pos_souris.y - pos_hero.y;

if(std::abs(DiffX) > std::abs(DiffY))  // Si la distance en x qui separe le hero de la souris est superieure a la distance en y
pos_souris.y = pos_hero.y; // On garde le x et on fait que le y de la souris soit celui du hero
else
pos_souris.x = pos_hero.x; // Sinon on garde le y et on fait que le x de la souris soit celui du hero

    if(pos_souris.x > pos_hero.x)
    {
        //Choix du status d'animation
        status = 8;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge à droite
            sprite_hero_marche_droite_nu_unarmed[i].Move(2,0);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_droite_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    else if(pos_souris.x < pos_hero.x)
    {
        //Choix du status d'animation
        status = 9;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge à gauche
            sprite_hero_marche_gauche_nu_unarmed[i].Move(-2,0);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_gauche_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    else if(pos_souris.y < pos_hero.y)
    {
        //Choix du status d'animation
        status = 10;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge en haut
            sprite_hero_marche_haut_nu_unarmed[i].Move(0,-2);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_haut_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_bas_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
    else if(pos_souris.y > pos_hero.y)
    {
        //Choix du status d'animation
        status = 11;
        //On incrémente les frames pour l'animation
        //frame ++;
        for(int i = 0; i < 16; i++)
        {
            //On bouge en bas
            sprite_hero_marche_bas_nu_unarmed[i].Move(0,2);
            //On récupère la position actuelle
            pos_hero = sprite_hero_marche_bas_nu_unarmed[i].GetPosition();
            //Mise à jour de la position des autres sprites directions
            sprite_hero_marche_gauche_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_droite_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
            sprite_hero_marche_haut_nu_unarmed[i].SetPosition(pos_hero.x, pos_hero.y);
        }
    }
}
« Modifié: Avril 10, 2012, 10:25:18 pm par Koryushin »

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
merci  pour ton aide je testerais tout ca demain  :)

Arnibou

  • Newbie
  • *
  • Messages: 30
    • Voir le profil
merci pour la formule pour transformer une valeur en string  :-*

Sinon j'ai fais une feuille de sprites avec les diagonales et modifier mon code en conséquence!
Cela fonctionne à une chose prêt (trop beau pour être vrai lol) :

Quand je click sur la souris ca m'affiche les coordonnées où j'ai cliké, le sprite se déplace et assez souvent il se met à cheval aux coordonnées entre la bonne et -1 (des fois x, des fois y) par rapport aux coordonnées de la souris et donc du coup ca prend 2 animations l'une derriere l'autre en continue vu que les coordonnées du sprite ne sont pas fixe à l'arret.

J'ai fait une petite video où ça le fait (mieux explicite)



j'ai fait des else if aux 8 déplacements avec à chaque fois un test de x et y hero par rapport à la souris

Alors pourquoi le sprite se met t'il à cheval entre 2 coordonnées? et donc pourquoi que le sprite n'arrive pas exactement aux coordonées de la souris?

« Modifié: Avril 14, 2012, 09:05:51 pm par Arnibou »

xabixouu

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
Re : Animation, position et selection sprite dans une feuille de sprites en SFML2
« Réponse #14 le: Juillet 07, 2012, 11:53:52 am »
Bonjour Arnibou,

Je passe par la par hasard, et vu la date du topic tu as surement trouve ta réponse.

Dans le cas ou tu ne l'aurais pas trouve, regarde bien les coordonnées du clic : 617.

En fait, la taille de ton perso doit surement etre un nombre pair, ainsi, il essai d'aller a 617 en navigant de 616 a 618.


Essai de réfléchir a ce que tu pourrais faire pour que le clic de la souris soit convenable ;)