Académique Documents
Professionnel Documents
Culture Documents
PROJET C++
SNOOPY’S REVENGE
Professeurs :
Florent DIEDLER Auteurs :
Jean-Pierre SEGADO Maxime REMY
Pierre MOREAU
Equipe : 709
29 Novembre 2015
Table des matières
0 Introduction 4
1 Organisation 5
1.1 Planning.....................................................................................................5
1.2 Répartition des tâches................................................................................5
2 Conception 7
2.1 Les classes.......................................................................................................8
Vecteur2D........................................................................................................8
Dessinable........................................................................................................8
Snoopy.............................................................................................................9
Case..................................................................................................................9
Balle.................................................................................................................9
Plateau...................................................................................................9
Jeu..............................................................................................................9
Partie.....................................................................................................9
Menu................................................................................................................9
Timer..........................................................................................................9
2.2 Graphe d’appel................................................................................................9
2.3 Analyse Chronologique et Descendante..................................................11
2.4 Documentation.........................................................................................12
3 Scénarios 14
Structures, defines et conception modulaire...........................................14
Menus et paramètres................................................................................14
Charger Partie/Code...........................................................................15
High Score.....................................................................................................16
Game Over...............................................................................................16
Musiques et effets sonores en stéréo............................................................17
Temps.............................................................................................................17
Moteur de jeu...........................................................................................17
Balle...............................................................................................................18
Case................................................................................................................18
Interface.........................................................................................................19
Save................................................................................................................19
1
Projet C++ 2015-2016 Equipe 709 : Remy & Moreau
Debug.............................................................................................................20
4 Problèmes rencontrés 21
Tests.........................................................................................................21
Accessibilité et Navigabilité entre objets................................................21
Mono-existence des ressources graphiques..................................................21
Collisions.......................................................................................................23
5 Conclusion 24
Références 25
TABLE DES MATIÈRES 2
Table des images
3
Partie 0
Introduction
Le projet
L’équipe
Notre équipe était constituée de 2 élèves dont l’un avait déjà une bonne
expérience en C++ :
— Pierre Moreau (CP)
— Maxime Remy
Cela nous a permis de créer le squelette du projet rapidement et exhaustive-
ment avec pour ambition de programmer un jeu jouable répondant au cahier des
charges (CDC) aussi bien sur console que sur allegro.
4
Partie 1
Organisation
1.1 Planning
Le projet s’est déroulé du 02/11/15 au 01/12/15. Pierre connaissant déjà la
structure du C++ il a pu aider l’équipe en expliquant rapidement les différences
avec le code C, ce qui a considérablement avancé le début de la phase de pro-
grammation. Vous pouvez trouvez ci-dessous un diagramme de Gant pour plus de
détails.
5
Projet C++ 2015-2016 Equipe 709 : Remy & Moreau
Conception
7
Projet C++ 2015- Equipe 709 : Remy &
PARTIE 2. 8
Projet C++ 2015- Equipe 709 : Remy &
Snoopy Personnage principal du jeu, snoopy doit avoir des méthodes spéci-
fiques à ses actions.
Case Représente une case du plateau de jeu. Cette case a donc des coordonnées,
un type (les différents types sont défini par des macros dans config.h), et des
méthodes qui permettent de la déplacer, de la modifier, et de l’afficher.
Balle Afin que la balle puisse se déplacer lentement en fonction des timers, sa
position et sa vitesse sont des réels.
Jeu Gère la boucle de jeu. Elle encapsule donc tous les autres éléments présentés
ci-dessus, et répond des commandes de l’utilisateur.
PARTIE 2. 9
Projet C++ 2015- Equipe 709 : Remy &
PARTIE 2. 1
Projet C++ 2015- Equipe 709 : Remy &
PARTIE 2. 1
Projet C++ 2015- Equipe 709 : Remy &
ACD de niveau
2.4 Documentation
Nous avons généré une documentation que nous avons mis sur un serveur de
Pierre, accessible en ligne via son domaine : http : ://snoopy.photeine.com .
Il est possible de naviguer de manière interactive à travers tous les éléments
composants le projet. Pour chaque classe et fonctions, un descriptif détaillé ainsi
que des diagrammes de relations et d’appel permettent de comprendre les imbri-
cations les plus compliquées.
Nous vous encourageons vivement à aller la visiter.
PARTIE 2. 1
Projet C++ 2015- Equipe 709 : Remy &
PARTIE 2. 1
Partie 3
Scénarios
Menus et paramètres
Lorsque le jeu se lance, un menu proposant au joueur d’activer le mode
graphique (allegro) ou le mode console.
14
Projet C++ 2015- Equipe 709 : Remy &
C’est d’ici qu’il peux commencer une nouvelle partie, charger une partie
sauvegardé précédemment, commencer à partir d’un niveau précis, consulter les
meilleurs scores et quitter le jeu. Nous avons bien sur fait en sorte que le menu
s’adapte à la position du joueur dans la partie. Nous avons une pause qui fige le
jeu jusqu’à l’annulation de celle-ci. De plus si le joueur veut quitter la partie, il
doit simplement appuyer sur la touche escape. Il choisira à ce moment là s’il veut
sauvegarder sa partie ou non.
Charger Partie/Code
Un joueur, en sélectionnant ces options, va se voir demander soit un code
pour charger le niveau correspondant où un pseudo pour retrouver une partie
précédemment sauvegardée.
Toutefois si le code ou le pseudo ne marche pas le jeu envoi un message
d’erreur
PARTIE 3. 1
Projet C++ 2015- Equipe 709 : Remy &
High Score
L’option meilleurs score du menu permet au joueur d’afficher les 5
meilleurs score enregistrés par ordre décroissant.
Pour cela le jeu charge un fichier où tout les scores sont enregistrés avec le
pseudo associé puis les tris selon le score et enfin les affiche.
Cette fonction se met à jour dés qu’on l’appelle et de ce fait prend en compte
même les scores enregistrés pendant l’exécution du programme.
Game Over
Lorsque les vies du joueur tombent à 0, la partie se termine sur un écran de
game over : la musique ralentit rapidement en même temps que l’écran se remplit
de noir qui se renferme sur le vaisseau. Le jeu affiche à ce moment là le score du
joueur et lui demande s’il veut sauvegarder.
PARTIE 3. 1
Projet C++ 2015- Equipe 709 : Remy &
Temps
Le joueur doit finir le niveaux en moins de 60 secondes sous peine de perdre
une vie.
Le temps restant au joueur est indiqué dans les modes à droite du plateau.
Toutefois dans le cas d’allegro nous avons ajouté une barre de progression en
dessous qui avance au fur et à mesure que le temps passe.
Afin que le jeu se déroule toujours à la même vitesse et que le temps soit
mesuré précisément, nous avons implémenté des timers pour créer un moteur de
jeu pour allegro et pour la console.
Moteur de jeu
L’utilisation de timers permet d’avoir une vitesse d’exécution constante,
peux importe le nombre de calculs qu’il y a à faire, et sur toutes les machines.
Le fonctionnement est axé autour de cet exemple, dans lequel game_time est
une variable globale, gérée en temps que timer, qui compte le temps réel en ms
(remis à zéro chaque seconde).
PARTIE 3. 1
Projet C++ 2015- Equipe 709 : Remy &
1 game_time=0;
2 while(!key[KEY_ESC])
3 {
4 while(game_time>0)
5 {
6 // Calculs...
7 game_time--;
8 }
9 // Affichage...
10 }
Pour cela : au début de chaque boucle le programme calcule le temps que prends
les instructions, et effectue autant de fois qu’il faut les affichages afin que le
nombre d’instructions reste constant dans une seconde. Le nombre d’affichage par
seconde n’est donc lui pas constant.
J’ai suivi pour cela le tutoriel d’Emeric POUPON, qui nous a été retransmit
par notre professeur.
Balle
Les balles sont les "ennemis" du joueur. Elles se déplacent diagonalement
dans le niveau en rebondissant sur les éléments du décor. A chaque fois qu’elles
touchent Snoopy le joueur perd une vie. De façon surprenante c’est ce qui nous a
donné le plus de mal a implémenter. Toutefois nous avons réussi la programmer
pour qu’elle fonctionnent aussi bien sur allegro que sur console.
Case
Une case représente une case du plateau de jeu. Elle peux être soit vide, soit
un bloc, soit un oiseau, soit un bonus.
Pour la gestion des cases nous avons créé une classe, et le polymorphisme.
En effet une case se traite et se comporte de la même manière sous allegro ou
sous console. Ce n’est que lors de l’affichage avec la méthode virtuelle dessine()
héritée de DESSINABLE que le traitement prendra en compte le mode de graphisme.
En effet celles-ci pouvant changer selon si le joueur les a touchées ou pas
nous devions faire pouvoir établir un programme qui peut changer leur types dy-
namiquement. La classe encapsule donc un caractère pour définir son type, et les
différents types sont définie en macros.
PARTIE 3. 1
Projet C++ 2015- Equipe 709 : Remy &
Interface
Une procédure est spécialement dédiée à l’affichage des informations elle
détecte automatiquement si elle est en allegro (comme toutes nos fonctions d’affi-
chage) pour adapter son affichage.
Durant une partie, plusieurs informations sont affichées :
1. titre
2. commandes principales
3. vies restantes
4. temps restant
5. points
6. variables activées (pause, invincibilité,...)
7. Courte description des objectifs (allegro uniquement)
PARTIE 3. 1
Projet C++ 2015- Equipe 709 : Remy &
Sav
e
Comme dit précédemment le joueur peut sauvegarder en cours de partie et
revenir au menu grâce à la touche S.
Quand il choisit de faire cela un menu apparaît lui demandant si il veut
vraiment sauvegarder, puis sous quelle pseudo le faire. Il faut savoir que si le jeu
n’arrive pas à sauvegarder un message d’erreur le signalant s’affiche.
Debug
Afin de pouvoir tester le jeu, il est possible de commencer directement à un
niveau,et l’on peut passer en mode invincible grâce à la touche G.
PARTIE 3. 2
Partie 4
Problèmes rencontrés
21
Projet C++ 2015- Equipe 709 : Remy &
Nous voulions pouvoir avoir accès aux ressources graphiques dans chaque objet
dessinable, sans avoir à dupliquer ces ressources.
En effet, si l’on partage un pointeur vers la ressource allouée en mémoire, il
faut la dupliquer pour chaque objet afin qu’elle ne soit pas détruite en sortie de
bloc. Étant donné qu’une bibliothèque d’images et de musiques est volumineuse,
nous voulions à tout prix éviter cela.
Nous nous sommes intéressés aux pointeurs intelligents boost::shared_ptr
qui permettent de partager une ressource entre plusieurs pointeurs, et de ne la
supprimer que lorsque le dernier pointeur est supprimé. Mais implémenter cela
c’est avéré très compliqué, et nous nous sommes tournés vers la solution actuelle :
un namespace.
Le namespace BIB englobe et protège la gestion des bibliothèques. Une va-
riable externe est source d’erreurs et d’attaques de sécurité, mais ici, elle n’est
utilisable qu’en connaissant le nom du namespace. Cela a garanti une fiabilité
dans l’implémentation du code. De plus, le namespace BIB englobe les fonctions
nécessaires à la gestion mémoire des ressources graphiques.
1 /***************************************************************************//**
2 * \namespace BIB
3 * \brief Gestion des bibliotheques de sons et d’images
4 *
5 * BIB donne acces aux bibliotheques d’images et de sons,ainsi qu’a leur
6 * construction et destruction.
7 ******************************************************************************/
8 namespace BIB
9 {
10 extern bool alleg; ///< Booleen pour connaitre le mode graphique
11 extern SOUND_GALLERY* sons; ///< gallerie globale de sons
12 extern BITMAP_GALLERY* images; ///< gallerie globale d’images
13
PARTIE 4. PROBLÈMES 2
Projet C++ 2015- Equipe 709 : Remy &
Collisions
Enfin, nous avons rencontrés rapidement un problème au niveau du système
de collision. En effet les balles doivent rebondir sur les faces et les arêtes des
blocs du plateau.
Nous avions initialement prévu un algorithme fonctionnant parfaitement
sous console, mais lorsque la balle devait être représentée par une image plus
petite qu’un bloc sous allegro, les rebonds ne s’effectuaient pas comme prévu. Il a
fallu prendre en compte la largeur de la balle, ainsi que la taille des cases dans le
calcul du déplacement afin que cela fonctionne correctement. De plus, ces
considérations ont dues être implantées intelligemment dans les calculs afin de ne
pas gêner le déplacement sous console, et que les traitements soient les mêmes.
PARTIE 4. PROBLÈMES 2
Partie 5
Conclusion
Bilan de Maxime
C’est dans le cadre de ce projet que j’ai pu vraiment comprendre l’intérêt
d’un langage de programmation orienté objet. Il m’a aussi permis de me
familiariser avec la syntaxe et la conception du C++ qui est un langage très
nouveau pour moi. Enfin Pierre m’a introduit à la magnificence de LATEX qui
deviendra proba-
blement mon support de rapport principale.
Bilan de Pierre
J’ai poussé encore plus loin la programmation modulaire avec l’utilisation
de structures, de #define, et bien sûr d’objets, afin de coder un programme
concis, modulaire et dynamique. Avec une bonne conception, l’ajout d’une
fonctionnalité ou d’un objet se fait sans redondance de code. Même si le
programme doit pouvoir se dérouler de plusieurs manières.
J’avais appris à coder en LATEX durant mes vacances, j’ai donc pu
enfin rédiger un rapport complet avec ce langage. J’ai donc appris pleins de
nouvelles commandes et je me sens beaucoup plus à l’aise avec le LATEX
maintenant. Par exemple, je me suis rendu compte que même en LATEX, la
compilation modulaire
2
s’avère très utile.
2
Références