Première version de notre jeu vidéo : un cercle animé
Introduction
Cette première version est une Applet implémentant l'interface Runnable. Elle instancie un objet
de la classe Cercle.
Puisqu'elle implémente Runnable, elle se doit de possèder une méthode méthode run().
En créant un Thread à partir de l'Applet et en le démarrant, la méthode run() s'exécute
en tâche de fond : lle se contente de calculerà intervalles réguliers (toutes les 10 millisecondes)
la nouvelle position du cercle et d'invoquer la méthode repaint(), qui va à son tour provoquer l'appel
asynchrone de la méthode paint() par l'AWT.
La méthode paint() se contente de dessiner le cercle à sa position courante.
Cette applet peut être vue comme un projecteur de cinéma : à intervalle réguliers
on produit une nouvelle image.
Un cercle animé, version 1
|
Sources de cette Applet
Problèmes de cette version
- Sur une machine rapide, l'animation sera aussi rapide qu'on le souhaite, et le cercle se déplacera toutes
les 10 millisecondes, mais sur une machine lente, il se peut que le dessin et le calcul de la nouvelle position
du cercle prennent plus de 10 millisecondes. Dans ce cas l'animation sera plus hâchée et le cercle
se déplacera plus lentement, puisque sa position est recalculée dans la méthode run() de l'Aplet.
. On aimerait bien que même si la machine est lente et l'animation plus saccadée, à la manière
des jeux vidéos, les déplacements et la vitesse du cercle restent les mêmes. Ainsi sur une
machine puissante on aura un film fluide, sur une machine lente un film saccadé, mais l'action restera la
même ! Une des solutions consiste à mesurer le temps écoulé entre deux images, et à
calculer la nouvelle position du cercle en fonction de ce temps de manière à ce qu'il se déplace
à vitesse constante. Nous allons voir qu'il existe une solution bien plus simple.
- Si on veut animer plusieurs cercles, il va falloir ajouter du code dans l'applet. On aimerait bien déporter
le calcul des positions dans la classe Cercle.
- L'animation scintille.
- Si on retaille l'Applet, le cercle rebondit toujours dans la même zone...