Ajoutez un comportement interactif aux entités : un clic gauche sur une entité
devra modifier son mouvement.
Pour détecter si une entité a été sélectionnée, nous utiliserons son cercle
englobant (
bounding circle).
Cette approximation est très courante en informatique graphique, car elle permet
de traiter les collisions indépendamment de la forme réelle de l'objet.
Ajoutez donc à la structure
Entity un attribut
bounding_radius, calculé lors de
la construction de l'objet.
Pour un carré de côté
side, son rayon vaut :
bounding_radius = 0.5 * std::f64::consts::SQRT_2 * side;
Implémentez ensuite la méthode
click(), qui reçoit les coordonnées de la
souris (
s5::Point).
Si le clic appartient au cercle englobant de l'entité, modifiez son mouvement
selon les règles suivantes :
- la nouvelle composante x_speed devient l'opposé de y_speed ;
- la nouvelle composante y_speed devient l'ancienne valeur de x_speed ;
- la vitesse angulaire change de signe.
Le calcul permettant de tester si un point appartient au cercle est illustré
dans l'exemple ci-dessous, qu'il vous appartient d'adapter à votre implémentation.
let radius = bounding_radius;
let dx = mouse_x - x;
let dy = mouse_y - y;
if dx*dx + dy*dy <= radius*radius {
// Inside the bounding circle
}
Enfin, complétez la méthode
click() de la structure
Window afin de transmettre
l'événement à toutes les entités qu'elle contient.
Testez votre application : un clic sur une entité doit modifier sa vitesse et
son sens de rotation.