208 lines
10 KiB
TeX
208 lines
10 KiB
TeX
\documentclass[12pt,a4paper]{article}
|
|
|
|
\usepackage{amsmath}
|
|
\usepackage{listings}
|
|
\usepackage{tikz}
|
|
\usepackage{csquotes}
|
|
|
|
\begin{document}
|
|
|
|
\title{Rapport du projet informatique 2023 \\ "Road to Master"}
|
|
\author{Debucquoy Anthony \and Matteo Di Leto}
|
|
\date{May 2023}
|
|
|
|
\maketitle
|
|
\newpage
|
|
|
|
\tableofcontents
|
|
\newpage
|
|
|
|
|
|
\section*{Introduction}
|
|
|
|
Lors de ce deuxième quadrimèstre, le projet Informatique proposé par notre université fut une partie intégrante de notre emploi du temps.
|
|
Régulièrement nous nous sommes rassemblés pour nous organiser et trouver une direction dans laquelle nous voulions voir notre projet évoluer.
|
|
Grace aux objectifs fixés par nos enseignants, nous sommes - je le pense - maintenant plus apte à nous confronter à ce genre d'objectifs. Tant au niveau personel qu'en tant que groupe.
|
|
Il va sans dire que comme pour tout projets, notre chemin a été semé d'embuches. En l'occurence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter.
|
|
Nous lui souhaitons une bonne reconversion.
|
|
|
|
\section*{Objectifs}
|
|
|
|
Voici l'objectif fixé par nos enseignants. (document de consignes)
|
|
|
|
\begin{displayquote}
|
|
|
|
Le but final de ce projet est de réaliser une application graphique en Java permettant de
|
|
jouer au jeu "Cats Organized Neatly". Ce jeu est un jeu de type "puzzle" où le joueur doit
|
|
placer des pièces de formes différentes pour combler l'aire de jeu. L'application devra permettre
|
|
de sauvegarder et charger une partie et de créer des niveaux automatiquement.
|
|
|
|
\end{displayquote}
|
|
|
|
\newpage
|
|
|
|
\section{Organisation}
|
|
|
|
Lors de nos rasemblement pour le projet, toutes les idées émises se sont retrouvés sur un blog afin de pouvoir y accéder de manière efficace.
|
|
Ce blog nous sert également à garder une trace de l'évolution du projet.
|
|
|
|
\subsection{Choix}
|
|
|
|
\begin{itemize}
|
|
\item{le VCS git pour garder une trace de l'avancement du projet. Avec comme remote une instance privée de gitea nous permettant de vérifier les MR/PR plus efficacement.}
|
|
\item{Une instance de DroneCI permettant de vérifier que le projet soit toujour compilable et que les tests ne soient pas ratés sans que nous nous en rendions compte.}
|
|
\item{Javafx, comme recommendé par nos enseignants.}
|
|
\item{Les pieces et niveaux sont stockées sous forme de matrice de booléen}
|
|
\item{Un parser de fichiers efficace et donnant des fichier légers.}
|
|
\end{itemize}
|
|
|
|
\subsubsection*{Shapes}
|
|
|
|
Les pieces ainsi que la carte sont représentés par une matrice de booléen \verb|boolean[][]|.
|
|
Nous avons donc une classe \verb|shape|, parent de \verb|Map| et de \verb|Piece| dans lequel nous stockons notre matrice.
|
|
Ensuite, \verb|Map| Contient une liste de \verb|Piece|. Ces pièces contiennent une position représentée par la classe\verb|Vec2|.
|
|
Cette position est la position du caré supérieur gauche dans la \verb|Map|.
|
|
Avec toutes ces informations nous avons le nécéssaire pour le moteur du jeu.
|
|
|
|
Il est facilement possible de manipuler la carte et les pièces. Il nous suffit alors de faire corespondre l'affichage avec
|
|
ces différentes classe. Ce qui est entrepris par la classe \verb|GameUI|.
|
|
|
|
Le tout est géré par la classe \verb|Controller| qui permet de choisir entre l'affichage d'un menu ou d'une partie en cours.
|
|
|
|
\subsection{Difficultés}
|
|
|
|
\section{Points Forts}
|
|
|
|
\subsection{Parser de fichiers}
|
|
|
|
Pour la rétention des niveaux, plusieurs possibilités s'offraient à nous. Nous avons alors décidés d'accomplir une série d'objectifs propre à notre projet avec un parser de fichiers dédié.
|
|
Nous voulions que ce parser accomplisse les objectifs suivants:
|
|
\begin{itemize}
|
|
\item{Les données du niveau seront encapsulées dans un header/footer pour laisser la possibilité d'enregistrer plus d'informations (images/musiques) dans un seul fichier dans le futur.}
|
|
\item{La taille du fichier devra être aussi petite que possible, tout en gardant les informations nécéssaire au bon fonctionnement du jeu.}
|
|
\item{Il sera possible d'enregistrer l'état d'une partie en cours.}
|
|
\end{itemize}
|
|
|
|
Ce parser est implémenté par la classe \verb|BinaryParser|.
|
|
|
|
\subsubsection*{spécification}
|
|
|
|
\begin{description}
|
|
\item[Header/Footer]{ Les données du niveau commencent par les 3 \emph{caractères} 'S', 'M', 'S' (ou \verb|0x534D53|) et se terminent par les 3 \emph{caractères} 'S', 'M', 'E' (ou \verb|0x534D45|)}
|
|
\item[Taille de carte]{ Le premier octet des données représente la largeur de la carte, le second sa hauteur.}
|
|
\item[Forme de la carte]{ Chaques cellules de la carte est représenté par un 1 ou un 0. le 1 représente un emplacement libre, un 0 une cellule vide.
|
|
La forme de la carte peut alors être répartie sur un nombre indéterminé d'octets.
|
|
Nous pouvons déterminer ce nombre grace à
|
|
$$\frac{\text{largeur} * \text{hauteur } (+1 \text{ si multiple de } 8)}{8}$$
|
|
en division entière.}
|
|
\item[Nombre de pièces]{ L'octet suivant l' (les) octet(s) qui forme(nt) la carte represente le nombre de pièces}
|
|
\item[Pour chaques pieces]{
|
|
\
|
|
\begin{description}
|
|
\item[Taille de la piece]{La taille est représentée sur un seul octet sous forme de nibble\footnote{https://en.wikipedia.org/wiki/Nibble}. La première partie du nibble est la largeur. La seconde partie du nibble est la hauteur }
|
|
\item[Forme de la pièce]{ Chaques cellules de la piece est représenté par un 1 ou un 0. la manière de le représenter et exactement la même que pour la forme de la carte }
|
|
\end{description}
|
|
Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaques pieces dans le même ordre que l'apparition des pièces:
|
|
\begin{description}
|
|
\item[Position de la pièce]{2 octets par pieces, 1 octet pour sa position en x et 1 octet pour sa position en y.
|
|
Dans le cas où la pièce est flotante (n'est pas placée dans la carte.), les octets contenant les caractères F puis L (0x464C) remplacent les coordonées}
|
|
\end{description}
|
|
}
|
|
\end{description}
|
|
|
|
\subsubsection*{Exemple}
|
|
|
|
Voici le 'hexdump' du niveau 11
|
|
|
|
\begin{verbatim}
|
|
53 4d 53 05 05 e7 ff ff 80 06 33 ff 80 22 f0 22 |SMS.......3.."."|
|
|
b0 22 70 22 b0 11 80 53 4d 45 |."p"...SME|
|
|
\end{verbatim}
|
|
|
|
représente une carte de la forme
|
|
|
|
\begin{tikzpicture}
|
|
\filldraw[blue] (0,0) -- (0,5) -- (3,5) -- (3,4) -- (5,4) -- (5,0) -- cycle;
|
|
\draw[step=1cm,gray] (0, 0) grid (5,5);
|
|
\end{tikzpicture}
|
|
|
|
avec les pieces
|
|
|
|
\begin{tikzpicture}
|
|
\fill[red] (1,1) rectangle (4,4);
|
|
\fill[red] (5,1) rectangle (7,3);
|
|
\fill[red] (8,1) -- (8,3) -- (9,3) -- (9,2) -- (10,2) -- (10,1) -- cycle;
|
|
\fill[red] (11,1) -- (11,2) -- (12,2) -- (12,3) -- (13,3) -- (13,1) -- cycle;
|
|
\fill[red] (1,-2) -- (1,0) -- (2,0) -- (2,-1) -- (3,-1) -- (3,-2) -- cycle;
|
|
\fill[red] (4, -2) rectangle (5, -1);
|
|
\draw[step=1cm,gray] (0.5, -2.5) grid (13.5, 4.5);
|
|
\end{tikzpicture}
|
|
|
|
En plus de ce parser, et dans le cas où ce premier parser ne serait pas capable de stocker certaine carte (par exemple si une piece mesure plus de 15x15).
|
|
Nous avons également implémenté un parser trés simple en utilisant l'interface \verb|Serialize| de java. Ce parser est implémenté et fonctionnel,
|
|
mais n'est pas utilisé dans le projet à l'heure actuelle.
|
|
|
|
ces deux parseurs implémentent l'interface \verb|FileParser| affin de pouvoir utiliser l'un où l'autre parser.
|
|
|
|
Finalement, La classe \verb|FileParserFactory| permet une utilisation simple des parseurs. Celle-ci contient deux fonction statique.
|
|
\begin{itemize}
|
|
\item{Map loadMapFromFile(File)}
|
|
permet de retourner la Map d'un fichier chargé.
|
|
\item{void saveFileFromMap(File, Map)}
|
|
permet de sauvegarder une map dans un fichier.
|
|
\end{itemize}
|
|
|
|
Dans le cas d'une sauvegarde ou d'un chargement, le parser est choisi en fonction de l'extension de fichier ('.level', '.slevel', .'serialized', '.sserialized').
|
|
|
|
L'avantage de ce system est que nous pouvons facilement ajouter d'autres parser de fichier dans le futurs.
|
|
|
|
\subsection{generateur de niveaux}
|
|
|
|
Le generateur de niveau permet 3 niveaux de difficultés différents.
|
|
|
|
\subsection{Fluidité et Simplicité de l'interface grahique}
|
|
En effet, tout l'affichage du jeu tient sur 4 fichiers différents
|
|
\item
|
|
{Le controller} : qui s'occupe d'afficher chaque scènes différentes en fonction des actions du joueur.
|
|
\item
|
|
{Le MenuAccueil} : qui s'occupe de générer la page d'accueil du jeu c'est-à-dire la première page que vera l'utilisateur
|
|
qui permet d'accéder aux niveaux de base proposé par le jeu Cats Organized Neatly,mais aussi de pouvoir lancer un niveau
|
|
généré aléatoirement en fonction du niveau de difficulté choisi.
|
|
De plus un dernier boutons "Load Game" permet de récupérer directement le niveau lorsque le joueur l'a quitté.
|
|
\item
|
|
{Le MenuLevel} : qui s'occupe d'afficher les niveaux proposés dans le jeu et qui en fonction du jour choisir change tout les buttons
|
|
et les niveaux disponibles.
|
|
\item
|
|
{Le GameUI} qui s'occupe de placer le plateau de jeu au milieu de l'écran ainsi que d'afficher les pieces à sa droite, mais aussi
|
|
de gerer le depassement pour ne pas que les pieces soient affichées en dehors de l'écran
|
|
|
|
|
|
\section{Points Faibles}
|
|
|
|
\item {L'interface}
|
|
Bien que l'interface graphique permet de naviguer de manière fluide dans le jeu il manque clairement un manque d'animation et de dynamysme ie :
|
|
transition de page à une autre, apparition des boutons ainsi qu'un manque de musique.
|
|
Toujours concernant l'affichage l'adaptation à la taille de l'écran peut être revu.
|
|
\item {Le design}
|
|
De plus suite à la perte de notre membre nous n'avons pas su gérer sa partie du projet qui concernait le design/textures des pieces ainsi que l'histoire jeu préparer en amont.
|
|
|
|
\section{Apports Positifs et négatifs}
|
|
|
|
\subsection{Anthony}
|
|
|
|
Personellement, Ce projet m'a permis de me plonger dans la conception d'un format de fichier personnalisé.
|
|
C'est une chôse que je n'avais pas encore fait jusqu'a maintenant.
|
|
Et malgré mes efforts pour prévoir un maximum de choses à l'avance afin d'éviter de devoir
|
|
modifier ma spécification pendant le dévelopement. Je me suis vite rendu compte que je n'avais pas pensé
|
|
à tout et que je devrais changer des choses pour pouvoir arriver à mes fins.
|
|
Je pense que ce parser de fichier est vraiment améliorable mais je suis relativement fier du résultat.
|
|
|
|
J'ai pu présenter ce parser à Dr Quoitin qui a pu me conseiller sur différentes approches à ce problème.
|
|
J'en prend bonne notes.
|
|
|
|
\subsection{Matteo}
|
|
|
|
\section{conclusion}
|
|
|
|
\end{document}
|