Rapport pour la premiere Soutenance Crazy Caddies

Transcription

Rapport pour la premiere Soutenance Crazy Caddies
Crazy Caddies : 1er rapport de soutenance
The Happy Four Friends
15 janvier 2007
Table des matières
1 Introduction
2
2 Partie graphique
2.1 Jonathan Verrecchia . . . . . . . . . . . . .
2.1.1 Création d’un caddie sous 3DS MAX
2.1.2 Réalisation du logo . . . . . . . . . .
2.2 Jean-Charles Delay et Jonathan Verrecchia .
2.2.1 Les débuts avec OpenGL . . . . . . .
2.2.2 Primitive, mon amie ! . . . . . . . . .
2.2.3 À venir . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
6
7
7
9
11
3 Partie Physique
13
3.1 Marc Chamberlin . . . . . . . . . . . . . . . . . . . . 13
3.1.1 L’accélération . . . . . . . . . . . . . . . . . . 13
3.1.2 À venir . . . . . . . . . . . . . . . . . . . . . 14
4 Intelligence Artificielle
4.1 Roman Pak . . . . . . . . . .
4.1.1 Le jeu . . . . . . . . .
4.1.2 Derrière le jeu . . . . .
4.1.3 Les bases de recherche
4.1.4 Les évolutions . . . . .
5 Site Web
5.1 Jean-Charles Delay
5.1.1 Introduction
5.1.2 Index . . . .
5.1.3 Présentation
5.1.4 Downloads .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15
15
15
15
16
19
.
.
.
.
.
21
21
21
22
22
23
5.1.5
Le futur du site . . . . . . . . . . . . . . . . .
6 Conclusion
23
24
2
Chapitre 1
Introduction
La préparation de cette première soutenance sert également à
mettre en place le projet. Nous avons pu nous familiariser avec
presque tous les outils nécéssaire au projet et ainsi gagner du temps
pour les prochaines soutenances.
Le cahier des charges n’a subi aucune modification car il était
suffisament complet et raisonnable.
Quand à l’équipe, chaque membre a été rigoureux dans son travail
et le chef de projet n’a même pas eu besoin de donner des coups de
fouets.
3
Chapitre 2
Partie graphique
2.1
2.1.1
Jonathan Verrecchia
Création d’un caddie sous 3DS MAX
Que serait un jeu de course de caddies sans...caddies ? Nous nous
sommes fixés pour objectif de créer un modèle de caddie basique
pour la première soutenance. Pour cela nous avons choisi d’utiliser le
logiciel 3DS MAX qui semble être l’un des meilleurs dans le domaine.
Le premier contact avec ce logiciel est un peu déroutant, quatre
fenêtres, cinquante boutons autour, un keygen compliqué à utiliser...
Bref il m’a fallu un peu de temps avant de comprendre comment
placer un simple plan1 . Une fois la création des formes géométriques
comprise, il faut réussir à les placer correctement dans les quatre
fenêtres, ce qui n’est pas toujours simple. Voici le premier ”caddie”
que j’ai modélisé sous 3DS MAX, avec des formes basiques :
1 quelle
horreur ce groupe...
4
Ce premier modèle, à l’allure design et moderne a été une assez
grande satisfaction pour moi, n’ayant aucune expérience en matière
de 3D. Cependant, un besoin insatiable de perfectioner ce modèle
s’est emparé de moi. La difficulté principale a été de déformer les
formes du caddie. Ce logiciel étant relativement peu simple d’utilisation pour un débutant, j’ai passé un moment à chercher comment
changer un carré en trapèze par exemple.
5
Finalement, voici le rendu actuel de notre caddie :
On peut admirer l’apparition d’un bas de caisse en aluminium,
une forme profilée pour une meilleure pénétration dans l’air ainsi
qu’une confortable barre de navigation au look très tendance.
Nous utiliserons ce modèle par la suite, cependant il est possible
qu’il s’améliore ou que nous en utilisions un autre, qui ne soit pas
simplement une boı̂te sur roues mais un vrai caddie.
Nous aurons de nouveau recours à 3DS MAX pour modéliser les
éléments de décor par exemple.
6
2.1.2
Réalisation du logo
La réalisation du logo a été faite en tout début d’année, afin de
prendre de l’avance. En effet j’ai pensé qu’il serait plus judicieux
d’effectuer cette tâche alors que nous ne savions pas encore coder.
Le logo a été fait sur papier puis coloré à l’aide de Photoshop. Nous
avons décidé de faire un logo proche de celui de Crazy Taxi afin de
rester dans l’esprit du jeu qui nous a inspiré pour la réalisation de
notre projet. Voici le travail effectué sur papier.
7
2.2
2.2.1
Jean-Charles Delay et Jonathan Verrecchia
Les débuts avec OpenGL
Autant dire tout de suite que nous ne savions pas par quoi commencer. Marc ne pouvant réellement rien faire du moteur physique
tant que nous n’ayons eu les bases du graphique (mais aussi parce
qu’il lui fallait apprendre à maı̂triser OpenGL). Il nous a donc donné
un coup de main pour les débuts. Et fort heureusement ! C’est lui
le premier à avoir trouvé comment maintenir ouverte une fenêtre
OpenGL, chose qui nous paraı̂t à présent triviale.
Puis nous avons continué cette ”coopération”. Le but suivant
étant d’apprendre à afficher des formes géométriques à l’écran. Bien
évidemment, nous ne serions jamais venu à boût de cette nouvelle
épreuve (comme des autres) sans l’aide de divers — et plus ou moins
complets — tutoriaux du net. C’est alors que nous avons choisi de
travailler principalement avec la bibliothèque GLFW au détriment
de GLU(T) qui nous a paru plus compliquée.
Puis sont apparus nos premiers vertex, tout d’abord en 2D. En
2D tout simplement parce que nous avons cherché avant tout à bien
assimiler le principe d’affichage avant de complexifier la chose. Le
principe est de définir chaque point du polygone en x/y à l’aide de
glVertex2f(x,y). Puis OpenGL se charge se rejoindre les points. Ainsi
avec :
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
on obtient :
8
Pour afficher le cube en trois dimensions, il suffit de rajouter 4
points sur un autre plan. Pour cela, on remplace les glVertex2f(x,y)
par des glVertex3f(x,y,z). Et ainsi nous avons placé 8 points en trois
dimensions :
9
2.2.2
Primitive, mon amie !
Ça y est ! A peine notre première forme plus ou moins géométrique
en poche que nous nous lançons dans ce qui nous semble le plus intrigant, faire bouger cette primitive. Après un cours rapide sur des
forums, et les commandes glTranslate et glRotate repérées en
tant que procédures principales du déplacement, nous nous lançons
à l’assaut des transformations. Et nous nous sommes pris le mur !
En effet, Marc était arrivé à faire mouvoir ce cube de manière
globalement normale, mais un détail nous a perturbé : le cube emmenait tout le repère, et par conséquent tout le décor avec lui. Nous
devions alors trouver un moyen d’isoler le cube. A ce problème ont
répondu deux procédures, que sont glPushMatrix et glPopMatrix.
Ces deux commandes permettent, à la manière des environnement
en LATEX, d’isoler certaines parties et par là, créer un repère ”temporaire” que l’on peut bouger (translater et tourner) avant d’afficher
les éléments voulus. glPushMatrix et glPopMatrix fonctionnent de
cette manière :
/*affichage de nos obstacles*/
glPushMatrix(); /*creation de l’environement*/
/*transformations effectuees*/
/*affichage du caddie*/
glPopMatrix(); /*fermeture del’environement*/
Mais voila, cela aurait été trop beau : le glTranslate marchait sans problème, mais nous ne pouvions pas en dire autant du
glRotate, ce qui entraı̂nait, au final, des mouvements étranges du
cube, non naturels.
Nous sommes restés bloqués sur ce point très longtemps, et pensions même ne pas parvenir à résoudre ce problème avant la soutenance. Mais il ne faut jamais sous-estimer une nuit de réflexion
nous répètent souvent les Spé, et ça s’est avéré vrai. J’ai finalement
trouvé d’où venait le ”problème”, ou plutôt où était notre erreur :
les fonctions sinus et cosinus prennent en paramêtres des valeurs
en radians, et non pas en degrés comme l’on mettait innocemment
depuis le début. Et aussi minime que semble cette erreur, elle était
10
la cause de tous nos soucis !
De cette manière, nous avons pu afficher un futur caddie se déplaçant
indépendament d’un obstacle :
Le reste fut plus facile, et trouver la gestion d’entrée de commande grâce à la librairie GLFW s’est révélé beaucoup plus simple
que le reste. Au final, le code ressemble à ceci :
If (glfwGetKey(GLFW_KEY_UP) = 1) Then
X := X + cos(angle)*speed;
Y := Y + sin(angle)*speed;
If (glfwGetKey(GLFW_KEY_RIGHT) = 1) Then
angle := angle + degrot;
Les commandes GLFW KEY UP et GLFW KEY RIGHT tout
comme leurs symétriques GLFW KEY DOWN et GLFW KEY LEFT
parlent d’elles-même : lorsque leur valeur prend 1 la touche est enfoncée, et l’on peut bouger le mobile – cube ici, caddie plus tard.
(X,Y) représente le couple de coordonnées du centre de rotation du
cube, et leur valeur est modifiée selon l’angle de déplacement angle.
Ce dernier est incrémenté ou décrémenté – de degrot – selon que l’on
11
Fig. 2.1 – Et voila ce qu’on obtient au final !
tourne d’un côté ou d’un autre.
Enfin, un détail, mais qui a son importance : le cube 3D est un
”vrai” cube. J’entends par là qu’aucune de ses faces n’est transparente, or c’est ce qui nous a posé problème au moment d’essayer la
modélisation d’un objet en 3 dimensions, certaines faces disparaissaient et semblaient – alors qu’originalement supérieures – sous les
autres.
2.2.3
À venir
Maintenant que nous avons notre cube (que l’on remplacera par
un modèle de Caddie) capable de bouger dans un environnement
indépendant, Marc sera capable de se plonger entièrement dans le
12
moteur physique, et Jonathan et moi-même pourrons nous préoccuper
des modèles mais aussi des textures.
En effet, la prochaine étape pour nous consistera à apprendre à
appliquer des textures sur les différents blocs, puis à bâtir le décor
pièce par pièce.
13
Chapitre 3
Partie Physique
3.1
Marc Chamberlin
Pour cette première soutenance, la partie physique devait être
commencée et l’accélération ou les collisions abordées.
3.1.1
L’accélération
Pour l’accélération, il s’agissait de rendre le plus réaliste possible
les mouvements du caddie. Pour cela, il fallait que la vitesse du caddie varie en fonction du temps pendant lequel le joueur appuie sur
les touches haut et bas. Pour cela, j’ai utilisé une variable (vit) qui
détermine le déplacement du caddie en translation.
Lorsque (vit) est positive, notre caddie avance et lorsqu’elle est
négative, il recule. En appuyant sur la touche ”haut” cela augmente
la valeur de (vit) et visuellement, le caddie se déplace de plus en
plus vite. De la même manière, en appuyant sur ”bas”, le caddie
décélère, voire recule lorsque la valeur est négative.
Cependant, il faut que le caddie puisse s’arrêter seul. Il faut donc
traı̂ter le cas où aucune touche n’est enfoncée. Lorsque (vit) est positive, sa valeur décroit tant qu’elle n’atteint pas 0. De la même
manière, lorsque (vit) est négative, elle augmente tant qu’elle n’atteint pas 0.
14
Enfin, il faut déterminer une valeur maximum et minimum à (vit)
pour que la vitesse du caddie soit plus réaliste. A l’aide d’une boucle
”tant que”, la vitesse du caddie est limitée aussi bien en avançant
qu’en reculant. Puis, pour plus de réalisme, l’augmentation de (vit)
est différente selon si l’on accélère, ralentit ou freine.
Voici un graphe symbolisant la valeur de (vit) (donc la vitesse du
caddie) en fonction du temps lorsque l’on appuie ou non sur ”haut”
ou ”bas”.
Le caddie peut donc avancer et reculer. Or il faut qu’il puisse tourner et non se décaler. C’est pourquoi je n’ai pas utilisé de translation
vers la gauche ou la droite, mais plutôt des rotations ayant pour
centre le milieu du caddie. En appuyant sur ”gauche” ou ”droite”,
le caddie tourne sur lui même lorsqu’il est à l’arrêt.
3.1.2
À venir
Les collisions n’ont pas encore été implantées, cependant, elles
devraient apparaı̂tre pour la prochaine soutenance.
De plus, il est prévu que le caddie, lors de rotation, puisse continuer sur sa trajectoire initiale pendant quelques instants (phénomène
se produisant pour un caddie où les quatres roues pivotent).
15
Chapitre 4
Intelligence Artificielle
4.1
4.1.1
Roman Pak
Le jeu
Dans le jeu que nous développons, l’intelligence artificielle servira
à donner mouvement à des personnages non joueurs. Le principe
est de recréer l’ambiance propre au supermarché. Il s’agit donc de
déplacer de manière aléatoire un ou plusieurs personnages dans le
niveau. Plusieurs problèmes se sont alors posés.
1. Collisions entre personnages non joueurs
2. Bouchons occasionnés par les personnages non joueurs
3. Mouvements à effectuer
4.1.2
Derrière le jeu
Pour faire face aux problèmes de collisions entre les personnages
non joueurs, la solution à adopter sera de répartir la surface du niveau aux différents personnages non joueurs. De ce fait, aucun des
personnages non joueurs ne pourra entrer en collision avec un autre.
La disposition d’un supermarché est faite de manière à ce que
plusieurs caddies puissent passer au même moment dans une allée.
Lors du dessin des différents niveaux entre chaque rayon, il n’y avait
qu’un seul carreau, nos personnages occupant un carreau bloquaient
donc une allée complète. Il fallut donc voir au delà de nos dessins,
chaque carreau devrait valoir 4 carreaux au lieu d’un seul. De ce fait
16
deux caddies peuvent se croiser dans une allée.
Le résultat de la recherche du plus court chemin est une liste
contenant les différents mouvements à effectuer.
4.1.3
Les bases de recherche
Pour trouver le chemin le plus direct entre deux point d’un quadrillage contenant des zones inaccessibles, j’ai tout d’abord pensé à
donner des valeurs aux cases. Le principe aurait été de se déplacer en
choisissant la case ayant la plus petite valeur. Sur mon premier tableau d’essai, chaque case contient le nombre de cases noires qui l’entourent. Mais ce principe ne permet pas de rejoindre un autre point.
Il me fallait donc un système de valeurs en fonction de l’éloignement
du point d’arrivée. La formule suivante permet de calculer une valeur fonction de la distance du point d’arrivée. x0 et y0 sont les
coordonn/’ees du point d’arrivée. x et y les coordonnées du point
où l’on se trouve. |x − x0| + |y − y0| :
17
procedure crtmap; var
i,j:Integer;
begin
infos := ask();
for i:=0 to infos[0] do
for j:=0 to infos[1] do
grid [i,j]:= abs (i-infos[4])+ abs (j-infos[5]);
Il s’agit d’une procédure de création du niveau : ”infos” est un
vecteur contenant les différentes informations du niveau, taille, position de départ ,position d’arrivée. Ici la fonction ajoute à chaque
case la valeur de sa distance avec le point d’arrivée. J’ai ensuite
ajouté à chaque case le nombre de cases noires qui l’entourent. Le
but étant d’écarter les impasses. Si le nombre ajouté à la case est
élevé, cela veut dire que le choix des directions en partant de cette
case est faible. Les murs sont ajoutés, de manière aléatoire, par une
fonction non décrite qui ajoute un nombre de murs défini par la taille
du niveau. Le nombre de murs est égal à : aire du niveau divisée par
2.
18
function nearwall(map : t_tab; x:Integer; y:Integer):Integer; var
s:Integer;
begin s:=0;
if map [x,y]<> 999 then
begin
if map[x,y-1] = 999 then
s:=s+1;
if map[x+1,y] = 999 then
s:=s+1;
if map[x,y+1] = 999 then
s:=s+1;
if map[x-1,y] = 999 then
s:=s+1;
end;
result:=s; end;
Il s’agit d’une fonction créant un entier représentatif du nombre
de murs entourant une case. Les case contenant 999 sont des murs.
Le chemin choisi ne doit pas traverser de murs. Il faut donc choisir
19
une valeur élevée de façon à ce que l’algorithme ne choisisse pas un
mur.
procedure addwall ;
var
i,j:Integer;
begin
for i:=0 to infos[0] do
for j:=0 to infos[1] do
if ((i=infos[2]) and (j=infos[3]))
or ((i=infos[4]) and(j=infos[5])) then
grid [i,j]:= 0
else
grid [i,j]:= grid [i,j]+ nearwall(grid,i,j);
end;
Il s’agit d’une procédure parcourant le niveau et ajoutant le
nombre de murs adjacents à la case traitée.
4.1.4
Les évolutions
L’algorithme de recherche du chemin le plus court est bien avancé
mais il n’est pas fini. En effet, il trouve bien un chemin menant à
un point mais pas forcément le chemin le plus court. Il faudra aussi
développer une interface graphique qui permettra de mieux visualiser le travail de l’algorithme.
20
En cliquant sur une case, elle se remplira de noir et sera considérée
comme un mur. Et inversement losrque l’on cliquera sur une cellule
noir. Les boutons start et finish permettront de définir les points
d’arrivée et de départ. Generate génèrera aléatoirement un niveau.
Launch lancera la recherche du chemin reliant les deux points choisis.
Il sera possible de sauvegarder les niveaux créés de façon à les jouer.
21
Chapitre 5
Site Web
5.1
5.1.1
Jean-Charles Delay
Introduction
Comme prévu initialement, je me suis occupé de la création du
site web de notre projet. A l’origine je ne connaissais rien au HTML,
CSS, PHP et autres. J’ai donc dû, dans un premier temps, rechercher un tutoriel qui pourrait m’apprendre la conception d’un site
web. Je me suis orienté vers Le Site du Zero (www.siteduzero.com)
où j’ai trouvé ce que je cherchais. En plus d’être bien fait, ce tutoriel
est très pédagogique ce qui a, me semble-t-il, beaucoup facilité mon
apprentissage.
J’ai donc avancé en tatonnant, apprennant le fonctionnement de
chaque balise dont j’avais besoin et faisant mes propres essais de
mon côté pour bien intégrer ce qui n’est autre qu’un autre langage
de programmation, mais celui-ci est réservé à la conception de sites
web.
22
J’ai donc fini par m’attaquer au gros du travail, c’est-à-dire la
mise en application de tout ce que j’avais appris pour créer le site
”officiel” du projet. Je suis finalement arrivé exactement à ce que
je voulais, c’est-à-dire à avoir fini le site qui ne nécessite plus que
de petites mises à jour rapides et périodiques. Seul hic dans tout
cela, le problème de mot de passe survenu sur notre compte Free
qui nous a obligé à recréer un compte, dont nous attendons toujours
les identifiants.
Je vais maintenant vous détailler le contenu de notre site.
5.1.2
Index
Tout d’abord vous entrez dans le site par la première page (logique me direz vous) où se trouve les news propres au projet. Ainsi
par cette seule page, le visiteur peut être informé des derniers événements
liés au projet.
Mais il a aussi à sa disposition l’ensemble des liens vers les autres
pages du site internet, ainsi que des liens vers les pages internet
importantes telles que www.epita.fr, le forum de notre promo (2011),
le site de Nathalie ”Junior” Bouquet, ou encore le site de nos ACD
préférés !
5.1.3
Présentation
Une section complète pour la présentation de la team et de chacun de ses membres a été érigée. Nous pouvons y retrouver un court
paragraphe de chacun sur lui-même et un autre sur la formation
du groupe. Viendront plus tard égailler ces pages, plusieurs photos des quatres membres. C’est aussi ici que l’on peut retrouver les
principales informations telless que les mails de chacun.
23
5.1.4
Downloads
Une des parties les plus importantes du site web. En effet c’est
ici que seront bientôt disponibles les premiers exécutables liés au
passage de la première soutenance.
Mais sont aussi présents d’autres utilitaires, sans rapport direct
au projet, mais utiles à tout Epitéen tels que DotNetSoul ou bien
puTTY.
5.1.5
Le futur du site
Dans le futur, je continuerai à maintenir à jour notre site, ce qui
sera sans aucun doute beaucoup plus simple maintenant qu’il ne
s’agit que de détails à modifier.
24
Chapitre 6
Conclusion
Les travaux exposés sont encore un peu brouillons, mais rien
de plus normal pour une première soutenance. En effet, tout les
éléments vont finir par se recouper et le jeu prendra forme.
Par rapport au planning, le projet est dans les temps. Les bases
des parties graphique et physique sont posées, l’intelligence artificielle est plus avancée que prévu et le site web est pratiquement
terminé.
Le bilan pour notre premier rapport de soutenance est donc
plutôt positif.
25