The Nak3d Project

Transcription

The Nak3d Project
The Nak3d Project
Rapport de projet
Nak3d Team
Jayat Maxime
Failly Pierre-Antoine
Chiche Michaël
18 juin 2008
Table des matières
1
Introduction
2
Présentation de l'équipe
3
Reprise du cahier des charges
4
EpiKartMania
5
La réalisation du projet de A à Z
2.1
2.2
2.3
2.4
2.5
3
Formation de l'équipe . . . . . . .
Maxime Afsgang Jayat . . . .
Pierre-Antoine PaF` Failly . .
Michael Chiche-a-pwal Chiche
Charles newbie Colombier . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3.1 Les diérentes parties à traiter . . . . . . . . . . . . . . . . . .
3.2 Répartition des tâches . . . . . . . . . . . . . . . . . . . . . .
3.3 Organisation du travail sur l'année . . . . . . . . . . . . . . .
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
5.1
5.2
5.3
5.4
5.5
Introduction . . . . . . .
Principe du jeu . . . . .
Détail d'une partie . . .
Les bonus . . . . . . . .
Le menu principal . . . .
Le menu dit in game Le multijoueur en réseau
L'éditeur de circuit . . .
Le site web . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introduction . . . . . . . . . . . . .
Le concept du jeu : Tous ensembles
Les débuts en Delphi : Maxime . .
Passage à GLFW : Michaël . . . .
La gestion de la map : Maxime . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
4
5
5
5
6
6
8
9
10
10
10
12
12
13
13
15
15
15
17
17
17
18
18
19
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
6
Le moteur physique : Maxime . . . . . . . . . . . . . . . . .
Le menu : Pierre-Antoine . . . . . . . . . . . . . . . . . . . .
Le son : Michaël . . . . . . . . . . . . . . . . . . . . . . . . .
L'éditeur de circuit : Maxime . . . . . . . . . . . . . . . . .
La gestion interne du jeu : Checkpoints et multiples véhicules :
Maxime . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Le mode deux joueurs : Maxime . . . . . . . . . . . . . . . .
Les adversaires (IA) : Maxime . . . . . . . . . . . . . . . . .
Les bonus : Maxime . . . . . . . . . . . . . . . . . . . . . . .
Le réseau : Pierre-Antoine puis Maxime . . . . . . . . . . . .
Conclusion
.
.
.
.
20
21
21
22
.
.
.
.
.
23
23
23
24
24
26
2
Chapitre 1
Introduction
Dès notre arrivée en InfoSUP à EPITA, nous avons appris que nous aurions un projet à rendre pour la n de l'année. Il consistait à nous faire
comprendre comment il fallait traiter un projet sur du long terme, et savoir se projeter dans l'avenir, et savoir prévoir quel serait notre avancé pour
chacune des 4 diérentes soutenances, chaque estimation étant crucial à une
bonne avancée du projet.
Ce projet était soumis à quelques contraintes, en eet, nous devions coder ce
jeu en Delphi, en utilisant OpenGL ou DirectX, ensuite nous étions restreint
en nombre, 4 élèves au maximum par groupe, ce qui nous pousserait à travailler plus que si l'on était 5 ou 6.
Mais la plus grande de toutes, était sans doute celle du temps, en eet, notre
rythme devait être soutenu, car il fallait montrer une réelle avancée à chaque
soutenance.
Ce projet a eu pour but de nous apprendre à travailler en groupe, de se
répartir les tâches, en connaissant les diérents niveaux de connaissances en
programmation de chacun, an de pouvoir avancer correctement tout au long
de l'année. Il fallut de nombreuses recherches sur internet, pour arriver à nos
ns, nous découvrîmes le vrai potentiel d'internet, et de Google, ainsi que
Wikipédia, qui se révélèrent être de véritables encyclopédies, bien fournies,
et très utiles pour l'avancement du jeu.
Il nous a aussi fait voir des aspects de la programmation que nous ne connaissions, pour la plupart, pas du tout.
Nous sommes heureux de ce qu'est devenu notre jeu, et espérons qu'il
vous plaira.
N'oubliez pas, l'adresse du site web : http ://nak3d.free.fr
3
Chapitre 2
Présentation de l'équipe
2.1 Formation de l'équipe
La Nak3d team a commencé à se former dès le début de l'année lorsque
nous nous sommes rencontrés. Mais la formation de groupes de quatre personnes a vite posé problème car il y a seulement une chance sur quatre que le
groupe de connaissance qui se forme soit un groupe dont le reste de la division par quatre est zéro, c'est mathématique (enn presque) . Donc Maxime,
Michaël et Pierre-Antoine se sont retrouvés après plusieurs changements de
groupes à trois, et Charles s'en ensuite intégré au naturellement restant seul,
victime de la loi du groupe de quatre. . .Finalement, ce n'est pas la loi des
quatre groupes, mais belle et bien celle de l'EPITA, qui fera abandonner
Charles, et le poussera donc à abandonner le groupe. Il ne reste donc à ce
jour que les 3 premières personnes citées. Le nom de l'équipe a été choisi
suite au célèbre Chiche ? - A poiiiiil ! ! . Un 3 a ensuite remplacé le e pour l'unique raison que ça fait plus geek, ce que nous deviendrons tôt
ou tard à l'EPITA. Pour ce qui est du logo, un beau Interstate 42 a été
trouvé an de rester dans la dynamique geek attitude .
2.2 Maxime Afsgang Jayat
El Maestro, notre codeur préféré, celui qui peut faire des miracles et même
plus encore si anité... Il est sérieux, travail sans se plaindre l et quand il a
ni, au lieu de s'arrêté la, il vérie que tout est propre, pas non seulement dans
son travail, mais aussi dans celui des autres. C'est lui qui fait le plus avancé
le projet, il aura fait seul, un moteur physique, l'application des textures, les
eets de lumières et d'ombres, je le répète, El Maestro. . .
4
2.3 Pierre-Antoine PaF` Failly
Ne pas y arriver, c'était la blague du jour, mais je me suis décidé de la
laisser. . . Notre Super Chef de Groupe (NSCG), qui à tout fais pour que le
Charles travaille, en vain. NSCG est celui qui fait le site internet, et le menu
qui est trop beau ;). Même s'il nous soule avec sa copine toute la journée. Il
sait faire son travail en temps et en heure, et surtout le plus important, il le
fait bien, certes il y a souvent de faute d' " aurteaugrafe ", mais on l'aime
bien quand même.
2.4 Michael Chiche-a-pwal Chiche
Mr Blague (pas drôle parfois, pour les intimes. . .). Pas le plus travailleur
du groupe, mais son imagination débordante, a permis au groupe d'avancé
dans des domaines anodins, comme la décision du nom du jeu, ou du type
de jeu que nous allons faire mais aussi dans des domaines plus important tel
que le futur moteur physique qui sera fait pour la 3eme soutenance. Il est
aussi chargé de faire des personnages pour le jeu.
2.5 Charles newbie Colombier
Inconnu au bataillon, touriste, que s'il existait un statut au dessus de 1ere
classe, et bah il serait sans doute dedans, non seulement il fout rien, qu'en
plus il arrive à se plaindre, bref, Il met plus de bâtons dans les roues qu'il ne
pédale pour nous faire avancer. . .
He left EPITA.
5
Chapitre 3
Reprise du cahier des charges
La partie qui suit rappelle ce que nous avions prévu lors de l'écriture de
notre cahier des charges.
3.1 Les diérentes parties à traiter
Les éléments que nous avions prévu de traiter étaient :
Moteur 3D : Le moteur 3D correspond à une des plus grosses parties du
projet et correspond à ce que nous achons à l'écran. Un jeu en mode
console, c'est marrant mais après 2 minutes, on a mal aux yeux et on
s'ennuie. C'est pourquoi l'aspect graphique du jeu est très important
et même primordial au sein de notre projet. Un jeu bien pensé mais
laid, est sûrement moins bien apprécié que le même jeu en beau. Mais
de l'aspect graphique résulte aussi la qualité du divertissement, car le
moteur 3D ne fait pas que rendre des modèles ou des textures plus
nes, il permet également d'optimiser la jouabilité et permettre ainsi
un jeu plus poussé. Une des parties les plus diciles de la réalisation
de l'achage du jeu a été l'optimisation et plusieurs prises de tête
(et de becs aussi) ont été nécessaires pour arriver à un jeu à la fois
beau et uide. Techniquement, le moteur graphique a été codé à l'aide
d'OpenGL.
Moteur physique : Le moteur physique du jeu englobe en réalité plusieurs
choses : on peut d'abord parler de la simulation des lois de la physique
du monde réel dans le monde. Malgré tout, une simulation la plus
réaliste possible est inutile car ce que nous avons réalisé n'est pas un
jeu de simulation tel que Flight Simulator, mais un jeu d'arcade dans
lequel, le fun est privilégié. Cependant, un véhicule qui freine, même
6
dans les jeux d'arcade, s'arrète, c'est inévitable. Et ça, nous l'avons
codé. Ensuite, le moteur physique comprend aussi les collisions entre
les diérents objets, chose plus que nécessaire, car traverser les murs,
ce n'est pas très réaliste. Nous avons réalisé ce moteur physique de A
à Z (ou plutôt de begin à end) en nous inspirant de ce que nous avons
trouvé sur internet dans ce domaine.
Jouabilité : Ce que nous appelons jouabilité a un lien très fort avec le
moteur physique. C'est ce qui nous permet de jouer, c'est-à-dire, ce qui
permet au programme d'interpréter les entrées du programmes et ainsi
modier la sortie : Par exemple, en appuyant sur la èche du bas, le
véhicule freine, en appuyant sur la èche du haut, il accélère, etc. Cette
catégorie comprend également la gestion des événements extérieurs au
joueur : autres concurrents, bonus, etc.
Son : Une bonne gestion du son est ce qui permet une immersion plus profonde dans le jeu et permet de se sentir vraiment aux commandes du
véhicule que nous contrôlons. La partie sonore se divise en plusieurs
parties : D'abord la musique du menu, des crédits. Puis les eets sonores, ce qui était plus dicile car un son mauvais ou trop répétitif peut
vite énerver et gâcher complètement le jeu ; pour cela, nous avons fait
simple, et avons simplement mis un eet lors du démarrage de la course
(Ces eets sont nos voix modiées). Finalement, nous voulions mettre
quelques sons correspondants aux diérents personnages présents dans
le jeu, mais nous avons vite laissé tomber cette idée, dans la mesure où
aucun d'entre nous n'était capable de créer des modèles 3D adéquates.
S'ensuit ensuite l'implantation du système sonore dans le jeu, ce qui
s'est fait assez facilement grâce à des bibliothèques sonores disponibles
sur internet telles que FMOD, dans lequel nous avons un peu modié
le code an de le rendre plus simple d'utilisation.
Éditeur de circuit : An de pouvoir prolonger la découverte de nouveaux
circuits nous avons programmé un éditeur de circuit qui permet à chacun de créer ses propres circuits et à l'équipe de réaliser les circuits de
base du jeu. Ainsi les fans du monde entier du futur jeu " EpiKartMania
" pourront exprimer leur créativité au travers de l'éditeur et pourront
publier leurs créations sur les énormes sites de fans qui seront créés à
l'occasion de la sortie mondiale du jeu. D'un point de vue pratique,
l'éditeur a été grâce aux outils fournis par Delphi.
Réseau : Un des points-clés du jeu. En eet, le jeu sera le plus apprécié lors
du jeu en ligne ou en réseau local. Même si le jeu en solo est génial, rien
ne remplace la erté d'humilier (ou pwner selon les termes en vogue) ses
amis à un jeu ! C'est pourquoi " EpiKartMania " s'appuie au maximum
7
Et
sur la gestion du jeu en réseau.
nous avons tout mis ensemble ! Eh oui, travailler chacun de son coté sur
sa partie n'est pas possible et le jeu n'est pas une juxtaposition d'éléments
divers mais un ensemble dans lequel il est impossible de dissocier les éléments les uns des autres, il n'est par exemple pas possible de gérer le jeu en
réseau, s'il n'ache pas la moindre fenêtre, ainsi que son contenu (je ne parle
pas d'une fenêtre d'un immeuble, mais bien d'une fenêtre Windows) ! Bon,
d'accord, cet exemple est un peu extrême. . .
3.2 Répartition des tâches
Moteur 3D
Moteur physique
Gameplay général
Éditeur de circuit
Menu, options
Son
Réseau
Site Web et extras
Rapport/LaTeX
Maxime Pierre-Antoine Michaël Charles
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
Nous nous sommes répartis les tâches, en prenant en compte les capacités
des diérents membres du groupe. Le pilier de notre projet est sans aucun
doute Maxime, à qui notre projet doit beaucoup. Il a donc été chargé de faire
les taches que nous jugions les plus compliqué, c'est dire le moteur physique,
graphique, ainsi que l'IA, mais il n'était tout de même pas seul, car les autres
membres du groupe étaient aussi présents, pour parvenir aux solutions des
diérents problèmes rencontrés lors du développement du projet. Ensuite,
Pierre Antoine, notre chef de projet, a été vitale pour la bonne organisation
et la cohérence de notre groupe, mis a part Charles, qui est parti d'EPITA
sans nous prévenir. C'est à notre chef que nous devons notre resplendissant
site Internet http ://nak3d.free.fr/, ainsi qu'une partie du réseau, le chat.
Michael, tout en détendant l'atmosphère, grâce a ses vannes, drôle de temps
en temps, avait une imagination très grande qui permettait de résoudre des
problèmes grâce a ses " illuminations ", certes elles ne fonctionnaient pas tout
le temps, mais on tout de même servies. Il a aussi été chargé de s'occuper du
son du jeu, une partie du moteur physique, ainsi que le moteur graphique.
Il sera aussi entièrement charger de s'occuper de la jaquette du jeu qui est
plutôt réussi.
8
Charles n'a rien fait et est parti d'epita sans crier gare, donc, rien d'intéressant a dire, à part que l'on avait remarqué son manque de motivation,
ce qui allait impliquer son manque d'investissement dans le jeu, donc ne fut
donner que tâches " faciles ", que les autre membres du groupe pourrait faire
facilement
3.3 Organisation du travail sur l'année
Voici le planning que nous nous étions xés lors de l'écriture du cahier
des charges. Il a à peu près été respectée tout au long de l'année et nous a
servi de base de rythme de travail pendant toute la période de travail :
Soutenances
re
1
2e
3e
nale
Moteur 3D
ébauche avancé nalisé nalisé
Moteur physique ébauche avancé avancé nalisé
Gameplay
ébauche avancé avancé nalisé
Éditeur de circuit
sans
avancé nalisé nalisé
Son
sans
sans ébauche nalisé
Réseau
sans
sans ébauche nalisé
Site Web
avancé nalisé nalisé nalisé
9
Chapitre 4
EpiKartMania
4.1 Introduction
Dans cette partie, nous allons regarder ensemble le résultat de notre travail de toute l'année. Si vous ni lisez que cette partie, vous devriez avoir déjà
une bonne idée de ce qu'est le jeu, sans même l'avoir vu.
4.2 Principe du jeu
EpiKartMania est un jeu de course de kart. Il peut se jouer contre des
adversaires pilotés par l'ordinateur mais aussi et surtout contre un adversaire
réel, sur le même PC ou par réseau (local ou internet). Comme dans tout
jeu de course le joueur doit arriver en premier au bout d'un circuit après un
ou plusieurs tours. Mais ce qui dière le jeu d'un jeu banal, est la présence
de quelques bonus permettant de décupler ses capacités et ainsi de coier
tous ses adversaires au poteau. Le dé est bien entendu de gagner la course,
mais aussi de réaliser le meilleur temps au tour qui est sauvegardé entre les
parties.
10
Fig.
4.1 Le jeu
11
Fig.
4.2 Un bonus à ramasser
4.3 Détail d'une partie
Les touches pour déplacer son kart sont par défaut ZQSD pour le joueur 1.
La touche E permet d'activer les bonus ramassés et la barre d'espace permet
de freiner le kart. Pour parcourir l'intégralité du circuit, il faut d'abord passer
par tous les checkpoints, symbolisé au sol par des rectangles indiquant leur
positionnement. Il n'est pas nécessaire de passer sur le checkpoint, mais à
proximité de celui-ci. Le checkpoint vers le quel il faut se diriger est indiqué
sur l'écran par une èche bleue et également dans le jeu par un cristal vert
rappelant celui des Sims. Après avoir ni un tour, le temps s'ache et est
enregistré s'il s'agit du meilleur temps jusqu'à là. Après avoir parcouru le
nombre de tour déni (habituellement trois), la partie est nie et le score
s'ache.
4.4 Les bonus
Tout au long des circuits se trouvent des bonus qui permettent de multiples choses et qui sont activés par la touche E par défaut. Voici la liste des
diérents bonus :
Accélération : eet 7 secondes, permet d'avoir une accélération et une
vitesse max doublée.
Vitesse : eet instantanée, multiplie la vitesse du kart instantanément
par 2, 3 ou 4. Il s'agit du bonus le plus dicile à utiliser.
Pilote semi-auto : eet 10 secondes, le kart du joueur utilise l'IA pour
se déplacer mais le joueur continue à inuer dessus ce qui permet d'aller
plus vite.
12
Fig.
4.3 Le menu principal
Temps : eet instantané, réduit le temps au tour du joueur de 1 à 3
secondes.
Le bonus temps a l'air de fausser les records de temps au tour mais ils font
partie du jeu et il faut jouer avec.
4.5 Le menu principal
Le menu permet de lancer la partie, de modier les options, de voir les
crédits et de quitter le jeu. La plus grande partie des graphismes du menu a
été pompée sur Mario Kart et sur Bomberman.
4.6 Le menu dit in game Un second menu est présent mais celui-ci n'est pas présent au lancement
du jeu mais pendant la partie en pressant la touche Échap. Il permet de
relancer rapidement la partie, de basculer vers le mode deux joueurs, de
13
Fig.
4.4 Le menu des options
14
changer de map, de résolution et rappelle la conguration des touches en cas
d'oubli. Celui-ci n'est pas très joli, mais laisse la possibilité de voir la partie
en cours. Ouvrir le menu pendant la partie permet aussi de mettre celle-ci
en pause.
4.7 Le multijoueur en réseau
Le jeu permet de jouer à deux joueurs (seulement) en réseau LAN ou
internet. Pour se faire il faut lancer le lanceur EpiKartLauncher qui permet
de démarrer le jeu en mode serveur et en mode client. Le jeu ne comprenant
aucun chat, il est conseillé d'avoir un moyen de conversation avec l'adversaire
à part. Le serveur doit lancer en premier le jeu et lancer la partie une fois dans
le menu. Quand le message " En attente de connexion " s'ache, le client doit
entrer l'adresse IP du serveur ainsi que le port choisi par le serveur. Lorsque
le client aura rejoint le serveur la partie commencera. En mode réseau, il
n'y a pas d'IA, il s'agit d'un un-contre-un. Si le menu est ouvert une fois la
partie lancée, le jeu sera en pause mais pas celui de l'adversaire. Par contre
" recommencer la map " la refait commencer pour les deux joueurs. En cas
d'échec de connexion du client, le jeu plante. Si l'autre joueur se déconnecte,
il n'y a aucun message aché, si ce n'est dans la console.
4.8 L'éditeur de circuit
L'éditeur de circuit est l'outil utilisé par l'équipe pour créer les map et
est mis à disposition des joueurs. Celui-ci permet de former le terrain du
circuit et de le lisser pour le rendre plus agréable à ÷il puis de placer le point
de départ et les diérents checkpoints dans l'ordre. La touche nale étant le
positionnement des bonus. L'éditeur est capable d'enregistrer les circuits au
format .m4p mais aussi de les ouvrir pour modier ceux déjà fait.
4.9 Le site web
En complément du jeu, un site web a été créé pour informer sur l'évolution
du projet et pour pouvoir proposer le téléchargement du projet. Celui-ci est
disponible à l'adresse http ://nak3d.free.fr
15
Fig.
4.5 L'éditeur de circuit
16
Chapitre 5
La réalisation du projet de A à Z
5.1 Introduction
Dans cette partie, nous allons détailler la manière dans le projet à évolué
depuis ses débuts jusqu'à aujourd'hui où il est ni et tout à fait jouable.
Cette partie est organisée de manière plus ou moins chronologique de manière
globale pour le projet. Ainsi la succession des sous-parties suivantes sera un
résumé de notre travail sur le projet tout au long de l'année pas forcément
dans l'ordre dans lequel nous avons travaillé dessus.
5.2 Le concept du jeu : Tous ensembles
La toute première étape lors de la conception du jeu a été de choisir le type
de jeu que nous voulions réaliser. Après un brainstorming nous nous sommes
mis d'accord sur un jeu de course d'avion en version fun (en s'inspirant
de Mario Kart). Nous devions alors rédiger le cahier des charges et ainsi
dénir plus précisément ce que nous recherchions comme objectif nal. En
s'inspirant des projets des années précédentes et de ce que nous nous sentions
capables de faire nous nous sommes déni une liste d'objectifs à atteindre
pour chaque soutenance et pour la soutenance nale. Après avoir appris les
bases du LaTeX, nous avons rédigé le cahier des charges et nous l'avons rendu
bien qu'il nous aura fallu travailler très vite les derniers jours pour être dans
les temps. À notre demi-surprise, il a été validé du premier coup, ce à quoi
nous ne nous attendions pas avec certitude. En eet, le cahier des charges
a été rédigé un peu dans l'urgence et presque sans l'aide de Charles qui
marquait déjà son détachement du groupe. Mais le contenu était bon alors,
c'est parti pour le projet.
17
5.3 Les débuts en Delphi : Maxime
Lors de la rédaction du cahier des charges nous nous sommes mis d'accord pour réaliser le jeu avec OpenGL pour les raisons suivantes : D'abord
parce que ça avait l'air plus simple comme nous avons pu le constater sur
internet pour nos premières recherches et de plus cet avis avait été plus
ou moins conrmé par les spés. De plus Maxime connaissait déjà un peu
OpenGL grâce à quelques expérimentations en C avant EPITA, et comme
il allait être sans doute le codeur principal du projet les autres membres
l'ont laissé choisir sans diculté. Les autres éléments nous ayant poussé à
OpenGL sont : OpenGL est libre et multiplateforme (Le jeu en version nale
fonctionne parfaitement sur Ubuntu grâce à Wine), et OpenGL n'oblige pas
à installer une usine à gaz telles que les dernières versions de Delphi avec .Net
et tout un tas d'autres éléments qui nous dépassent de loin. Nous devions
donc nous mettre à OpenGL en Delphi. La première diculté n'a pas été en
réalité d'utiliser OpenGL en Delphi mais plutôt d'utiliser Delphi tout court.
En eet, au moment du début du projet, nous n'avions vu Delphi que depuis peu de temps et nous n'en avions pas toutes les subtilités voire même le
plus basique (diérence entre .dpr et .pas, méconnaissance des types, etc.).
Nous avons alors débuté en Delphi grâce à cette adresse : http ://delphipage.free.fr/opengl.html. Maxime qui avait déjà utilisé OpenGL s'est donc
lancé dans la réalisation d'un départ de projet sur le modèle donné par ce
site, c'est-à-dire la création de la surface OpenGL par les outils de Delphi et
la gestion des événements par Delphi également. À partir de cette base il a été
assez facile de créer une scène, pour le moment immobile, achant un cube
posé sur un plan. Grâce au gestionnaire d'événement de Delphi, Maxime a
rajouté des touches an de pouvoir tourner le cube. Notre premier cube qui
tourne ! Youhou !
5.4 Passage à GLFW : Michaël
Nous nous sommes assez vite rendu compte qu'utiliser uniquement Delphi
pour gérer un jeu en OpenGL serait vite insusant. En eet, OpenGL se
contente de recevoir des instructions de dessin et de les exécuter, mais un
contexte de dessin doit déjà être déni et le reste de la gestion du programme
n'a rien à voir avec OpenGL. Delphi a été créé pour réaliser des applications
Windows, ainsi les outils mis à disposition par Delphi sont adaptés à cet
usage mais pas à celui des jeux vidéo, sur plusieurs points : Tout d'abord
la création d'un contexte de rendu OpenGL en Delphi s'approche plus d'un
bidouillage que d'autre chose mais ce n'est pas le plus grave ; la gestion des
18
événements clavier et souris est prévu pour Windows et se déclenche par
événement dans le code, ce que nous maîtrisons mal et pour terminer, le
timer de Delphi est très peu précis et complètement inadapté (Nous avons
par la suite appris qu'un meilleur timer était disponible dans l'API Windows).
Nous avons donc voulu nous tourner vers une bibliothèque vraiment orientée
vers OpenGL qui ferait tout ce dont nous avons besoin du coté contexte,
événement et timer. Ainsi Maxime a trouvé glfw dont les headers étaient
disponibles en Delphi. An d'utiliser glfw à partir de maintenant, le code a
du être réécrit complètement. C'est ce qu'à fait Michaël avec Brio.
5.5 La gestion de la map : Maxime
À partir de maintenant, la description de ce que nous avons réalisé pour
le projet n'est plus chronologique mais plutôt par thème ce qui permet de ne
pas se perdre dans les diérents éléments mis en place petit à petit dans le
jeu chacun de leur coté. Ainsi le premier élément capital pour le jeu est le
terrain. Le rendu de celui-ci devait être assez lisse et assez agréable à l'÷il.
Tout ce qui suit dans cette partie a été réalisé par Maxime. Une map a été
déni ainsi : Un réseau de points espacés régulièrement ayant chacun une
hauteur propre. Donc pour dénir la forme du terrain il faut dénir la hauteur de chaque point constituant le terrain. La première version du format de
map était en texte mais la limitation de ce format nous a assez vite poussés
à changer de format pour un format binaire généré par un éditeur de map
(dont nous parlerons plus tard). Le rendu du terrain dans le jeu a été une
des choses les plus complexes à mettre en place.
Ce que Maxime a réalisé est donc un achage de terrain plus ou moins
réaliste, texturé (avec malheureusement une unique texture), avec un eet
d'éclairage qui donne la touche réaliste en plus. La map est constitué d'un
réseau de points de taille maximum d'environ 200 * 200 avec chacun une hauteur donné. L'eet d'éclairage est réalisé grâce au calcul des vecteurs normaux
de chaque triangle de la map et par l'envoi de ces données à OpenGL.
La lecture des données dans un chier .m4p et le calcul des normales ont posé
quelques dicultés mais elles ne furent pas insurmontables, il a sut d'une
bonne étude sur papier au niveau algorithmique et mathématique ainsi que
de l'aide de Wikipédia pour venir à bout de ces calculs.
Un gros nombre de polygones étant présents dans cet achage il a fallu immédiatement penser à une optimisation pour le réaliser. Le moyen le plus
simple d'optimisation en OpenGL est la génération de vertex arrays.
Toute cette procédure se répète à chaque chargement d'une map mais ne
prends pas beaucoup de temps (au plus une demi-seconde), pré-calculer la
19
Fig.
5.1 Un exemple du moteur physique
lumière ne servait alors à rien.
5.6 Le moteur physique : Maxime
Le moteur physique est ce qui a, avec le moteur graphique pris le plus
de réexion et de recherche sur internet. Notre idée première se faire une
course d'avion s'est plus ou moins envolée à cause de la diculté du moteur
physique, il est en eet beaucoup plus simple de gérer un moteur physique
sur terre qu'en l'air.
La solution retenue par Maxime pour exécuter les instructions du moteur
physique est un moteur physique qui s'exécute régulièrement (toutes les 0.005
secondes soit à 200 Hz) et donc qui ne dépend pas du temps passé entre deux
20
frames.
Dans le jeu ni, le moteur physique du jeu permet à un véhicule de se déplacer librement sur le circuit, pouvant monter sur les montagnes (en prenant
l'inclinaison de la pente et en subissant les eets de la pente : le véhicule
descend). La partie la plus dicile à gérer a été les frottements. En eet lors
des deux premières soutenances, le véhicule avait des frottements mal gérés
qui font que le véhicule frotte (et ralentit) autant en avançant de face que de
coté. En réalité, les frottements doivent être beaucoup plus élevées en glissant
latéralement qu'en avançant (les roues tournant dans le sens de la marche).
Grâce à de multiples changements de repère (merci les matrices) le problème
a pu être résolu encore une fois par Maxime.
L'absence de collision entre les véhicules est bien dommage mais nous pouvons mettre cela sur le compte d'un choix de l'équipe de ne pas avoir à s'en
occuper, au moins il n'y aura pas de problème du à des bugs de collision. Et
puis pas d'excuse pour ne pas arriver à battre le record au tour. Ce choix est
en eet le même que dans Trackmania Nations qui a été une de nos références
pour le jeu.
5.7 Le menu : Pierre-Antoine
Le menu a intégralement été créé par Pierre-Antoine avec l'aide ponctuelle de Maxime. Il permet de lancer le jeu avec la map choisie, de changer
les options et de lire les crédits. Il a été créé grâce à une armée de textures
représentant chacune chaque état diérent du menu. Ce système mis en place
par Pierre-Antoine pour les soutenances avait la qualité de fonctionner mais
avait comme défaut d'être très lent à charger (car de nombreuses images très
grandes étaient chargées au démarrage du menu). Pour la quatrième soutenance, le menu a été complètement réécrit pour l'optimiser mais le problème
de chargement, bien que moins important est toujours présent, le temps de
chargement allant de 5 à 20 secondes selon les PC alors que le jeu lui-même
est beaucoup moins long à charger (2 à 4 secondes en général). De plus les
diérentes textures ont du être refaites à cause du changement de nom du
jeu.
5.8 Le son : Michaël
La partie sonore n'a été implémentée qu'en partie à la soutenance 3 et
nalisée pour la dernière soutenance. La partie code utilise FmodEx comme
bibliothèque. Fmod est une bibliothèque très complète mais très simple, ce
21
qui nous a poussés à la choisir. Michaël a créé un objet dans le code qui
permet de simplier encore l'utilisation du son. Il sut alors d'une méthode
pour lire un son et une autre pour jouer une musique. En fait cette méthode
prend en paramètre le nom du son à jouer, s'il est déjà chargé il joue ce
son, sinon il le charge et ensuite le joue. La seconde partie de la gestion
sonore a été de créer les sons. Comme prévu dans le cahier des charges, une
partie de ceux-ci a été créé à la bouche puis modiée avec Audacity. Le reste
des sons a été capturé dans des vidéos depuis Youtube. La partie sonore est
certainement celle qui aura retenu le moins de soin de notre part. Cependant
elle est existante ce qui est déjà ça.
5.9 L'éditeur de circuit : Maxime
Parallèlement à l'élaboration dans le projet de ce qui pouvait lire un chier map, il a aussi fallu créer un programme capable de les créer. C'est
ce qui a été fait par Maxime. Il a créé un programme séparé du projet en
TForm qui permet assez facilement de créer des circuits. La base de cet éditeur se trouve être un TDrawGrid qui permet d'avoir une grille représentant
le circuit vu de dessus. Divers outils activés par des boutons permettent d'intégrer diérents éléments dans la map. Ceux-ci peuvent être réglés par des
curseurs permettent d'ajuster divers paramètres tels que la hauteur du terrain où l'orientation des checkpoints. Le format de la map lu et exporté par
l'éditeur est le suivant :
Deux entiers indiquant la largeur et la longueur de la map puis
longueur x largeur entiers représentant la hauteur de chaque point du circuit
puis
un entier nombre_objet indiquant le nombre d'objets présent dans la map
un succession de nombre_objet d'enregistrement contenant le type d'objet,
sa position x, y, et z ainsi que son orientation, tous des integer. Ce format de
map ayant évolué au l du temps (par exemple pour rajouter l'orientation des
checkpoints), certaines map créées au début du projet ne fonctionnent plus
dans le jeu nal et le font même planter. En eet, si la map n'est pas précisément au format indiqué, le jeu plante. Heureusement, l'éditeur ne génère pas
de chier faussé, donc ce cas de gure ne devrait pas arriver. Cependant il y a
un problème avec l'éditeur dont la source est inconnue, c'est que le rendu de
la map créée dans l'éditeur dans le jeu n'est pas la même mais son symétrique
par rapport à un axe x. Ce qui fait que les courbes à droites deviennent des
courbes à gauches dans le jeu. Le problème n'étant pas primordial (puisqu'il
ne change pas fondamentalement quelque chose), nous n'avons pas essayé de
le régler, sans doute aussi par manque de temps.
22
5.10 La gestion interne du jeu : Checkpoints et
multiples véhicules : Maxime
Alors que nous avions une bonne base d'achage et de déplacement grâce
aux moteurs graphique et physique, il a fallu commencer à coder ce qui
changerait ce grand paysage vide en jeu de course. Grâce à l'éditeur, il nous
est possible de rajouter des checkpoints (ou point de contrôle en français)
qui détermine le parcours à eectuer.
Lorsque nous eectuions des tests pour le moteur physique et graphique, nous
avons (ou plutôt Maxime a) conçu le jeu pour un unique véhicule. Sachant que
le jeu avait pour nalité de devenir multijoueur, il a fallu rapidement rajouter
la possibilité d'avoir plusieurs véhicules. La première étape vers cet objectif
a été de concevoir une classe Tjoueur qui contient tout ce qui appartient à
chaque véhicule puis une classe TlisteJoueur qui est comme son nom l'indique
une classe contenant une liste de joueur et qui permet d'en rajouter et d'en
supprimer facilement.
Pour la mise en place des checkpoints, une fois disponibles dans l'éditeur,
il a été facile de les lire dans le projet et de les enregistrer quelque part en
mémoire. La gestion des checkpoints à franchir, le nombre de tour à eectuer,
est gérée par la classe Tjoueur grâce à la liste ordonnée des checkpoints.
5.11 Le mode deux joueurs : Maxime
À vrai dire, cette partie a été assez facile. La seule vraie diculté a
été de trouver la fonction OpenGL qui permettait d'avoir un écran splitté
(glViewport) et encore. En eet, le système permettant plusieurs véhicules
étant déjà implémenté, il sut d'eectuer deux fois l'achage, une fois avec
la caméra suivant le joueur 1, une fois avec l'achage suivant le joueur 2. Il a
aussi fallu modier la gestion des entrées clavier pour permettre des touches
diérentes pour les deux joueurs mais cela n'a pas posé de problème et a été
fait rapidement. En deux heures (et encore c'est large), tout a été fait.
5.12 Les adversaires (IA) : Maxime
De la même manière que le mode deux joueurs, l'élaboration des adversaires s'appuie fortement sur la mise en place antérieure du système permettant la multiplicité des véhicules. Les joueurs dirigés par l'IA sont aussi des
Tjoueur mais sont identiés en tant que IA à leur création. En tant que tel
ils ne se déplacent pas en fonction des entrées clavier mais en fonction des
23
checkpoints à atteindre. La manière la plus simple de créer l'IA fut de diriger
automatiquement les adversaires vers le checkpoint suivant à atteindre. La
fonction qui dirige les véhicules n'est pas très évolué mais donne des résultats très corrects : Les véhicules s'orientent vers le checkpoint à atteindre et
accélèrent jusqu'à ce qu'ils l'atteignent et ainsi de suite pour chaque checkpoint. D'autres conditions un peu plus précises permettent de régler certains
problèmes engendrés par une telle IA, par exemple, si la distance entre le
checkpoint et le véhicule est faible et que le véhicule n'est pas correctement
dirigé (par exemple à cause d'une faible distance entre deux checkpoints), le
véhicule ralentit jusqu'à être sûr d'atteindre le checkpoint. Après la mise en
place de ce système, le problème a été que tous les adversaires eectuaient
exactement le même parcours (comme dans Gran Tourismo). Pour remédier
à ce problème, Maxime a implémenté des capacités aléatoires (pour l'accéleration par exemple) pour chacun des véhicules contrôlé par l'IA ce qui a
permis de les séparer pendant la course.
5.13 Les bonus : Maxime
Alors dans l'optique d'un Mario-kart-like, il a fallu ajouter des bonus
comme il y en a dans Mario Kart. Une fois rajoutés dans l'éditeur et donc
enregistrés dans le cher map, Maxime a du stocker la liste de bonus dans
la classe Tmap. Une texture rapide avec un point d'interrogation a été créée
puis appliquée sur un cube nalement enregistré dans une display list. Un
bonus est représenté par ce cube en rotation. À chaque frame, la liste des
bonus est achée à sa place. Lorsqu'un joueur passe sur le bonus, il disparaît
pour cinq secondes et le joueur se voit ajouter un bonus en attente. Lorsque le
joueur active le bonus, des eets se ressentent sur le joueur, instantanément
ou pendant une durée limitée. Maxime a également prévu l'utilisation des
bonus pour les IA, en les activant automatiquement lorsqu'ils en ramassent.
Les diérents bonus n'ont pas posé de diculté à programmer car nous avons
choisi des bonus simples, pas de projectiles par exemple.
5.14 Le réseau : Pierre-Antoine puis Maxime
Le jeu en réseau a été prévu depuis le début dans le cahier des charges
mais n'a été commencé que pour la troisième soutenance (comme prévu en
fait). La première étape a été de choisir quelle librairie utiliser pour les communications réseau. Nos choix se limitaient à Indy, ICS et aux composants
intégrés à Delphi 6. Notre premier test en réseau fut celui d'un chat réalisé
24
par Pierre-Antoine avec Indy. L'élaboration de ce chat n'a pas été trop difcile, le réseau consistant seulement à envoyer des chaînes de caractères à
intervalles assez grande. Pour la troisième soutenance, le chat était fonctionnel et a été présenté malgré de nombreux bugs qui auraient pu être résolus
mais qui n'étaient pas du tout notre priorité.
Pour la dernière soutenance, il a fallu mettre en place un réseau au niveau
du projet. Maxime, après avoir étudié les diérentes bibliothèques a préféré
utiliser ICS qui lui plaisait plus dans le style de programmation, orienté événement.
Après avoir compris le système de connexion entre deux PC en TCP avec
ICS, il a fallu commencer à envoyer des données. Ici, le transfert de données
ne se fait pas par chaîne de caractères mais par paquet d'octet. Les diérents
types de paquets transportés par le jeu sont :
Le paquet contenant le nom de la map.
Le paquet contenant les propriétés du joueur.
Le paquet contenant la vitesse et la position du joueur.
Le paquet contenant des messages comme redémarrer la course.
Le premier paquet est envoyé par le serveur au début de la partie. Le second
est envoyé par les deux joueurs au début également. Le troisième paquet est
le plus important car il permet de voir l'autre joueur. L'adversaire est vu
localement comme un Tjoueur inerte dont les coordonnées position et vitesse
sont mises à jour par le réseau.
Le paquet position est envoyé à chaque frame à l'autre joueur par le réseau.
Si celui-ci ne reçoit pas le paquet immédiatement (si par exemple le jeu est
gé car on déplace la fenêtre, glfw inside), il est mis en attente par ICS.
Lorsqu'on veut récupérer les paquets, il se peut que le buer de réception
soit trop petit, et qu'on ait des morceaux de paquet dans tous les sens. Au
départ, la plupart des problèmes de transport de paquets n'étaient pas gérés
et au moindre problème, les deux jeux plantaient. Des mécanismes de sécurité
de buer trop plein ou de paquet à moitié manquant ont du être mis en place
pour contrer ces bugs. Finalement, des octets de contrôles ont été ajoutés à la
n de chaque paquet par symboliser la n du paquet (ils contiennent la valeur
arbitraire $2A) an de vérier la longueur de chaque paquet. Finalement il
n'y a pas de bugs majeurs dans le réseau, si ce n'est le manque d'information
et la gestion d'une connexion à un serveur inexistant. Le jeu a été testé en
local (deux jeux lancés sur le même PC), en LAN et même sur internet. Si la
connexion est correcte, le jeu est tout à fait jouable. Si le lag est trop grand, il
se peut par contre qu'il y ait des problèmes car les passages au checkpoints ne
sont pas communiqués mais uniquement calculés en fonctions de la position
donnée.
25
Chapitre 6
Conclusion
La réalisation du projet tout au long de l'année nous aura enseigné une
grande quantité de chose. D'un coté au niveau programmation où nous avons
eu notre première application pratique de la programmation, notre futur métier si tout ce passe bien. Mais aussi du coté gestion, qui n'a pas toujours été
facile au sein de l'équipe. Les niveaux et les motivations sont très hétérogènes
au niveau de l'équipe, Maxime surpassant tout le monde de l'aveu du reste
de l'équipe. Le départ de Charles ne nous a laissé qu'à trois ce qui a aussi
réduit notre capacité de travail. Mais le résultat est là et est jouable. Certes
il pourrait y avoir de très nombreuses améliorations mais nous avons fait ce
que nous avons pu face au autres priorités de l'année.
Quoi qu'il en soit, nous sommes ers de ce qu'il ressort de notre travail et
nous espérons que chacun l'appréciera à sa juste mesure.
26

Documents pareils