Je peux identifier deux problèmes. Le premier concerne le mouvement fluide et le second est lié à la fermeture éclair du personnage.
Pour créer un mouvement fluide, vous pouvez utiliser une technique appelée interpolation linéaire ou (LERP) pour lisser le mouvement. Fondamentalement, comment cela fonctionne entre votre point de départ et votre point d'arrivée, vous calculez un ensemble de distances de plus en plus petites pour émuler un mouvement fluide et ralentir lorsque le point final est presque atteint.
L'exemple le plus simple de cette fonction serait:
//point1 is the current position, will be starting position on first call
//point2 is the target position
//epsilon is the % of the distance between current and target you want
//to cover per game physics loop (a fixed realworld time based loop).
//The smaller the % the "smoother" the motion.
float lerp(float point1, float point2, float epsilon)
{
return point1 + epsilon * (point2 - point1);
}
À mesure que le personnage se rapproche du point 2, il ralentira progressivement. Notez bien qu'ils ne toucheront jamais le point 2 mais se rapprocheront infiniment. Vous devrez corriger cela et si le joueur est à moins d'une distance infiniment petite du point 2, nous pouvons considérer que le joueur est au point 2.
Le deuxième problème que vous avez mentionné est lié au fait que votre personnage vole hors écran. Ceci est le résultat de la lecture de l'entrée à chaque rafraîchissement de la boucle de jeu combinée au mouvement instantané entre les tuiles.
Idéalement pour résoudre ce problème, dans votre code, vous devez décider
- Combien de temps réel il faudrait au personnage pour passer du point 1 au point 2.
- Réglez votre Lerp pour qu'il fonctionne entre le point 1 et deux pendant cette durée
- Relisez l'entrée une fois le point 2 atteint pour décider où aller