seconde soutenance
Transcription
seconde soutenance
Napolitan Pizzaiolo Mobylette Master Rapport de la deuxième soutenance. 19 mars 2005 Bit-niK Team : Abraham Goulagman Alexandre abraha_a Caldwell William caldwe_w Quillerou Laurent quille_l Varannes Rémy varann_r TABLE DES MATIÈRES 2 Table des matières 1 2 Présentation du pro jet 1.1 Avancement général et problèmes rencontrés . . . . . . . . . . 3 1.2 Avancement du site Web . . . . . . . . . . . . . . . . . . . . . 3 Travail individuel 3 2.1 William . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 Laurent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3 Rémy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.4 3 3 2.3.1 Gestion de la distance entre les véhicules . . . . . . . . 9 2.3.2 Site Internet . . . . . . . . . . . . . . . . . . . . . . . . 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.4.1 Alexandre Rapport de soutenance . . . . . . . . . . . . . . . . . . 11 2.4.2 Collisions . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.4.3 Le menu . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4.4 Les graphismes 15 . . . . . . . . . . . . . . . . . . . . . . Conclusion Napolitan Pizzaiolo Mobylette Master 16 Rapport de soutenance 2 1 Présentation du pro jet 1 3 Présentation du projet 1.1 Avancement général et problèmes rencontrés Si lors de la première soutenance nous avons présenté des ébauches de programmes, cette soutenance fut l'occasion de vraiment nous plonger dans la complexité du langage Caml dont nous découvrons jour après jour les facettes cachées. Et c'est au niveau de la portabilité du langage que s'est posé notre principal problème, en eet, si les modules Caml fonctionnent pour la plupart facilement sous Unix, beaucoup de modules sont très dicilement compilables sous Windows (et sans vouloir entrer dans une polémique, on comprend très bien les créateurs de ces modules...). Toujours est-il que nous avons passé beaucoup de temps à essayer de compiler des modules qui auraient pu nous être utiles comme ocamlgl (gestion d'OpenGL), OcamlSDL (gestion multimédia) ou encore camlimages (pour appliquer des textures aux objets OpenGL), nous avons donc dû nous pencher vers d'autres solutions comme LablGL pour l'OpenGL mais nous n'avons pas encore renoncé à compiler certains modules ! 1.2 Avancement du site Web Comme convenu, une version de notre site web est online. Il s'agit d'une version basique dotée de quelques scripts php pour gérer les news et acher les screenshots, pour plus de précisions sur les travaux réalisés, voir les partie respectives des webmasters. 2 Travail individuel 2.1 William Pour la première soutenance, j'avais écrit un moteur physique simple pour pouvoir m'attaquer à Opengl. Le moteur physique gère les déplacements de la mobylette et les collisions sur n'importe quelle carte donnée. Je me suis renseigné sur les diérentes façons d'utiliser opengl avec Caml. Il y en a deux principales : La première, Ocamlgl, est la plus intéressante, car non seulement elle permet l'utilisation de GLFW, plus simple d'utilisation, et plus rapide que Glut, mais Ocamlgl a une syntaxe très proche de celle de Caml, ce qui permet une écriture plus agréable de notre jeu. La deuxième se nomme Lablgl, elle permet l'utilisation de Glut, mais avec une syntaxe mal adaptée à Caml. Alexandre et moi avons plusieurs jours à essayer d'installer Ocamlgl, mais la quasi inexistence de documentation, et le temps restant Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.1 William 4 avant la soutenance nous ont obligé à cesser nos expérimentations avec ce dernier, et de me résoudre à utiliser Lablgl. La première diculté a été de comprendre qu'utiliser Glut voulait dire perdre tout contrôle sur le déroulement de l'application, et de modier mon moteur physique pour l'adapter aux exigences de Glut. Mais dès cet obstacle surmonté, il m'a sut de modier les fonctions d'achage que j'avais écrites pour le Graphe Caml pour avoir une interface simple en 2D en opengl. Après quelques rotations la vue était en 3D, et j'ai écrit trois fonctions pour avoir trois modes de caméra pendant le jeu : La première reste derrière la mobylette, et s'en approche quand elle prend de la vitesse pour donner un eet d'accélération amusant. La deuxième est une vue au dessus de la mobylette, perpendiculaire au sol, et l'utilisateur peut modier l'altitude de la caméra. Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.1 William 5 La dernière garde la mobylette au centre de l'écran, mais l'utilisateur peut la faire tourner dans tous les sens, le permettant d'admirer la beauté du niveau dans son ensemble. Ensuite j'ai fouillé dans les chiers de Lablgl pour trouver un moyen de gérer plusieurs touches en même temps et sans répétitions. Cela m'a pris du Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.1 William 6 temps mais le résultat est très agréable, surtout après avoir passé des heures àjouer sur le Graphe Caml. J'ai rajouté une partie au moteur physique qui crée une carte aléatoire de trois cases, et qui, lorsque la mobylette atteint la dernière case, supprime la première et en rajoute une. Je supprime la dernière case pour ne pas avoir à vérier qu'une case se rajoute sur une déjà existante, ou que le chemin s'encercle ce qui obligerait le jeu à s'arrêter, alors que le but de ce mode est d'être inni. J'écrirai une version qui ne supprimera pas le chemin au fur et à mesure pour la version nale du moteur physique. J'ai rajouté des fonctions pour pouvoir : changer entre les modes opengl "l de fer" et "rempli" acher (ou non) la dernière case en une autre couleur changer la hauteur des bâtiments ou des murs sur le côté (tout dépend de l'interprétation artistique du truc rouge sur le coté de la route). Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.2 Laurent 2.2 7 Laurent L'objectif de cette seconde soutenance était la réalisation d'une interface compatible CaML - Delphi. En eet même si le projet a une prédominance pour le CaML, il comporte une parti Delphi certaines fonctionnalités sont absentes dans OCaML. Pour cette seconde soutenance je me suis principalement attaché aux recherches sur le réseaux an d établir une compatibilité CaML - Delphi. J'ai tout d abord éplucher le manuel ( disponible sur http ://caml.inria.fr/ocaml/htmlman/index.html ) cependant celui ci ne contient aucunes données à ce propos. Je me suis donc orienté vers google ( http ://www.google.com ) ainsi que exaleads (http ://beta.exalead.com/search) un moteur de recherche très intéressant car celui-ci associe diérents mots clés an d indiquer de nouvelles pistes de recherches aux utilisateur. Malheureusement celui ci non plus ne m a donné aucune réponse... Ayant perdu quasiment tout espoir de trouver une documentation sur les possibilités de CaML au travers de la réalisation d un protocole je me suis rappelé d une ancienne tentative sous Mac OS 9 infructueuse pour installer un logiciel compatible avec le protocole eD2k : MLDonkey ! Je me renseigne donc sur les possibilités mais malheureusement il apparaît que celui-ci est incompatible avec Windows :'( même a l aide de cygwin ( http ://www.cygwin.com/ ) qui n est autre qu une librairie permettant de " porter " des application du monde Unix sans eectuer trop de changement dans le code source de celui-ci. Puis dans un second temps je me suis intéressé à la conception du site Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.2 Laurent 8 web. En eet an d apporter un aspect intéressant a celui-ci je me suis renseigné sur les bases de données MySQL ( http ://www.mysql.com/ ) au travers des diérant numéros de poss-presse ( http ://www.posse-press.com/ ) : Login pratique numéro 4, février 2005 ainsi que de code(r) : PHP pratique Host série #5 et de Pratique de MySQL et PHP aux édition O'Reilly ( http ://www.oreilly.com/ ). Je me suis aussi documenté sur le site ociel de PHP a l'aide du manuel ociel ( http ://www.php.net ) Ayant eu quelques soucis avec mes table Rémy s est alors occuper de la mise en forme et des scripts pour la récupération des news. J ai donc réaliser un scripte PHP permettant d acher les diérents screenshots : celui-ci liste les " .jpg " d'un dossier puis en fait des miniatures qui sont achées dans un tableau généré automatiquement. Finalement je me suis intéressé à la manière de récupérer les touches pressées via le code ASCII. En eet celui-ci étant standard il me parait plus indique lors d un échange de données inter ordinateur. Une fois que ces codes sont récupérés il sut de les écrire dans un chier et de transmettre ce chier au serveur pour que celui-ci analyse les informations, les traite et renvoie luimême des informations aux diérents clients connectés. Pour la soutenance suivante il faudra donc que je nisse l'implémentation du serveur et commence à obtenir des traitements sur les données envoyées Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.3 Rémy 9 par les clients grâce a un transfère de chier par exemple. 2.3 2.3.1 Rémy Gestion de la distance entre les véhicules A la dernière soutenance, la première partie du SIA à été mise en place avec l'ensemble de fonctions permettant à un véhicule de suivre le chemin tracé par la route et de choisir son chemin aux intersections de manière à tourner de manière crédible. Maintenant, il faut que l'on puisse gérer plusieurs véhicules sur la même map pour simuler le trac. Ainsi, pour cette soutenance, c'est la gestion de la distance entre les véhicules qui à été privilégiée an de pouvoir éviter qu'une voiture se comporte de manière particulièrement anormale. Par exemple, en fonçant à toute allure sur le véhicule se trouvant juste devant elle sans se soucier d'entrer en collision avec et de provoquer un bel accident, tout ça pouvant entraîner de nombreuses réactions en chaîne qui aboutiront à un immonde chaos sur la carte du niveau, qui était à la base censée reproduire la circulation normale d'une ville. Tout d'abord, la fonction gérant la distance entre deux véhicules renverra un booléen indiquant l'état du trac chaque fois qu'elle sera appelée. On appellera cette fonction en indiquant bien le véhicule concerné. Si ce véhicule se rapproche trop rapidement d'un véhicule situé juste devant lui, ralentit, qui est la fonction principale de distance.ml, le chier qui gère l'espacement des véhicules, renverra une réponse positive qui indiquera au moteur physique que le véhicule doit commencer à ralentir s'il ne veut pas provoquer une collision. La fonction ralentit utilise une technique de détection qui n'est sûrement pas la plus optimisée, mais qui est la seule qu'il m'a été possible d'implémenter pour obtenir le résultat souhaité. Ne souhaitant pas reproduire parfaitement le comportement d'un conducteur mais seulement un semblant d'intelligence, cette fonction devrait donner des résultats assez convenables dans notre jeu. Premièrement, on va déterminer la direction du véhicule testé pour savoir où il se dirige et vérier si quelqu'un se trouve sur son chemin. En utilisant la class vehicule dénie préalablement, on va pouvoir trouver cette direction. On utilise va (l'angle du vecteur vitesse) comme indiqué sur la gure 1 an de voir où va le véhicule. On détermine quatre grands espaces sur le cercle trigonométrique qui vont faire correspondre va avec l'une des quatre directions utilisées sur la map (Nord, Sud, Est, Ouest). On va ainsi renvoyer un Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.3 Rémy 10 entier compris entre 1 et 4 qui sera utilisé par ralentit qui va appliquer un traitement diérent suivant l'orientation du véhicule. Ainsi, nous connaissons désormais la direction du véhicule. On peut maintenant vérier si un véhicule se trouve devant lui. Nous allons donc créer un intervalle de référence qui va être utilisé pour les tests. Donc, maintenant, pour créer cet intervalle, il faut tenir compte de l'orientation de la voiture. On peut donc voir que les limites de l'intervalle en x et y sont diérentes si la voiture va à l'est ou à l'ouest, et encore plus si elle va au nord ou à l'est. On va donc utiliser pour dénir cet intervalle les valeurs de largeur et longueur d'un véhicule (récupérées préalablement en appliquant des formules trigonométriques à l'envergure de ce même véhicule), puis une valeur qui détermine la distance minimale à maintenir entre deux véhicules appelée securite. Il faut ensuite arriver à déterminer l'intervalle en décomposant toutes ces valeurs et en additionnant tout cela à partir du centre du véhicule. Cet intervalle obtenu, on peut commencer les comparaisons avec les coordonnées des autres véhicules. On dispose d'une liste récursive qui contient tous les véhicules circulant sur le circuit, et on peut extraire de ces véhicules toutes les informations que l'on veut à propos de leurs coordonnées ou leur Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.4 Alexandre 11 orientation. On va donc utiliser une boucle qui va s'appliquer tant que l'on a pas trouvé de véhicule se trouvant devant la voiture testée et que la liste n'est pas vide. On utilise donc les coordonnées de chacun des véhicules de la liste tour à tour. Si le centre d'un véhicule se trouve dans l'intervalle, c'est que la voiture testée se trouve trop près de lui et doit ralentir an d'éviter la collision. Cette fonction ralentit sera donc utilisée régulièrement an de contrôler la vitesse de chacun des véhicules présents sur la carte. 2.3.2 Site Internet Le site web de notre projet à évolué depuis la dernière soutenance conformément à nos intentions. J'ai tout d'abord changé le design du site pour qu'il représente un peu plus l'esprit de notre projet à l'aide d'un menu designé par Alexandre. Le site est maintenant un peu moins sobre mais est encore utilisable facilement car nous ne voulions pas faire quelque chose de trop farfelu. Ensuite, comme prévu, j'ai appris à me servir de PHP pour créer quelques scripts simples permettant de faciliter la mise à jour de notre site par chacun des membres du groupe. J'ai ainsi créé le système qui permet d'acher les news de notre site à partir d'une table SQL et qui évite de toucher au html dès que l'on souhaite faire passer un message sur le site. Je n'ai par contre pas encore réussi à créer un système d'administration qui permettrait un ajout encore plus simple de news directement à partir du site. Toutefois, possédant maintenant des connaissances satisfaisantes de ce langage qu'est le PHP, je compte réaliser ce système d'administration sous peu. En eet, il a fallut se xer des priorités et la lecture des news passait en premier, l'ajout n'étant pas si compliqué que sa, nécessitant juste de passer par la base de données de notre hébergeur. 2.4 2.4.1 Alexandre Rapport de soutenance Le rapport est une partie très importante du projet, c'est pourquoi il convient de le soigner. Pour ajouter une petite originalité au notre et surtout faciliter la lecture de code caml par un lecteur, j'ai décidé de trouver un package pour coloriser le langage Caml. Deux options se sont présentées Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.4 Alexandre 12 a moi : Lgrind et listings. Listings étant gratuit et open source, j'ai opté pour celui-ci. Je ne le regrette pas car il s'est avéré très simple d'usage et complet, il possède en outre une colorisation par défaut du langage Caml. J'ai cependant ajouté moi-même une colorisation des lignes d'interprétation car elles sont parfois nécessaire pour bien comprendre une fonction. Voici un exemple de code colorisé : # let val Fonction inc i n c = (+) 1 ; ; inc 2.4.2 : int −> int = <f u n > Collisions La détection de collision est d'autant plus longue qu'elle est précise. Pour faire un bon compromis entre ecacité et rapidité, la détection se fera en 3 étapes. Détection par case : Il n'est pas nécessaire de tester les collisions avec tous les véhicules de la map et heureusement ! Dans un premier temps, nous considérerons tout d'abord les véhicules présents sur les cases autour de notre véhicule. Détection par cercle : La méthode de détection de collision la plus rapide est la recherche par cercle, en eet nous avons le centre des 2 vehicules et leur envergure, on peut donc voir si les les cercles circonscrits aux 2 véhicules se croisent. C'est la deuxième étape de notre détection. On peut voir sur ce schéma qu'hélas, les véhicules étant rectangulaires, la détection peut se révéler désastreuse ! C'est un handicap majeur dans la réalisation d'un jeu où l'action se passe en ville. . . Détection par bounding box : L'avantage de cette détection est qu'elle est exacte mais elle est plus longue que les autres. Voyons comment elle se décompose : Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.4 Alexandre 13 Récupération des coins de la voiture Création de fonctions Je crée 4 triplets fonction,départ,arrivée qui correspondent chacun à un côté de la voiture. Je stocke l'abscisse de départ, celle d'arrivée et la fonction ane qui relie ces 2 points. Tests de collision J'ai obtenu les fonctions correspondants aux cotés de chaque véhicule. Il est donc aisé de regarder si elles se croisent. Si oui, il sut de récupérer les points de collisions en regardant où les fonctions s'entrecoupent. On obtient ainsi une détection au pixel près. Voici un schéma résumant la detection. On peut voir a chaque étape les véhicules en rouge qui sont éliminés. Une fois les points de collision récupérés, je prend le barycentre des ces points. en reliant ce point au centre de l objet, j'obtiens la direction de la force qu'il faut appliquer à l'objet qui le heurte. Je n'ai pas encore implémenté la réaction des véhicules lors de la collision car ;en eet, dans l'élaboration de mon type véhicule, je n'avais pas prévu que le vecteur vitesse puisse être diérent de la direction de l'avant de la voiture, je dois donc revoir tout mon moteur physique. J'implémenterai donc cet aspect pour la prochaine soutenance. Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.4 Alexandre 2.4.3 14 Le menu J'ai décidé, même si le jeu n'est pas encore opérationnel, de coder un menu type avec quelques options pour voir si c'était facile de le faire sous caml. A mon grand étonnement, j'ai trouvé la manipulation des fenêtres avec LablGtk plus simple qu'en Delphi ! Certes le codage n'est pas WYSIWYG mais déclarer un objet est simple et de plus il n'y a pas à s'occuper du placement des objets, on donne juste une organisation générale et LablGtk se charge de tout placer. Les objets sont de plus gérés dynamiquement, c'est-à-dire que la disparition d'un élément causée par une commande implique une restructuration automatique de la fenetre sans avoir à y toucher. La construction d'une fenêtre sous LablGtk est intuitive mais elle pousse en mème temps à s'organiser. En eet les objet qu'on ache sont tous imbriqués dans un objet plus gros qui est lui même une partie d'un autre et ainsi de suite jusqu'à l'élément le plus gros qui est la fenêtre. LablGtk est en quelque AT X est à Word. sorte à Delphi ce que L E Voyons de plus près la façon dont on construit les fenêtres dans LablGtk. Je n'ai pas exploré toutes les possibilités de cette librairie étant donné le peu d'utilisation qu'on en fait ici mais on voit qu'elle renferme de très puissante possibilités. LablGtk est basé sur le principe d'imbrication. Certains objets comme les window ou les frame ne peuvent contenir qu'un seul objet et d'autre comme les vbox et les hbox peuvent en contenir une innité. Les hbox permettent Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 2.4 Alexandre 15 d'aligner des objets horizontalement et les vbox verticalement. Pour construire une fenêtre il faut donc jouer des imbrications. Voici l'exemple du menu que j ai créé. On voit bien ici que les frame servent à organiser les éléments et le vbox à aligner verticalement les radio button. Pour créer un simple bouton, on utilise la syntaxe suivante : let true button = GButton . button ~use_mnemonic : ~ l a b e l : " _Options " ~p a c k i n g : ( vbox#pack ~padding : 5 ) ( ) button#c o n n e c t#c l i c k e d ~callback : create_options ; Le in label indique le texte du bouton, le est imbriqué le bouton et enn le packing indique dans quel objet callback indique la fonction à appeler lorsque l'utilisateur clique sur le bouton. Voici le fonctionnement de base de Lablgtk 2.4.4 Les graphismes Je me suis un peu intéressé aux graphismes et j'ai donc créé le logo du jeu qui nous faisait cruellement défaut ! J'ai fait un petit menu style pizza-tomate pour le site et enn j'ai designé une boite à pizza just for fun. Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 3 Conclusion 3 16 Conclusion Pour cette soutenance, nous avons tenu la plupart de nos promesses et nous avons posé des bases solides pour la conception du reste du jeu. Le grand dé de la prochaine soutenance sera d'adapter le SIA, le moteur physique et le moteur physique pour qu'ils marchent de concert. Nous devrons aussi nous pencher sur le problème du son qui pourra être résolu par l'utilisation d'OcamSDL mais nous devrons alors surmonter le problème de la compilation sous windows. L'autre grand dé sera la compilation de Pascal et de C pour la réalisation future du réseau. Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2 RÉFÉRENCES 17 Dédicace Alexandre dédicace tout son travail eectué dans ce projet à notre bien aimée Kirika, une gerbille dèle qui nous aura toujours soutenu de ses couinements malicieux et qui est décédée lors d'une coding party. Nos pensées t'accompagnent ! Références [1] http ://caml.inria.fr/ocaml/htmlman/index.html [2] http ://www.google.com [3] http ://beta.exalead.com/search [4] http ://www.cygwin.com/ [5] http ://www.php.net [6] http ://www.mysql.com/ [7] http ://www.posse-press.com/ [8] http ://www.oreilly.com/ Napolitan Pizzaiolo Mobylette Master Rapport de soutenance 2