-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrapport.tex
217 lines (203 loc) · 11.7 KB
/
rapport.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{graphicx} % Required for inserting images
\usepackage{wrapfig}
\graphicspath{ {./images_rapport/} }
\title{Projet de PI4 2023}
\author{Groupe ED1A :\\Laïdouni Mohamed, Boudelaa Fares, Khemakhem Ayman,\\ Friedmann Eliot, Ben Atia Necerine}
\date{Janvier - Mai 2023}
\begin{document}
\maketitle
\begin{enumerate}
\item Présentation du sujet
\item Parties du cahier des charges traitées
\item Représentation du projet
\item Problèmes rencontrés
\item Pistes d'amélioration
\item Conclusion
\end{enumerate}
\section{Présentation du sujet}
Le sujet, proposé par Enrica Duchi, consiste à réaliser un jeu inspiré du DoodleJump. Le DoodleJump est un jeu vidéo à un joueur, où le but est de monter le plus haut possible en sautant de plate-forme en plate-forme et en collectant des points.
\section{Parties du cahier des charges traitées}
Nous avons traité tout le contenu du cahier des charges minimal, c'est-à-dire implémenter les principales fonctions du DoodleJump :
\begin{itemize}
\item Le fait de sauter d'une plate-forme à l'autre.
\item Le fait de pouvoir prendre un jetpack ou un hélicoptère pour se faire transporter plus haut.
\item Le fait de pouvoir cumuler des points.
\item L'utilisation de la bibliothèque Swing pour l'interface graphique.\\
\end{itemize}
\section{Généralisations}
Comme suggéré dans le sujet, nous avons ajouté nombreux éléments à ce jeu :
\begin{enumerate}
\item Ajout de différents types de plate-formes :
\begin{itemize}
\item Plate-formes de base, fixes.
\item Plate-formes mobiles, qui bougent à l'horizontale et offrent un saut plus haut.
\end{itemize}
\item Ajout de divers items :
\begin{enumerate}
\item Des monstres :
\begin{itemize}
\item Toucher un monstre nous fait mourrir.
\item En revanche, sauter sur un monstre le tue et nous fait rebondir.
\item Tirer sur un monstre le tue.
\item Il existe différents types de monstres.
\end{itemize}
\item Des projectiles :
\begin{itemize}
\item On peut tirer des projetctiles depuis notre personnage.
\item Les projectiles servent à tuer les monstres.
\end{itemize}
\item Des pièces :
\begin{itemize}
\item Toucher une pièce augmente notre nombre de pièces.
\item Les pièces sont récoltées pour augmenter le score.
\end{itemize}
\end{enumerate}
\item Possibilité de passer d'un côté à l'autre de l'écran.
\item Possibilité de mettre le jeu en pause.
\item Possibilité de jouer avec de l'inertie.
\item Ajout d'une difficulté et de différents niveaux :
\begin{itemize}
\item Une difficulté croissante qui intervient sur le type des plate-formes, sur l'écart entre celles-ci, sur la vitesse des plate-formes mobiles et sur le nombre de monstres.
\item Quatres niveaux de jeu, qui interviennent sur l'accroissement de la difficulté (au niveau 4, le jeu devient rapidement difficile).
\end{itemize}
\item Possibilité de jouer avec différents "skins", créés avec des thèmes.
\item Un système de paramétrage :
\begin{itemize}
\item Choix du niveau.
\item Choix du skin.
\item Choix du jeu avec ou sans inertie.
\end{itemize}
\item Possibilité de jouer à deux :
\begin{itemize}
\item C'est un mode course qui se termine dès que l'un des joueurs à perdu.
\item Dans ce mode de jeu, le score et les pièces ne sont pas comptées.
\begin{itemize}
\item Soit sur le même ordinateur.
\item Soit en réseaux (mode multi-joueurs).
\end{itemize}
\end{itemize}
\item Ajout d'un identifiant pour le joueur :
\begin{itemize}
\item Cet identifiant est local.
\item Il est créé si le joueur n'a jamais joué de parties, sinon on reprend le même.
\item Chaque joueur possède donc un unique identifiant.
\end{itemize}
\item Ajout d'un nom pour le joueur :
\begin{itemize}
\item Le nom peut-être changé à chaque partie.
\item Le nom n'influe pas sur l'identifiant du joueur.
\item Le nom par défaut est celui utilisé lors de la dernière partie, ou "Mizer".
\item Le nom apparaît au-dessus du personnage pendant la partie, permettant de différencier les joueurs lors des parties à deux.
\end{itemize}
\item Un système de classement et d'historique de parties :
\begin{enumerate}
\item L'historique de parties :
\begin{itemize}
\item L'historique est local.
\item Il sauvegarde l'identifiant, le nom et le score du joueur à chaque parties dans un fichier "history.csv".
\item Il est utilisé pour connaître les données du joueur à la dernière partie, ainsi que son meilleur score.
\end{itemize}
\item Le classement :
\begin{itemize}
\item Le classement est global.
\item Il sauvegarde l'identifiant, le nom et le score de tous les joueurs pour chacunes de leur parties dans un fichier "classement.csv".
\item Il permet d'afficher les 10 meilleurs scores historiques, tout joueur confondu.
\end{itemize}
\end{enumerate}
\end{enumerate}
\section{Représentation du projet}
\subsection{Représentation des fichiers}
Le code constituant notre projet est divisé entre 4 répertoires :
\begin{itemize}
\item gameobjects/: contenant tous les fichiers responsables des parties.
\begin{itemize}
\item GameObject : (Abstraite) Représente les différents types d'objets d'une partie, par des coordonnées et des dimensions.
\item Personnage : Représente un personnage. C'est l'objet principal du jeu, un GameObjet avec une vitesse en x et en y.
\item Plateforme : (Abstraite) Représente une plate-forme. C'est un GameObjet avec un saut.
\item PlateformeBase.
\item MovingPlateforme : C'est une plate-forme avec un vitesse en x et un saut plus important.
\item Projectile : Représente un projectile. C'est un GameObject avec une vitesse en x et en y.
\item Monstre : Représente un monstre. C'est un GameObject avec une vitesse en x, une santé et un identifiant.
\item Items : (Abstraite) Représente un item. C'est un GameObjet avec un saut.
\item Fusee et Helicoptere : Représente des items qui apportent un saut plus haut.
\item Coins : Représente une pièce. C'est un item.
\item Joueur : Représente un joueur avec comme attributs son identifiant, son nom, son score et son personnnage.
\item Terrain : Représente le terrain d'une partie dans son intégralité. Cette classe fait le lien entre les différents composants d'une partie.
\end{itemize}
\item gui/ : contenant les fichiers responsables de l'affichage, ainsi que les images et le fichier App.
\begin{itemize}
\item App : Lance le jeu.
\item Vue : Composant (JPanel) qui se charge de l'affichage des éléments.
\item Etat : Représente un état du jeu.
\begin{itemize}
\item MenuDemarrer : Représente l'accueil.
\item MenuSetting : Représente le menu de paramétrage.
\item MenuClassement : Représente le classement (graphiquement).
\item MenuLancement : Représente le menu de paramétrage de début de partie.
\item Game : Représente une partie.
\item MenuFin : Représente l'écran de fin de partie.
\end{itemize}
\item images/ : Contient toutes les ressources images du jeu.
\end{itemize}
\item leaderboard/ : contentant les fichiers responsables de la sauvegarde des scores.
\begin{itemize}
\item leaderboard : (Abstraite) Représente un gestionnaire de fichier ".csv" pour le classement ou l'historique, avec une méthode pour lire et ajouter une ligne à un fichier.
\item classement : Un LeaderBoard qui gère le fichier "classement.csv".
\item history : Un LeaderBoard qui gère le fichier "history.csv".
\item classement.csv
\item history.csv
\end{itemize}
\item multiplayer/ : contenant les fichiers responsables du jeu en réseaux.
\begin{itemize}
\item JoueurConnecte : classe qui gere le coté du client, contient un socket et les methodes pour envoyer et recevoir les données.
\item Serveur: classe qui gere le coté du "host", contient un serveursocket les methodes pour envoyer et recevoir les données.
\item ThreadMouvement : un Runnable pour gere le thread du multijoueur.
\end{itemize}
\end{itemize}
\subsection{Représentation graphique du projet}
\begin{figure}[h]
\centerline{\includegraphics[scale = 0.4]{images/diagramme.png}}
\caption{Liens d'héritage entre les différentes classes}
\end{figure}
\section{Problèmes rencontrés}
\begin{itemize}
\item Les principaux problèmes sont liés au mode multijoueur ou réseau, notamment un problème au niveau des threads. En effet, avec le système actuel, nous utilisons des JOptionPane pour "bloquer" le thread de Java Swing afin de nous assurer que le joueur client se connecte. Pour éviter cela, il serait possible de rajouter une variable booléenne volatile hasStarted dans la méthode run de la classe ThreadMouvement. De plus, il y a des problèmes de latence avec le jeu en cross-plateforme, par exemple, lorsque l'hôte est sur Linux et que le client est sur Windows. Cela entraîne une augmentation significative de la latence, rendant le jeu pratiquement injouable.
\end{itemize}
\section{Pistes d'amélioration}
Voici plusieurs idées pour améliorer notre jeu. Celles marquées par (*) sont des idées que l'on a essayé de mettre en place mais qui nous ont posé problème :
\begin{itemize}
\item Ajout d'un magasin : (*)
\begin{itemize}
\item Le magasin serait une interface où l'on pourrait acheter et personnaliser les skins de son personnage, pour chaque pack de skin disponible.
\item À la base, les pièces (Coins.java) devaient servir à s'acheter des skins dans le magasin.
\item Par manque de temps, et à cause de la complexité de ce système d'achat, nous avons changer l'utilisation des pièces (comme dit en section 3.2).
\end{itemize}
\item Ajout d'une sauvegarde des paramètres :
\begin{itemize}
\item Les paramètres (niveau, skin, inertie) seraient sauvegardés dans un fichier, comme l'historique.
\item Idée que nous avons eu trop tardivement pour pouvoir la mettre en place.
\end{itemize}
\item Ajout d'autres items de type "booster" :
\begin{itemize}
\item ressorts
\item trampoline...
\end{itemize}
\item Ajout d'autres types de plate-formes :
\begin{itemize}
\item plate-formes qui se cassent lorsqu'on saute dessus et qui ne font pas rebondir.
\item plate-formes qui disparaissent après une utilisation.
\item plate-formes mobiles dans le sens vertical.
\item plate-formes qui, lorsque l'on saute sur l'une d'entre-elles, fait bouger toutes les plate-formes du même type.
\end{itemize}
\item Possibilité d'avoir plusieurs vies :
\begin{itemize}
\item Idée proposée par le sujet, mais non retenue pour garder une certaine difficultée du jeu.
\end{itemize}
\item Ajout d'un (vrai) mode multi-joueurs en réseau : (*)
\begin{itemize}
\item Le mode multi-joueurs actuellement disponible ne fonctionne qu'avec 2 joueurs. L'idée de base était de le faire fonctionner pour plusieurs joueurs. Mais suite à des problèmes (section 5), nous n'avons pas pu le mettre en place.
\end{itemize}
\end{itemize}
\end{document}