Bonsoir,
En général, c'est une très mauvaise idée de se fier sur la répétition des touches dans un jeu.
C'est un paramètre qui dépend de l'OS, et donc il sera facile de « tricher » en configurant la vitesse de répétition au max.
D'une façon encore plus générale, on évite de traiter un évènement directement dans la boucle des évènements du système, c'est beaucoup mieux de le faire dans un autre thread (la boucle du jeu).
Ainsi on est certain que le jeu s'exécute à la même vitesse partout, quelle que soit ta config et tes FPS.
Lors du keydown, on marque quelque part le fait que telle touche est appuyée, et lors du keyup, on enlève cette marque. La boucle des évènements ne fait que des choses très simples et donc elle est fluide. Si tu fais autre chose, genre déplacer ton personnage, ah mais oui mais après il faut que j'actualise l'affichage, puis checker si je ne touche pas un ennemi, et puis encore envoyer ça sur le réseau pour dire à tout le monde que j'ai bougé… et c'est comme ça que le jeu finit par ramer ou faire des trucs bizarres du style passer à travers les murs alors que les vérifications d'obstacles sont pourtant blindées (je l'ai expérimenté à mes débuts, c'est hyper frustrant et en plus c'est une source de bug assez difficile à découvrir).
Non, il faut décoreller tout ça. Dans la boucle de jeu, c'est là que tu vas vérifier: si la touche flèche droite est marquée comme actuellement appuyée, alors on déplace le perso d'une case à droite et on test s'il est sur un mur; et on ne fait rien d'autre. L'affichage c'est dans une autre boucle encore.
Je mettrais bien ça dans le top 10 des erreurs classiques du débutant en développement de jeux vidéo.