Les entités colorées sont bien jolies, mais vite ennuyeuses…
Pour rendre l’application un peu plus intéressante, nous allons doter les entités de la capacité de se déplacer.
Faites cela en ajoutant à la classe
Entity une fonction membre
animate().
Cette méthode ne renvoie rien et reçoit en paramètre un réel dt pour appliquer à l'entité courante le déplacement et la rotation causés respectivement par sa vitesse et sa vitesse angulaire dans l’intervalle de temps
dt.
Comme expliqué lors du premier laboratoire, le type
KineticState (module
s5) fournit des fonctionnalités pour simuler la physique de manière simpliste.
Servez vous, de la fonction membre
integrate() pour calculer la nouvelle position de l'entité, par rapport à sa vitesse et à l'intervalle de temps
dt, et son nouvel angle de rotation par rapport à sa vitesse angulaire et à l’intervalle
dt.
Maintenant, il faut que la fenêtre anime les entités qui lui appartiennent.
Pour cela, complétez la fonction
animate() de la classe
Window afin d’invoquer sur toutes ses entités leur fonction
animate().
Attention ! La fonction
animate() de la classe
Entity modifie les données membres, donc il faudra itérer sur l’ensemble des entités de la fenêtre en modification.
Testez votre code.
Vous devez voir les entités glisser et tourner dans la fenêtre, chacune avec sa propre vitesse, sa vitesse angulaire et sa direction.
Vous remarquerez vite que les entités sortent plus ou moins rapidement de la fenêtre qui reste vide.
Ceci rend vite l’application très peu intéressante, en conséquence nous allons ajouter une contrainte : les entités ne doivent pas disparaître de la fenêtre.
Pour assurer cet invariant, ajouter une fonction membre à la classe
Entity :
stay_inside().
Cette fonction doit recevoir en paramètre les dimensions de la fenêtre d’appartenance et appliquer sur les coordonnées x et y de l’entité le modulo sur la largeur et sur la hauteur respectivement.
Conseil : pour calculer le modulo, utilisez la fonction de la bibliothèque standard
rem_euclid().
Le but est de faire réapparaître les entités de l’autre côté.
Les entités peuvent sortir de la fenêtre à deux occasions : lorsqu’elle sont ajoutées à la fenêtre (leur position déterminée de façon aléatoire pourrait les placer en dehors), et lorsqu’elles sont animées par la fenêtre.
Dans les deux cas, pensez à invoquer la fonction
stay_inside() pour contraindre leur position.
Testez votre code, vous devez voir que les entités se déplacent dans la fenêtre et dès qu’elles en sortent, elle réapparaissent du côté opposé.