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

Auteur Sujet: Déplacement sprite avec animation controlée  (Lu 4335 fois)

0 Membres et 1 Invité sur ce sujet

Sozary

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Déplacement sprite avec animation controlée
« le: Avril 07, 2016, 11:47:53 pm »
Bonsoir, je sais que des sujets similaires ont déjà été résolu, mais je n'ai pas trouvé mon bonheur.
Je m'explique: sur cette vidéo (regarder la 3 secondes environ a partir de 15 seconde), le personnage marche de 16 pixels en 16 pixels avec une animation bien gérée dessus. Comment décomposer ce mouvement avec sfml? J'ai une boucle de rendu qui ressemble à ça:
Clock clock;
Time timeSinceLastUpdate;
timeSinceLastUpdate = Time::Zero;
int animationCounter = 0;
// cout << m_scripts[2].instructions[1].offset << endl;  --> fonctionne
while (m_window.isOpen())
{
processEvent();

timeSinceLastUpdate += clock.restart();


while (timeSinceLastUpdate > TimePerFrame)
{

timeSinceLastUpdate -= TimePerFrame;
processEvent();
update(TimePerFrame);
}

render();
}

Merci d'avance!

nicox11

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : Déplacement sprite avec animation controlée
« Réponse #1 le: Avril 08, 2016, 09:42:10 am »
Pour ne pas réinventer la roue :

https://github.com/SFML/SFML/wiki/Source:-AnimatedSprite

Fais tout ce dont tu as besoin, il me semble.

Sozary

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Déplacement sprite avec animation controlée
« Réponse #2 le: Avril 08, 2016, 12:47:16 pm »
Merci! Mais du coup le personnage avance d'un coup à la vitesse définie, or moi je veux que quand on appuie sur une touche de déplacement, le personnage parcours la moitié du tile de où il veut aller et joue le premiere animation de la marche, puis la deuxieme moitié du tile avec la deuxieme animation, sinon mon personnage risque de se retrouver entre deux cases!

nicox11

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : Déplacement sprite avec animation controlée
« Réponse #3 le: Avril 08, 2016, 01:29:30 pm »
L'implémentation que je t'ai passé n'agit pas comme tu l'indiques. Le problème doit venir de ton implémentation. Comment ton jeu est il codé ? Comme tu l'as dit, il suffit de décomposer ton animation afin d'ajouter l'étape intermédiaire.

Sozary

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Déplacement sprite avec animation controlée
« Réponse #4 le: Avril 08, 2016, 02:43:48 pm »
Hum mon jeu est un peu gros donc je vais tenter de résumer au mieux.
J'ai fait une classe Game avec 4 méthodes :    
void run();
void processEvent();
void update(sf::Time);
void render();

Mon run() est la fonction qui est appelée dans mon main. Son contenu est présent dans mon premier post.

Sauf qu'ici, la boucle fait en sorte de tourner 50 fois par secondes, ce qui est trop rapide pour l'affichage.Dois je changer cela?

nicox11

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : Déplacement sprite avec animation controlée
« Réponse #5 le: Avril 08, 2016, 02:56:31 pm »
En quoi faire une boucle qui troune 50 fois par seconde est trop rapide pour l'affichage ? N'as tu jamais joué à des jeux avec 60 fps ?

Montre moi la partie de ta fonction update qui permet le déplacement de ton personnage.

Sozary

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Déplacement sprite avec animation controlée
« Réponse #6 le: Avril 08, 2016, 04:41:56 pm »
void Game::update(Time deltaTime)
{
if (m_keys_pressed[Keyboard::Up])
{

m_player_time = m_player_clock.getElapsedTime();
if (m_player_time.asSeconds() < (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(0, -SPEED / 2));
}
else if (m_player_time.asSeconds() >= (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(0, -SPEED / 2));

}
}
else if (m_keys_pressed[Keyboard::Down])
{

m_player_time = m_player_clock.getElapsedTime();
if (m_player_time.asSeconds() < (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(0, SPEED / 2));
}
else if (m_player_time.asSeconds() >= (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(0, SPEED / 2));

}
}
else if (m_keys_pressed[Keyboard::Left])
{

m_player_time = m_player_clock.getElapsedTime();
if (m_player_time.asSeconds() < (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(-SPEED / 2,0));
}
else if (m_player_time.asSeconds() >= (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(-SPEED / 2,0));

}
}
else if (m_keys_pressed[Keyboard::Right])
{

m_player_time = m_player_clock.getElapsedTime();
if (m_player_time.asSeconds() < (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(SPEED / 2,0));
}
else if (m_player_time.asSeconds() >= (TIME_DEPLACEMNT / 2))
{
m_joueur.increaseAnim();
m_joueur.move(Vector2f(SPEED / 2,0));

}
}


m_joueur.updateDirection(m_joueur.getDirection());


}

increaseAnim permet de passer a l animation suivante!

Sozary

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Déplacement sprite avec animation controlée
« Réponse #7 le: Avril 08, 2016, 08:28:33 pm »
En fait je voudrais que le déplacement du personnage soit fluide mais fixé sur la grille

nicox11

  • Jr. Member
  • **
  • Messages: 51
    • Voir le profil
Re : Déplacement sprite avec animation controlée
« Réponse #8 le: Avril 11, 2016, 10:56:13 am »
Utilise AnimatedSprite, ça t'aidera. Il y a un exemple complet qui permet de comprendre comment ça fonctionne. Il gère simplement le changement de sprite pour que cela soit fluide. Le déplacement en tant que tel, c'est à toi de l'implémenter.

Pour que le déplacement du personnage soit "fluide mais fixé sur la grille", tu peux simplement ajouter une étape intermédiaire dans ton déplacement. Plutôt que déplacer directement sur la case d'à côté, afficher ton personnage entre les deux cases. Tu dois pour cela implémenter un mécanisme qui empêche l'utilisateur de pouvoir changer de direction à ce moment précis (une fois qu'il a décidé d'aller à droite, il ne peut changer de direction avant que le personnage n'ait atteins la case de destination). C'est aussi pourquoi le déplacement doit quand même être rapide.

En résumé :
- Pour gérer l'animation en terme d'affichage, ne réinvente pas la roue et utilise AnimatedSprite qui est plutôt bien faite. Tu as juste à appeler la méthode update.
- Pour le côte physique, déplace ton personnage à mi parcours, tout en empêchant l'utilisateur de le déplacer à ce moment la.

Sozary

  • Newbie
  • *
  • Messages: 28
    • Voir le profil
    • E-mail
Re : Déplacement sprite avec animation controlée
« Réponse #9 le: Avril 20, 2016, 10:55:02 pm »
Merci!!
Sujet résolus!