PG 110: Sujet de Projet

2011-2012

L’objectif de ce projet de programmation est la réalisation d’un jeu 2D en C.

1  Principes du jeu

Votre joueur devra se déplacer dans une forêt, sur une carte, de son point de départ jusqu’à un objectif. Il pourra pour cela se déplacer dans les deux dimensions. Il pourra aussi poser une ou plusieurs bombes de différentes puissances et déplacer des objets. Toutefois, le joueur sera amené à rencontrer un certain nombre d’objets sur son chemin :

2  Spécification technique du jeu

Pour ce jeu, on representera la carte sous la forme d’une matrice dont chaque case contient le type (t_map) de l’objet qui se trouve à cette position (joueur, caisse, arbre ...). Le joueur sera lui représenté à la fois sur la carte, et par une structure de type t_player. Le programme que nous proposons de réaliser utilse les bibliothèques SDL et SDL_image pour l’affichage. Il a été testé avec succès sur Solaris, Linux, MacOS X et Windows 7. Pour plus d’information, voir le site de SDL : Simple DirectMedia Layer.

3  Travail fourni

On vous fournit une première ébauche fonctionnelle du jeu. Dans cette ébauche, le joueur peut se déplacer dans toutes les directions quelque soit la nature des cases. Vous trouverez dans le code, les fonctions permettant d’afficher un objet à l’écran, rafraichir l’écran, bouger votre joueur, etc.

4  Travail à fournir

Il vous est demandé de compléter l’ébauche de jeu fournie, de produire un court rapport, ainsi que de faire une démonstration de votre implantation des fonctionnalités demandées. Le rapport devra contenir, pour chaque fonctionnalitée ajoutée, une description de la solution adoptée. Il devra être remis au format PDF. Votre code devra être clairement commenté et indenté. Les fonctions seront nommées en anglais. Vous trouverez ici l’archive contenant les sources du squelette de jeu (workspace eclipse).

4.1  Gestion des collisions

Vous devez dans un premier temps faire en sorte que votre joueur ne puisse pas sortir de l’écran, ne puisse pas marcher sur les arbres, ne puisse pas marcher sur les caisses... En d’autres termes, vous devez faire en sorte que votre joueur ne puisse aller que dans certaines cases de la carte.

4.2  Chargement d’une carte

Dans la version du jeu que l’on vous fourni, la carte est chargée statiquement. Vous devez modifier cela pour charger une carte à partir d’un fichier. Le fichier servant de source à la carte a un format bien défini. La première ligne de la forme width:height représente la largeur et la hauteur de la carte de jeu. Les lignes suivantes du fichier décrivent le contenu de chaque case de la carte de gauche à droite en partant de la première ligne, puis la seconde et ainsi de suite. Chaque case est décrite par un entier compris entre 0 et 4. Les retours à a ligne et les espaces sont ignorés. La case en haut à gauche de la carte correspond aux coordonnées (0,0).

4.3  Bouger les caisses

Dans les spécifications du jeu, on a dit que le joueur peut pousser des caisses. Il vous faut donc faire en sorte que lorsqu’un joueur se déplace contre une caisse, la caisse se déplace en même temps que le joueur. Il faut faire attention au fait que la caisse ne peut pas toujours se déplacer (on ne peut pas superposer deux caisses, on ne peut pas mettre une caisse sur un arbre, ...) !

4.4  Bombes

Pour pouvoir détruire des objets, le joueur doit pouvoir poser des bombes. Vous devez maintenant construire un module "bomb" qui permet de gérer une bombe. Lorsque le joueur presse la touche "espace", il dépose une bombe sur la case sur laquelle il se trouve. Une bombe possède des propriétés propres au joueur (durée de vie et puissance). Par défaut, une bombe a une durée de vie de 4s et une puissance de 1. La puissance d’une bombe indique le nombre de cases qu’elle peut atteindre lorsqu’elle explose. Lors d’une explosion de bombe, elle détruit tout dans les 4 directions (sauf les arbres).

4.5  Gestion des vies

Modifier le joueur pour qu’au début du jeu, il possède 2 vies. Faire en sorte que lorsqu’une bombe explose à portée du joueur, cela supprime une vie au joueur. Lorsque le joueur n’a plus de vies, il est mort et le jeu est terminé.

