CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++ - SFML] Gérer les animations

N_Near
N_Near
Niveau 10
28 novembre 2013 à 22:50:51

Bonjour - Bonsoir.

Première fois que je me met à SFML, je souhaite faire une animation avec mon personnage.

Donc j'ai mon personnage qui bouge de gauche à droite, bas en haut, mais sans animation c'est bien dégueulasse.

Je souhaiterais donc savoir comment faire pour faire une animation ? Voici la feuille de sprite que j'utilise :

https://image.noelshack.com/fichiers/2013/48/1385675064-heros.png

et un appercu du jeu tel qu'il est en ce moment :

https://image.noelshack.com/fichiers/2013/48/1385675415-game.png

Mon code de déplacements actuel :
http://pastebin.com/Vasx8Kud

Que faire pour réaliser une animation ? C'est une des premières fois que je touche à la bibli sfml, j'ai déjà fais quelques jeu mais évidemment sans animation !

Merci :)

guidat
guidat
Niveau 49
29 novembre 2013 à 00:08:58

Ça m'intéresse également ! :) Quelqu'un pour éclairer ?

caelacanthe
caelacanthe
Niveau 10
29 novembre 2013 à 00:14:31

Faites preuve de logique, séparez ces images en mémoire et affichez-les les unes après les autres lorsque le personnage est en train de marcher, pas de recette miracle. :oui:

N_Near
N_Near
Niveau 10
29 novembre 2013 à 00:27:04

Comment faire, car si j'appel deux fois la fonction draw pour le même objet seul le dernier est prit en compte ! La première appellation est
Simplement ignorer pour la deuxième et donc cela ne fait en aucun cas une animation :(

Pseudo supprimé
Pseudo supprimé 29 novembre 2013 à 03:07:35

Pas sûr que tu aies bien compris comment une boucle principale de jeu est censé fonctionner. Tes clear, draw, et display n'ont rien à faire dans la boucle d'évènements. Ni en dehors de la boucle principale.
Dégage tout ça et tu te retrouves avec ça :
http://pastebin.com/Qi03KbB3

Ensuite en ce qui concerne les déplacements, je doute fort que tu souhaites réellement te servir des events pour ça.
Là ça fonctionne à peu près car quand tu laisses appuyé sur une touche l'évènement KeyPressed se répète. Mais sa fréquence de répétition dépend de l'OS et peut même être désactivée (ce qui te ferait déplacer d'une seule fois de 3 pixels et plus rien ensuite) tu devrais plutôt utiliser la classe sf::Keyboard, qui est faite pour gérer des inputs continus comme un appuie continu sur une touche pour se déplacer. (et bien sûr, tu n'utilises pas ça à l'intérieur de la boucle d'évènements non plus hein)
Aussi, droite gauche haut bas c'est des sf::Vector2 non ? Tu peux te passer de passer séparement .x et .y à la fonction move et lui passer directement ton vecteur de déplacement.
Voilà ce que ça donne :
http://pastebin.com/e5PEx9fy

Pour l'animation, y'a pas de recette miracle comme dit cael, il faut en effet afficher chaque partie d'image l'une après l'autre à une certaine fréquence. Pas besoin de les séparer en mémoire, tu as juste à changer le subrect de ton sprite.
Stock quelque part les listes des subrect qui composent chaque animation. (ici je les mets dans une std::map) T'as aussi besoin d'une variable pour savoir quelle animation t'es en train de jouer. Quand tu appuies sur une touche, tu modifies cette variable pour qu'elle corresponde à l'animation que tu veux jouer. Il te faut aussi une variable qui indique à quelle étape (à quelle frame) de l'animation on se trouve.
Tu dois utiliser une sf::Clock pour mesurer le temps et savoir si on avance d'une image dans l'animation ou pas.
Disons que tu veuilles que l'animation avance tous les 250 ms, si le temps mesuré par ta block est supérieur à 250 ms, tu avances d'1 cran l'index de l'image de ton animation et tu remets ton compteur de temps à 0. Pour que ton animation tourne en boucle une fois arrivé à la dernière image de l'animation, suffit de remettre l'index à 0. (tu peux éventuellement aussi faire ça avec un modulo)
Faut pas oublier la partie la plus importante, mettre à jour le subRect du sprite en fonction de l'animation courante, et de la frame courante.
http://pastebin.com/EByhM1bE

- Si tu trouves que ton perso bouge vite, c'est normal il bouge de 3 pixels par frame (pas les frames d'animations, les frames d'affichage) et tu as sûrement beaucoup de frames par secondes (les fps comme on dit :/ ) donc soit tu réduis la vitesse de tes déplacements, soit tu limites les frames (vsync ou framelimit) ou le mieux, tu fais des déplacements indépendants du nombre de frames par secondes.
- Si t'aimes pas les map, les vector ou les index sous forme de string, tu peux utiliser ce que tu veux. ;)
- Si plus tard t'as plusieurs animations, au lieu d'avoir un sf::Clock par animation, utilise un seul sf::Clock avec lequel tu calcules le temps pris pour chaque frame du jeu. Et pour chaque animation tu stockes un sf::Time, auquel tu ajoutes le temps dont je parle dans la ligne juste au dessus. Et sers toi de ce sf::Time comme de la clock dans mon exemple.
- Dans l'exemple je mets à jour le subrect du sprite à chaque frame, c'est inutile. Tu peux le mettre à jour uniquement quand l'animation change, ou quand la frame de l'animation change. (pareil pour la vérification que l'index dépasse pas la taille du tableau)

Bref, c'est un simple exemple et on pourrait l'améliorer d'une tonne de façons mais j'espère que ça suffit à comprendre le principe. Et il peut y avoir des erreurs j'ai tapé ça comme ça, j'ai pas tenté de le compiler. Comme tu peux le remarquer j'ai pas tapé les animations vers le haut et bas (donc forcément ça plante si tu appuies sur haut ou bas), et je sais même pas si les subrect que j'ai mis sont corrects.

N_Near
N_Near
Niveau 10
29 novembre 2013 à 11:40:03

Merci beaucoup pour vos réponses et surtout à Alayric, réponse plus que complète merci beaucoup !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment