Programmation Graphique Temps Réel (Semestre I)
Project Foxenstein
Episode 1 - Casperstein, le fantôme qui venait d'en haut.
Dans ce TD nous tâcherons d'écrire une première version du mapper et une version 2D du client linux.
Pour les petits malins qui ne liraient jamais l'énoncé jusqu'au bout, veuillez suivre ce lien.
1. Le mapper
Ecrire un programme (oui, oui, graphique) permettant de créer et de manipuler (oui, à la souris) un ensemble de polylignes fermées à au moins 3 côtés. Ces polylignes devront être orientées au sens qu'elles devront avoir un intérieur et un extérieur. Aucun des segments d'aucune polyligne ne devra s'intersecter.
Il devra de plus être possible de sauvegarder cette polyligne dans un fichier passé en argument au programme. Ce fichier devra correspondre à un format que vous aurez à définir pour la classe dans son entier. Ce format devra pouvoir être étendu si besoin est pour ajouter de nouvelles propriétés et/ou primitives. On nommera ce format fmf comme Foxenstein Map Format et on décidera d'utiliser l'extension .fmf pour ces fichiers. Il va sans dire que si le-dit fichier existe et est au format défini alors son contenu devra être chargé.
Les opérations suivantes devront donc être disponibles:
- Création/suppression d'une polyligne,
- Ajout/suppression d'un point dans une polyligne,
- Déplacement d'un point d'une polyligne,
- Modification de l'orientation d'une polyligne,
- Et enfin chargement/sauvegarde de ces polylignes dans un fichier passé en argument.
Comme certains d'entre vous l'auront sûrement déjà compris, ces polylignes décriront les murs des niveaux de notre FPS (on dira map plutôt que niveau parceque je trouve ca plus classe...).
2. Un client 2D.
Ecrire un programme prenant en argument un fichier fmf qui affichera le niveau en vue de dessus et permettra de se déplacer dans celui-ci.
La position et l'orientation de l'utilisateur devront être clairement visibles. Ce dernier devra pouvoir se déplacer en avant et en arrière et devra pouvoir tourner sur lui même pour changer de direction.
Ne vous préoccupez pas des problèmes de collision avec les murs pour l'instant.
Pour ceux qui ne l'auraient pas encore réalisé, notez que notre FPS est virtuellement un jeu 2D :) Cet état de fait simplifiera considérablement les techniques que nous verrons au cours des TDs suivants.
3. Indépendance vis à vis de la vitesse d'affichage.
Modifiez votre client 2D pour faire en sorte que la simulation du mouvement soit indépendante de la vitesse d'affichage de la scène.
Pour ce faire, vous pourrez par exemple penser à
utiliser la fonction glutIdleFunc
et
récupérer le nombre de millisecondes écoulées
depuis l'appel de la glutMainLoop
en
utilisant glutGet(GLUT_ELAPSED_TIME)
.