Princess Lemming
- Encadrants: Eric GASCARD
- Elèves RICM3: Patrick PEREA (chef de projet),Rama CODAZZI,EL Hadji Malick FALL,Tianmao LAN,Ombeline ROSSI,Ye XIA
- File:NomProjetLemming-Flyer.pdf
- File:NomProjetLemming-Poster.pdf
- File:NomProjetLemming-Presentation.pdf
- File:NomProjetLemming-ScreenCast.wav
- Dépôt des sources
Description (Contrat)
Ricommings est un jeu vidéo de réflexion dans lequel l’utilisateur doit mener de petits pingouins appelés Ricommings, jusqu’à la sortie. Il dispose pour cela d’un panel d’actions à leur faire réaliser, afin qu’ils interagissent avec leur environnement. Celui-ci est truffé de situation à première vue inextricables. Dans le jeu de base, le niveau est réussi lorsqu’un certain pourcentage de Ricommings atteint la sortie. Cet objectif est inscrit en bas de l’écran. Un timer indique également le temps restant pour réussir le niveau. Dans le second mode, seul le dernier Ricomming, un pingouin femelle, doit atteindre la sortie. Ses prédécesseurs ne sont destinés qu'à lui ouvrir la voie.
Voici le contrat de base qui a été fixé :
. Jeu de base = Lemmings . Gestion du temps : Timer, Accélération, Pause . Explosion des pingouins restants (nuke) . 2 modes de jeu : Lemmings de base (sauver un certains pourcentage de Lemmings) / sauver une princesse (qui ne sait que marcher) . Sauvegarde/Reprise d'une partie
En extension :
. Objets actifs : pièges,monstres,portes
Architecture
Manuel Utilisateur
I- Fonctionnalités et détails
1- Dans les deux modes
Les Ricommings, lors de leur arrivée dans le niveau, se déplacent systématiquement vers la droite. Face à un mur, ils opèrent un demi-tour. Lorsqu’ils rencontrent du vide, ils chutent ; et meurent en rencontrant le sol s’ils tombaient à une trop grande vitesse. Nous rappelons que la chute accélère au fur et à mesure que le temps s’écoule. Un timer indique dans quelle durée il faut réussir l’objectif défini. Si le temps imparti est écoulé, le jeu s’arrête. En plus des boutons d’action des Ricommings, l’utilisateur dispose de plusieurs autres fonctionnalités :
2- Dans le second mode
Les Ricommings doivent assurer ici la sécurité de la Ricomming, qui n’est pas capable d’interagir avec le niveau et ne fait que suivre ses congénères masculins. Ces derniers doivent tout faire pour qu’elle arrive saine et sauve à la porte.
II- Installation
Ricommings nécessite d’avoir OCaml et la Machine Virtuelle Java (JVM) en version 1.7. Ensuite, il faut extraire le fichier .zip. Vous obtiendrez alors un dossier nommé « Ricommings » contenant un script d'exécution qu’il suffira juste de lancer (init.bat sous Windows ou init.sh sous Linux). Ce dossier contient également le fichier de configuration input.ml qui respecte toute la syntaxe du langage d’entrée du jeu mais qui reste éditable sous certaines conditions formelles à respecter cependant : Vous ne devez en aucun cas définir une action différente de celles spécifiées ci-dessus : angel,bash,bashEnd,bridging,climb,climbing,die,digging,explose,fall,falling,float,floating,gone,leave,leave,list,miningfloat,floating,gone,leave,mining,turnback,turnBack_blocker,walk,walkAC, walking.
Il en est de même pour les conditions que sont : hole,out of map,wall,exit,ground,wall + could climb,wall + could bash,blocker,ground+fast,could float,emptiness,cannot climb,climb,angel,bomb,bridge,get to ground,get to top,ground + fast,end,no wall.
En ce qui concerne les id des états, ils doivent obligatoirement compris dans l’intervalle [0;11]. Les modes du jeu sont facile ou difficile et les natures des Lemmings bon ou princesse. Pour le reste des éléments, il vous convient de les définir comme bon vous le semble tant qu’ils restent cohérents.
III- Utiliser le jeu
Le menu présente plusieurs options :
● Charger une sauvegarde
● Choisir le mode de jeu
● Choisir un niveau correspondant à une map
Manuel Développeur
INTRODUCTION
Ce manuel donne toutes les informations nécessaires à la compréhension du jeu Ricommings telles que les conventions de codage utilisées. Le jeu Ricommings reprend les mêmes principes que le jeu Lemmings mais avec des spécificités particulières.
L’utilisateur remplit des données dans un fichier Caml afin de définir tous les paramètres requis dans le jeu, notamment les comportements des Ricommings . L’évolution de ceux-ci se fera à partir d’algorithmes implémentés en Java. La partie pourra être visualisée par l’utilisateur via une interface graphique.
L’architecture globale de notre programme est décrite par le graphe suivant :
PARTIE 1
1- Structure du fichier Ocaml
Le fichier Ocaml input.ml est destiné à être rempli par l’utilisateur qui doit respecter la grammaire de ce langage et les types tels qu’ils ont été définis. Ces types sont invariables. Le non-respect de ceux-ci entraîne une erreur d'exécution lors de la génération du fichier XML par le fichier parser.ml.
Voici la structure des types à respecter :
2- Ecriture du fichier XML
Pour générer le fichier XML, un parser n’est pas nécessaire (pas de manipulation de flux), ni une redéfinition de type sous forme de token. Il suffit juste de faire un appel à la fonction ecriretout qui permet d’écrire dans le fichier XML toutes les informations qui ont été saisies par l’utilisateur dans les structures prédéfinies.
Il faut cependant veiller à ne pas oublier ces deux instructions :
1. open String;; Cette instruction permet de faire un appel au module String qui fournit des fonctions pour manipuler les chaînes de caractères dont la fonction 'length' qui permet de calculer la taille des chaînes données en entrée par l’utilisateur.
2. let canalsorti = open_out "Parser.xml";; Cette ligne indique le fichier XML à créer ou à écraser s'il existe déjà.
La fonction ecriretout comporte trois sous-fonctions majeures :
→ ecriretoutmode permet de dérouler la liste des modes contenant chacune d’elles la map correspondante ainsi que le nombre de lemmings et leurs caractéristiques
→ ecriretoutcomportement qui décrit la liste des comportements à qui sont associés chacun un et un seul automate
Ces fonctions utilisent elles-mêmes des fonctions intermédiaires qui sont adaptées à d’éventuelles modifications (par exemple ajout de nouveaux attributs). Lorsque les types ont été respectés par l’utilisateur, le fichier XML est généré sans problème comme cela est visible dans l’exemple suivant :
Dans le cas contraire, un message d’erreur est généré pour indiquer le bon type à utiliser.
PARTIE 2
1- Architecture du logiciel
Le logiciel est basé sur une architecture MVC (Modèle-Vue-Contrôleur). Il est découpé de la façon suivante :
Le modèle assure la gestion des événements et le fonctionnement des automates.
Le contrôleur déclenche les événements et informe des changements au modèle.
La vue gère l’affichage du jeu.
2- Organisation du code
Le code est découpé en plusieurs paquets:
→ Interface
Le package Interface comprend l’ensemble des classes nécessaires à l’affichage de l’interface graphique et le passage de fenêtre en fenêtres. La classe Menu regroupe tous les boutons que l’utilisateur peut utiliser depuis le menu principal. La classe JavaClip s’occupe de la musique qui tourne dans notre jeu. Enfin, la classe MainWin est classe s’occupant de la fenêtre de jeu. Cette même classe est utilisée que ce soit pour le mode FACILE ou DIFFICILE.
→ Model
Le package Model Comprend toutes les classes nécessaires à l’animation des personnages et la mise à jour de la map. Ainsi la classe D_Lemming s’occuper des données relatives aux lemmings (position, attribut climber ou floater etc), la classe G_Lemming s’occupe de l’affichage d’un lemming, c’est-à-dire de l’animation des sprites etc. De la même façon, la classe D_Background s’occupe des données relatives à l’image de fond, comme le tableau de booléens (pour indiquer le sol ou murs sur la map, 0 pour indiquer le vide), ainsi que des méthodes permettant de déterminer si un lemming donné est en présence d’un mur, dans le vide etc. La classe G_Background contient toutes les méthodes permettant de mettre à jour l’affichage de la map comme G_Remove(). Cette méthode permet de peindre par-dessus la map lorsqu’un lemming effectue une action telle que digger, miner etc...
→ Interpréteur Ce paquet gère le fichier XML donné en entrée. La classe Parser récupère tous les nœuds et attributs du fichier XML. Ainsi, les objets automates entre-autres sont créés à partir de celui-ci.
→ StateMachine
Il regroupe toutes les classes relatives au fonctionnement de l’automate et les structures qui permettent de l’implémenter :
- StateMachine qui représente l’automate
- StateMachineList qui est une liste d’automates
- Etat qui est l’association d’un id, d’un nom et d’une image
- EtatList qui gère une liste d’états
- Transition assure la création des transitions de l’automate à partir d’un état de départ, d’un état d’arrivée, d’une condition et d’une liste d’actions, ainsi que leur gestion.
- TransitionList régit une liste de transition
- Action qui est une classe abstraite dont hérite toutes les autres classes qui gèrent les actions que les Lemmings peuvent effectuer
- ActionList implémente une liste d’actions
→ Serializing
Ce package ne comprend que la classe Sauvegarde qui contient deux méthodes gérant l’enregistrement des parties : save pour la sauvegarde et load pour le chargement.
3- Hiérarchie des classes
L’organisation des classes se présente comme suit :
Nous avons défini 6 classes permettant d’implémenter l’automate qui vient d’être présenté. Les états, transitions et actions sont récupérés à partir du XML.
Un automate est composé d’un Etat courant, d’une liste d’Etat et d’une liste de transitions. Nous avons implémenté la liste des états par une ArrayList d’objets de la classe Etat, et la liste des transitions par une ArrayList d’objets de la classe Transition. Les états de l’automate sont par exemple, Walker, Floater, Climber etc…Un état est représenté par son identifiant qui est un int, son nom qui un String, et le nom du sprite correspondant. Par exemple pour l’état Walker, on aura l’image walker.gif. Une transition est composée d’un état de départ, d’un état d’arrivée et d’une condition qui est un String, et d’une liste d’Actions.
La classe Automate contient une méthode step() qui récupère toutes les transitions correspondant à l’état courant de l’automate et, pour chaque transition vérifie si les conditions sont réunies pour exécuter cette transition. Cette méthode est appelée pour chaque lemming depuis la boucle principale du jeu. En fonction de la transition exécutée la méthode step() exécute les actions correspondantes à la transition en appelant la méthode run() et met à jour l’état courant de l’automate.