Modifiez la strtucture
Entity afin qu'elle puisse posséder un
Animator,
conformément au diagramme de classes.
Une entité pouvant être animée ou non, cette composition est
optionnelle.
En Rust, elle sera représentée par :
animator: Option<Box<dyn Animator>>,
Adaptez le constructeur pour initialiser correctement cette nouvelle donnée membre.
Modifiez ensuite la méthode
animate().
Elle doit toujours intégrer l'état cinématique de l'entité, puis invoquer la
méthode
animate() de son
Animator si celui-ci est présent.
La taille de la fenêtre devra également être transmise à cette méthode.
Adaptez enfin la fonction
create_window() afin qu'elle fournisse un
Animator
aux entités qui doivent en posséder.
Pour cette première étape, utilisez un objet de type
Gravity.
Conflit d'emprunts
Si vous compilez votre programme à ce stade, le compilateur signalera un conflit
d'emprunts dans la méthode
Entity::animate().
Lors de l'appel à
animator.animate(...), l'
Animator est emprunté en
lecture via
self, tandis que l'entité est simultanément empruntée de manière
mutable.
Cette situation est interdite, car elle permettrait plusieurs accès simultanés
à la même donnée, dont au moins un en écriture.
Pour résoudre ce problème, retirez temporairement l'
Animator de l'entité à
l'aide de la méthode
Option::take().
L'animation pourra alors être exécutée sans conflit d'emprunts.
Une fois l'animation terminée, replacez l'
Animator dans l'entité.
À l'issue de cette étape, les entités auxquelles un
Gravity est associé doivent
être soumises à la pesanteur tout en conservant leur comportement précédent.