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.