Jeu vidéo en pseudo 3D avec la méthode du raycasting

Cartouche

Champ Valeur
Module Programmation Graphique en Rust
Auteur·e·s Élise C. Philippe, Jason Brillante
Édition 2024-11-18
Durée 3 semaines
Taille des équipes 2~3 personnes
Rendu via git, dépôt $YEAR_runner, droits en lecture à delivery_collector

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.

Barème

Sur 20 points (accessibles 29) :

  • Affichage des murs (rendu d’une image au moins) 8
  • Déplacements du PJ en fonction de son orientation (strafe et pan) 4
  • Fluidité et réactivité 4
  • Gameplay 4
  • Minimap 3
  • Configuration du FOV (à chaud, CLI ou fichier de configuration) 2
  • Malus maximum pour mauvaise qualité du code -5

Règles d’évaluation spécifiques

L’obtention des points est conditionné à la présentation des fonctionnalités requises en soutenance. Toute fonctionnalité qui n’est pas présentée sera considérée comme absente.

Introduction

Votre objectif, implémenter un jeu vidéo avec la méthode du raycasting, qui permet de représenter une carte en 2 dimensions avec une vue à la première personne qui ressemble à de la 3 dimensions.

Les TD windraw et laser contiennent les outils nécessaires :

  • au dessin sur une fenêtre avec chinchilib ;
  • à la gestion des événements avec la chinchilib ;
  • au lancé de rayons à partir d’un joueur placé sur une carte en 2D.

Lancé de rayon

Pour réaliser votre programme, vous devez programmer un raycasting à partir d’une position donnée (celle du joueur), d’une direction et d’un champ de vision. Vous devez générer l’image qui correspond à ce que le personnage joueur voit.

Dans le TD 2 • Laser vous avez lancé un rayon pour trouver la distance mur joueur dans une certaine direction. Pour faire un rendu façon raycasting, on va se servir de la distance pour déterminer la taille à l’écran du mur que le rayon à tapé.

Pour faire le rendu d’une image en raycasting, on a besoin de savoir les choses suivantes :

  • On envoie autant de rayon qu’on a de colones à l’écran.
  • La colonne la plus à gauche a pour angle : l’angle de la direction dans laquelle le joueur regarde moins la moitié de l’angle de vision (le FOV)
  • On peut calculer l’angle pour toutes les autres colonnes à partir d’un incrément (l’angle de vue divisé par le nombre de colonnes) ou avec un produit en croix.
  • Sur chaque colonne on va dessiner un mur d’une taille inversement proportionnelle à la distance.
  • Les murs que l’on dessine doivent être au milieu de chaque colonne à l’écran (avec autant de marge en haut que en bas.)
  • Le champ de vision du joueur est une donnée arbitraire.

raytracer_map_vs_fpv.png

Ci-dessus, une vue du dessus et une vue à la première personne de la même carte. Ces deux vues affichent les mêmes données d’une manière différente. Vous devez réaliser une vue similaire à celle de droite, à la première personne.

Le format avec lequel vous stockez les cartes est libre.

Choix du jeu

Après vous être concentré sur l’aspect technique, vous êtes libres d’implémenter le jeu de votre choix. L’un des plus simples à réaliser étant un jeu de labyrinthe. Réussir un stage vous fais passer au suivant. Une fois tous les stages réussis le joueur a gagné.

Vous pouvez aussi implémenter un jeu de course (enfin un jeu de contre la montre à défaut d’avoir des sprites pour des concurrents).

Exemples de jeux utilisant la méthode du raycasting qui y superposent des sprites :

Pasted image 20250114104832.png Pasted image 20250114104842.png