4.6  Bonus sous les caisses

Pour améliorer un peu la jouabilité, votre joueur peut rencontrer des bonus. Les bonus sont situés sous les caisses. L’explosion des caisses, sous l’effet d’une bombe, fait apparaitre les bonus. Vous devez ensuite gérer les modifications de votre joueur s’il ramasse un bonus. Vous devez gérer 2 types de bonus.

4.6.1  Bonus de puissance de bombe

Un bonus (+) augmente la puissance des bombes que le joueur va poser de 1. Un bonus (-1) diminu la puissance de 1. Un bonus en forme de bombe augement le nombre de bombes que le joueur peut poser simultanément. Un bonus en forme de bombe barré diminu le nombre de bombes de 1.

4.6.2  Bonus de vie

Un bonus de vie qui permet au joueur d’avoir une vie de plus. Pour cela il faudra modifier toutes les constantes nécessaires à l’image des autres bonus.

4.7  Monstres (random, évolution)

Vous vous rendrez vite compte que dans l’état actuel du jeu, les chances de gagner sont très élevées. Pour diminuer un peu les chances de gagner, vous devrez mettre en place des monstres. Comme pour les bonus, les monstres se cachent sous les caisses. Leurs déplacements seront entièrement aléatoires, ils ne pourront pas poser de bombes, et ne pourront pas pousser les caisses. Pour l’aspect technique, vous noterez que les monstres sont très similaires au joueur, vous modifierez donc le module du joueur, "player", pour faire en sorte qu’il puisse gérer à la fois un joueur ou un monstre.

4.8  Pause

Il est souvent utile de pouvoir mettre un jeu en pause avec la possibilité de reprendre le cours du jeu quelques instants plus tard. Pour ce faire, vous devrez faire en sorte que la touche "P" permette de mettre le jeu en pause puis de reprendre le cours du jeu en appuyant à nouveau dessus. Cette fonctionalité doit fonctionner correctement en présence de bombes et de monstres.

4.9  Questions supplémentaires

4.9.1  Sauvegarde / Chargement partie

On souhaite maintenant pouvoir enregistrer une partie en cours, en prenant soin d’enregistrer le joueur, les monstres, les bonus, ... Une fois que l’enregistrement sera effectué, il parait raisonnable de permettre de recharger la partie enregistrée. (Le choix du format d’enregistrement est laissé à votre discrétion)

4.9.2  Version multi-joueur

Pour aller encore plus loin dans la réalisation de ce jeu, ceux qui le souhaitent peuvent réaliser une version à deux joueurs avec un seul clavier. Certaines touches permettent de déplacer un joueur, d’autres un autre joueur. Le premier des deux joueurs qui atteint la cible gagne.

4.9.3  Gestion des collisions sur les bombes

On restreindra les déplacements de sorte qu’un joueur ou un monstre ne puisse pas passer par dessus une bombe.

4.9.4  Bonus lancement de bombes

On souhaite rajouter un bonus qui permet au joueur de lancer une bombe sur une case différente de la case sur laquelle il se trouve. La porté du lancement de bombe sera fixée, et la direction sera la même que celle du joueur.

4.9.5  Messages de fin

On souhaite maintenant que le jeu ne se termine pas par un message dans le terminal, mais directement par un message dans la fenêtre SDL.

4.9.6  Panneaux d’informations

Pour faciliter le jeu, on souhaite afficher, en continue, le nombre de bombe qu’un joueur peut poser, la porté des bombes, ... Pour cela on utilisera les fonctionnalités d’affichage de la SDL.

4.9.7  Flammes d’explosion de bombes

Pour agrémenter le jeux, on souhaite afficher des flammes lors de l’explosion d’une bombe, et ce sur toutes les cases dans lesquelles la bombe a une action.

4.9.8  Teleportation (bonus)

On souhaite créer un mode de déplacement du joueur, équivalent à de la téléportation. Quand on lance ce mode, le jeux est mis en "pause" jusqu’à ce qu’on ai sélectionné la case de destination.


This document was translated from LATEX by HEVEA.