TD 2 • Laser
Déplacements dans une carte en 2D en utilisant des coordonnées décimales
Cartouche
| Champ | Valeur |
|---|---|
| Module | Programmation Graphique en Rust |
| Auteur·e·s | Élise Philippe (rédactrice) ; Eden Stocker (illustrateur) ; Jason Brillante (text de référence) |
| Édition | 2024-11-18 |
| Durée | 2~3 séances |
| Taille des équipes | 2~3 personnes |
| Rendu | via git, dépôt $YEAR_laser, droits en lecture à delivery_collector,créez votre dépôt avec https://git.ecole-89.com/repo/create?template_id=2656 |
| Nom du crate | laser |
Règlement
Prenez connaissance du règlement ici
L’intégralité de la bibliothèque standard est autorisée. Vous êtes encouragés à vous servir des outils qu’elle vous propose s’ils résolvent un de vos problèmes. Votre objectif c’est d’éviter de ré-inventer la roue quand ça n’est pas nécessaire.
Certains crates sont proposés dans le sujet. Vous avez le droit de vous servir de toutes leurs fonctionnalités.
Vous pouvez rechercher des alternatives à ces crates, voir des crates qui vous proposent des fonctionnalités complètement différentes. Si ces crates affectent l’écriture de votre algorithme ou l’architecture de votre programme, vous devez les faire valider en amont.
Introduction
En utilisant ce template, vous allez écrire votre propre bibliothèque laser. Son métier : faciliter le travail avec une carte en deux dimensions pour y déplacer un joueur vers la direction où il regarde.
Vous vous servirez de cette bibliothèque dans le projet Runner.
Copiez la structure Coords du TD 1 • windraw et mettez là en publique dans ce crate
Calculer un déplacement
Écrivez la fonction publique move_towards. Elle doit prendre en paramètre :
- une position de départ
&Coords<f32>; - l’angle qui représente la direction dans laquelle aller ;
- la distance à laquelle on veut notre nouveau point.
Elle doit renvoyer un Coords<f32> qui correspond à la position trouvée.

Lancer un rayon
Notre objectif pour cette étape c’est de pouvoir lancer un rayon depuis un point de départ et dans une direction choisie et de trouver le point auquel se rayon rencontre un mur, ainsi que la distance entre le sujet et le mur.

Pour nous représenter une carte de tuile comme dans l’illustration, nous allons utiliser la structure Map du dépôt modèle.
Écrivez la fonction publique send_ray qui prend une &Map en paramètre, une position de départ ainsi qu’un angle en radians pour la direction. Elle doit renvoyer en Option les coordonnées et une distance, qui correspondent au point où a été touché le mur et à la distance sujet-mur.
Pour déterminer la point d’impact du rayon send_ray doit faire des appel successifs à move_forward en augmentant progressivement la distance, et vérifier si le retour de move_forward tronqué correspond à un mur ou non dans la map. Lorsqu’un mur est atteint on renvoie Some avec la position de collision et la distance. Lorsqu’on est sortit de la map, renvoyez un variant None.
Radar
Écrivez la fonction publique draw_impact qui prend en paramètres :
- une map ;
- une framebuffer et ses dimensions ;
- une position de départ ;
- un angle ;
- une couleur.
draw_impact doit placer un point sur la framebuffer au point d’impact multiplié par map.tile_size_in_px.
Des appels successifs à cette fonction permettent de dessiner les contours des murs à la façon d’un RADAR/LIDAR sur la framebuffer.
Pour tester votre fonction, prenez comme base le travail fait pour TD 1 • windraw et au lieu de placer un pixel unique, faite une boucle de 0 à qui appelle draw_impact sur une map, à partir d’un point central.
Écrivez ce test dans examples/radar.rs.