Projet n°3 M1 IngéLog 2010/2011

Transcription

Projet n°3 M1 IngéLog 2010/2011
Projet n°3 M1 IngéLog 2010/2011
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
a. Existant : .......................................................................................................................... 9
b. Responsabilité du groupe :.......................................................................................... 9
a. Existant : ........................................................................................................................ 10
b. Responsabilité du groupe :........................................................................................ 10
a. Composite Object : .................................................................................................... 12
Structures : ....................................................................................................................................................... 12
Avantages : .................................................................................................................................................... 13
Exemple de mise en œuvre : ...................................................................................................................... 13
b. Entity System & Data Driven : .................................................................................... 15
Entity System : ................................................................................................................................................. 15
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Data Driven : ................................................................................................................................................... 18
c. Model View Controller (MVC) : ................................................................................. 18
a. Designs coté client : ................................................................................................... 19
Cas d’utilisation récolter ressource : .......................................................................................................... 19
Diagramme de séquence d’un click sur un bouton : ............................................................................ 20
b. Designs coté serveur : ................................................................................................ 21
Modélisation de la base de données liée aux comptes utilisateurs/joueurs :................................... 21
Cas d’utilisation des comptes utilisateurs : ............................................................................................... 23
Cas d’utilisation des parties : ....................................................................................................................... 24
Algorithme de création de sprites :............................................................................................................ 25
a. Outils et procédures de développement coté client : ......................................... 27
Javascript : ...................................................................................................................................................... 27
JQuery :............................................................................................................................................................ 27
HTML 5 : ............................................................................................................................................................ 28
AJAX : ............................................................................................................................................................... 28
User Interface : ............................................................................................................................................... 29
Model objet Interne de Javel : ................................................................................................................... 30
Model objet de Javel : ................................................................................................................................. 31
b. Outils et procédures de développement coté serveur : ...................................... 33
PHP et Programmation Orientée Objet .................................................................................................... 33
Framework ...................................................................................................................................................... 33
a. Du client vers le serveur.............................................................................................. 38
b. Du serveur vers le client.............................................................................................. 38
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
A. Projet :
Projet Jeu de Stratégie Web – [DEV]


Développement et conception de l’interface du jeu
Développement et conception de la logique de l’application et d’automates Symfony
de mise à jour du jeu
B. Equipe :



Lemeunier Rémy
Poli Romain
Tavernier Jade
C. Client :



Oger Stanislas
Mazza Benjamin
Gotab Pierre
D. Contraintes :
Les principales contraintes résident dans le sujet, la technologie. Nous nous sommes en effet
engagés à développer l’interface du jeu avec Javascript & Jquery et le moteur du jeu coté
serveur avec le framework Symfony.
A. Positionnement :
Le jeu est un Casual Game (jeux vidéo occasionnel : jeu simple et rapide à jouer conçu pour
prendre du plaisir rapidement lors de parties) qui se place sur le marché des jeux web
classiques.
B. Gratuité :
Il suivra le modèle qui a fait le succès du jeu web : le jeu est gratuit mais pour débloquer toutes
ses fonctionnalités ou pour obtenir des éléments inédits il faut souscrire à un abonnement ou
faire un micro-paiement du type Allopass.
C. Ambiance :
L'ambiance sera fortement déterminée par les graphismes. Le jeu se déroulera dans un univers
futuriste ne se prenant pas trop au sérieux. Il y aura donc quelques touches d'humour, et
quelques éléments irréalistes. Le client désire une communauté forte basé sur le jeu en équipe.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
D. Les joueurs ciblés:
Le jeu vise les joueurs occasionnels (casual gamer) qui ont peu de temps à passer devant un
jeu. Il suffira de 15 minutes maximum par jour pour effectuer toutes les actions nécessaires.
E. Les concurrents :
Les principaux concurrents sont :
 Motion twin est une société de développement de jeux gratuit à option payante sur
navigateur. Elle est le leader du marché français. Les jeux phares de la société sont
Labrute, Miniville ou encore Hordes pour les plus connus.

GameForge est également un éditeur de jeux en ligne par navigateur. L’entreprise est
un des leaders mondiaux du marché. Elle s’est notamment illustrée avec des titres
comme Ogame, Ikariam, BattleKnight.
F. Objectifs :
A terme le jeu sera mis en ligne avec du contenu principal gratuit et du contenu évolué
payant. Nous espérons qu’une nouvelle communauté naîtra autour de l’univers du jeu,
nécessaire pour sa survie sur la toile, qui participera donc à l’évolution du jeu.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
A. Présentation général du jeu :
Jeu de stratégie en ligne dans un monde semi persistant alliant
(1 tour / jour) et temps réel. Le jeu présente actuellement 3 modes de jeu :



tour
par
tour
Capturer le drapeau : chaque équipe doit capturer le drapeau de l’ennemi.
Protéger un élément fixe (bâtiment) : chaque équipe doit empêcher l’ennemi de
détruire son élément tout en attaquant celui du camp adversaire.
Eliminer les adversaires : chaque équipe doit annihiler toutes les troupes adverses.
Les parties se déroulent sur une quinzaine de jours avec un maximum de 5 joueurs par équipe
qui s’affrontent.
Un système de fidélisation est créé grâce à un profil persistant des joueurs et une acquisition de
points d’expériences, d’objets et de compétences.
On pourra aussi proposer aux utilisateurs de participer à des matchs « officiels », une sorte de
championnat, ou à des matchs amicaux.
B. Description de la carte :
Dans un cadre futuriste, la carte se compose d’hexagones comportant un terrain ainsi que les
divers éléments la composant (joueurs, bâtiments, objets, conduite de gaz ...).
La carte peut être modifiée par les joueurs mais aussi par les conséquences de leurs actions.
Remarque : ce travail ne fait pas partie de notre tache mais une bonne compréhension de
celle-ci est nécessaire pour la conception du moteur de jeu.
C. Les actions du joueur :
Tout d’abord les joueurs peuvent évidemment se déplacer sur la carte. Il est permis aussi de
construire des bâtiments, de poser des objets, d’en échanger et enfin de les utiliser pour
interagir avec l’environnement.
Il y a donc un système de points de déplacement et de points d’action par tour. De plus les
joueurs ont à leur disposition un arsenal de bombes aux effets divers et variés.
Les joueurs ont un champ de vision restreint à leur équipe et en fonction du degré de leur
compétence de vision (brouillard de guerre).
D. Gestion des ressources :
Le joueur possède une quantité limitée et définie de « cluster », des nano-robots à disposer sur
la carte afin de construire ou réparer des bâtiments ainsi que de récolter des ressources.
On retrouve dans ce monde deux types de ressources :
 Matériel provenant de débris
 Gaz provenant des canalisations
Chaque action effectuée sur une conduite influe sur les autres actions réalisées sur la même
conduite.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Dans ce projet, nous travaillons en coopération avec nos tuteurs. C’est pourquoi nous
présenterons les différentes fonctionnalités via celles qui sont à notre charge et celles
effectuées par les autres membres de l’équipe.
A. Fonctionnalités coté client :
a. Existant :




Architecture générale (Obj, Component/Core/Lib/View, Main)
Débogage (Dbg)
Système de communication (Requester)
Carte dynamique et mini-carte (affichage et interactions)
LibMainMinimap)
(LibMap,
b. Responsabilité du groupe :





Interface graphique (UI, widgets, intégration)
Root, Button, StateButton, Toolbar, Window, Progress, Slider, Grid
Protocole de communication (teneur des messages envoyés)
Interactions joueurs (déplacements, échanges, ...)
Interactions environnement (construction, récolte, pose de bombes, ...)
LibMainMan,
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
B. Fonctionnalités coté serveur :
a. Existant :
 MCD du monde persistant
Modélisation de l’ensembles des entités qui seront gérées dans le jeu.
 Backend partiel de gestion du monde
Traitements coté serveur de plusieurs actions liées à la gestion du jeu.
Par exemple, lorsque le joueur effectue une action sur la carte, le client transmet une requête
au serveur et ce dernier s’occupera de mettre à jour les informations de la carte et de chaque
entité sélectionnée afin de faire la partie.
 RequestController
Contrôleur de requêtes (logique du Design pattern Model – View – Controller).
Vérifie, sécurise et dispache les actions à effectuer sur le serveur.
 RequestBuilder
Classe utilitaire et métier pour construire les requêtes.
 Structure du moteur de jeu et d'évènements
Classe structurelle, squelette des fonctions du moteur du jeu.
 Générateur d'univers
Editeur de carte en "presse bouton", c’est à dire sans aucune utilisation de code source.
b. Responsabilité du groupe :
 MCD des comptes
Modélisation de la logique et des données de connexion/inscription ainsi que de la relation
entre le compte joueur et le compte utilisateur.

Frontend pour gestion des comptes
o Définition de la structure sous Symfony de l’implémentation de l’inscription et de
l’authentification des utilisateurs
o Création des formulaires de gestion du compte
o Réalisation des règles de validation des formulaires (client & serveur)
o Sécurisation des comptes et mots de passes

Backend complet pour la gestion des comptes
o Vision globale et rapide de l’ensemble des comptes
o Définition des actions modératrices
o Gestion des droits
o Sécurisation de l’accès
 Algorithme de création de sprites
Afin d’optimiser le nombre de requêtes au chargement des images, nous allons créer un
algorithme pour générer des sprites. C’est à dire que nous allons rassembler des images en une
seule qui ne sera affichée que partiellement grâce au CSS.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
La difficulté réside alors dans l’optimisation de l’espace graphique à utiliser pour réaliser ces
images.
 Mise à jour nocturne "générique"
Phase de traitement des différentes actions effectuées dans la journée. Le serveur se ferme
donc à heure fixe chaque soir et calcule l’impact sur le monde de chaque opération.
Cela correspond donc à la compilation des actions de la journée et de la logique de jeu pour
déduire le monde du jour suivant.

Implémentation de la logique de jeu en utilisant la structure et les outils existants
 Templates des pages annexes
Définition de la structure et de la mise en page des pages autres que le jeu (HTML + CSS).
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
A. Design patterns :
a. Composite Object :
En programmation objet, un objet composite est constitué d'un ou de plusieurs objets similaires
(ayant des fonctionnalités similaires). L'idée est de manipuler un groupe d'objets de la même
façon que s'il s'agissait d'un seul objet.
Structures :

Component (composant)
o déclare l'interface pour la composition d'objet
o met en œuvre le comportement par défaut
o déclare une interface pour l'accès aux composants enfants

Leaf (feuille)
o représente des objets feuille dans la composition

Composite
o définit un comportement pour les composants ayant des enfants
o stocke les composants enfants
o met en œuvre la gestion des enfants de l'interface Component

Client
o manipule les objets de la composition à travers l'interface Composite
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Avantages :
Son principal
avantage
découle
de
la définition même
de
ce
pattern.
Etant donné qu’un agrégat est alors utiliser comme un objet unique, il est donc possible
d’imbriquer ces agrégats .
Exemple de mise en œuvre :
Soit la structure hiérarchique suivante, design d’un objet graphique :
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
On préférerait pouvoir appliquer directement à un groupe d'objets graphiques les méthodes
d'objet graphique lui même. C’est pourquoi le pattern composite fut créé :
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
b. Entity System & Data Driven :
Entity System :
L’Entity System est un Design pattern de plus en plus utilisé dans les jeux vidéos.
En effet, les jeux vidéos nécessitent une quantité importante d’objets aussi spécialisés les uns
des autres. On constate ainsi très fréquemment que les objets finaux d’une application en
Programmation Orientée Objet résultent d’une importante succession d’héritages.
La flexibilité et la mise à jour des objets dans ce genre de système est relativement complexe
car la modification d’un élément implique souvent une modification de la structure
hiérarchique, ce qui est une opération relativement lourde.
 Prenons l’exemple suivant :
A la création du jeu, les concepteurs créent une structure orientée objet des différents
éléments du jeu. On retrouve donc plusieurs niveaux d’héritages afin de bien définir toutes les
particularités de chaque objet.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Si durant une mise à jour du jeu, les concepteurs décident que les Tanks ne soient plus mobiles,
il faut alors effectuer une modification de la structure pour un nouveau type de véhicules
statiques :
Cette manipulation étant particulièrement lourde, on retrouve donc souvent dans les jeux
vidéos des « super classes » qui possèdent toutes les fonctionnalités implémentées. Les objets
sont donc identifiables en fonction de leur utilisation, on parle alors de « Blob » :
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
L’Entity System s’inspire légèrement de cette situation car il n’ya plus d’objet, chaque élément
est une entité, l’élément de base.
Cependant, la structure est beaucoup plus intelligente car une entité n’a aucune
fonctionnalité de base puis est définit en fonction des méthodes qu’elle implémente.
 Prenons un exemple simple POO :
On transforme alors ces objets en entités et ainsi une voiture de sport en est une car elle
implémente les méthodes d’une voiture et celles d’une sportive :
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Data Driven :
Le Design pattern Data Driven est étroitement lié à l’Entity System car ce design permet de
structurer une organisation en fonction des données.
C’est à dire que les traitements s’effectuent en fonction des données traitées. Or l’Entity System
spécifie pour chaque entité l’ensemble des fonctionnalités qu’elle implémente et donc
quelque soit le but de l’entité, les données sont gérées de la même manière.
Admettons qu’une première entité « Avion » et qu’une seconde « Voiture » ont toutes deux la
faculté de se déplacer. On effectuera alors le déplacement de chacune de la même façon.
Cette mise en œuvre permet ainsi, à plus grande échelle, d’optimiser le traitement des
opérations en regroupant les actions similaires pour l’ensemble des entités.
c. Model View Controller (MVC) :
Le Model View Controller est une architecture et une méthode de conception qui organise
l'interface homme-machine (IHM) d'une application logicielle.
Elle divise l'IHM en :
 un modèle : traitement des données
 une vue : interface utilisateur
 un contrôleur : synchronise la vue et le model
L’avantage d’utiliser ce modèle est la clarté de l'architecture qu'il impose. Ce qui permet de
simplifier la maintenance ou l’amélioration du projet. Car la modification des traitements ne
change pas la vue.
On peut modifier le modèle tout en conservant les vue actuels.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
B. Technologie :
a. Designs coté client :
Cas d’utilisation récolter ressource :
Voici un diagramme pour expliquer le déroulement effectué pour récolter des ressources.
Tout d’abord le joueur fait une demande de création du cluster du Nano robot.
La taille du cluster diffère suivant le niveau du joueur c’est pour cela qu’on fait une demande.
Ensuite on crée le cluster.
Puis le joueur demande de récolter des ressources, la marche à suivre serra différente suivant si
c’est des débris, canalisation ou usine. C’est pour cela qu’on les différencie.
Puis on demande au nano cluster d’effectuer la récolte.
De la même manière, le jeu implémentera diverses actions du même type issues d’interactions
avec les joueurs ou l’environnement :
Interaction Joueur
 se déplacer
 acheter une unité
 modifier son compte
 discuter grâce au chat
Interaction Environnement
 récolter
 poser une bombe
 attaquer
 se déplacer
 attaquer
 construire
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Diagramme de séquence d’un click sur un bouton :
Voici le diagramme de séquence d’un clic sur un bouton.
Cela nous permet de voir les relations qu’il y a entre les différents objets.
Lorsqu’on clique sur le bouton la fonction click d’ImgButton est appelé puis celle-ci appel la
fonction clic de notre composant UI.Button.
Ensuite notre UI.Button informe l’UI qu’il y a eu un clic puis le Manager est interpelé par l’UI pour
effectuer les changements demandés.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
b. Designs coté serveur :
Modélisation de la base de données liée aux comptes utilisateurs/joueurs :
Dans l’optique d’utiliser le framework symfony qui offre le mapping de la base de données,
c’est à dire que la base est étroitement liée aux objets, nous avons conçu les relations entre
l’utilisateur et le joueur via un MCD.



sfGuardUser : profil utilisateur
player : profil joueur
level : niveaux d’expérience (le niveau d’un joueur est calculé en fonction de son
experience suivant plusieurs seuils)
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges




playerTeam : relation montrant l’appartenance d’un joueur à une équipe
team : équipes présentes dans le jeux
playerEquipment : relation montrant pour un joueur la possession d’un ou plusieurs
objets
equipment : objets présents dans le jeux
Une fois, la conception des utilisateurs sur le serveur effectuée, nous nous intéressons sur la
manière dont nous allons les guider sur le site.
Nous proposons donc une vision de les processus d’inscription/connexion et de connexion à
une partie.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Cas d’utilisation des comptes utilisateurs :
Dans la situation initiale, un internaute se connectant sur le site possède trois actions possibles :



s’il est déjà inscrit et qu’il connaît son mot de passe, il peut se connecter au jeu
s’il est déjà inscrit mais qu’il a oublié son mot de passe, il peut demander à renouveler
un nouveau mot de passe aléatoire via son adresse électronique qui lui sera envoyer sur
sa boîte électronique
s’il n’est pas encore inscrit, il peut alors procéder à son inscription qui une fois terminée le
conduira pendant la création de son profil joueur avant de le connecter au jeu
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Cas d’utilisation des parties :
Cette situation met en œuvre le processus de répartition des joueurs dans les différentes
instances de jeu.
Un joueur se connecte premièrement sur son compte et désire commencer une partie, deux
modes de jeu sont possibles :

participer à une partie public officielle : le joueur est alors dirigé par le serveur qui le
connecte à une partie déjà créée du niveau du joueur ou si aucune partie ne
correspond au joueur, il crée une nouvelle instance de jeu et le joueur reste en attente
de connexion du minimum de joueurs recommandés.

participer à une partie privée entre amis : le joueur choisit alors s’il veut prendre part à
une partie existante ou s’il souhaite créer un nouveau monde.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Algorithme de création de sprites :
En autre que la gestion des processus liés aux utilisateurs nous sommes en charge de
développer un programme en PHP qui permette de créer des sprites CSS.
On appelle sprite CSS une méthode d’optimisation des images d’un site internet en regroupant
les différents graphismes de l’interface sur une seule image. Grâce à ce principe une seule
image est donc chargée pour l’ensemble de l’interface.
Cette image est alors utilisée via la propriété background du langage de style CSS. On définit
une vue restreinte de l’image que l’on place sur la sous image souhaitée via la propriété
background-position.
Prenons par exemple un ensemble d’images que nous souhaitons rassembler :
Nous commençons donc par identifier la délimitation en rectangle de la place minimum
utilisée par chaque image :
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Enfin on range les images de haut en bas et de gauche à droite les images dans l’ordre
croissant de leur taille.
La difficulté de cette mise en œuvre viendra donc du fait d’optimiser
l’espace utilisé en prenant en compte les espaces et en modulant le
positionnement des blocs afin de combler au maximum ces espaces
vides.
Le but étant de réaliser un résultat digne de le sprite suivant,
surement le plus connu sur la toile :
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
A. Technologie :
a. Outils et procédures de développement coté client :
Javascript :
Javascript est un langage normé (ECMA-262), créé en 1995 par Monsieur Eich Brendan, il est
libre et gratuit.
C’est un langage de script incorporé dans un document HTML, il permet donc d'améliorer une
page HTML en la rendant dynamique car grâce à lui on exécute des commandes du coté
client.
Cela met en évidence qu’il est relié directement au navigateur qui ouvre la page, mais cela
n’est pas un problème car 99% des utilisateurs utilisent un navigateur qui supporte nativement
Javascript.
Il y a des alternatives à Javascript comme Flash, Silverlight et Java.
Tout d’abord, Flash nécessite l’installation d’un plugin, il est proprietaire et payant.
Ensuite Silverlight lui aussi nécessite l’installation d’un plugin et il n’est également pas très
répandu.
Et enfin Java a également besoin d’un plugin et il n’est pas apprécié dans le domaine du jeu
web.
Nous avons décidé d’utiliser le langage Javascript en fonction de la clientèle que nous visons.
Une bonne partie de notre clientèle sera des salariés qui souhaitent jouer pendant leurs heures
de travail, sur leur ordinateur de travail. Nous avons donc opté pour une page web standard
avec des technologies natives, c’est pour cela que notre choix s'est porté sur Javascript.
JQuery :
Introduction :
jQuery est un framework puissant, simple et léger très utilisé par de nombreux sites internet
(comme Google, Wordpress, mozilla.org, ...). Il est libre (sous licence MIT, GPL), compatible
avec tous les navigateurs et la documentation est agréable et fournie. JQuery a pour but
d’être non-intrusif, facilement modulable grâce à de nombreux plugins et très tolérant en cas
de cohabitation avec d’autres librairies.
Historique du framework :
La première version de JQuery date de juin 2006 en version 1.0 alpha (version sans
toutes les fonctionnalités prévues dans le Framework final). La version actuelle est la v1.4.4.
Points forts du framework :




simplicité d’utilisation
documentation en ligne
quantité de plugins
dynamisme du projet et de sa communauté
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Points faible du framework :


hétérogénéité dans la qualité des plugins
facilité à produire un code peu optimisé et consommateur en ressources
Les plugins :
Les plugins permettent d’étendre les capacités de jQuery en ajoutant de nouvelles
fonctions et de nouveaux attributs utilisables par tout objet jQuery. Les plugins permettent de
rendre JQuery moins lourd. Le développeur choisi uniquement les fonctionnalités qu’il souhaite.
JQueryUI :
JQueryUI est né d’un plugin nommé Interface, développé en dehors de l’équipe de
développement officielle. Il fait maintenant parti du projet sous le nom de JQUeryUI. Ce plugin
permet de rendre le site interactif en y ajoutant des éléments dynamiques tel que des
animations sur le texte, des barres de défilement, des barres de progression, le drag and drop
(glisser,déposer) .
Pourquoi JQuery? :
Car c’est l’un des framework le plus utilisé, la documentation est très fournie. C’est un
framework de qualité constamment en évolution, avec des développeurs se souciant des
gains de performances et d’optimisation ainsi que de compatibilité entre ses versions. De plus il
est compatible avec tous les navigateurs actuels.
Les concurrents de JQuery :
Les principaux concurrents sont :
 Mootools
 Dojo
 Prototype
 Yahoo User Interface
HTML 5 :
HTML5 est le devenir du HTML. Il convient tout à fait à la conception d'applications dynamiques
puisqu'il s'oriente clairement dans cette direction (canvas, local database, high level events,
websockets, ...).
AJAX :
AJAX : Asynchronous Javascript and XML.
Ajax réunit un ensemble de technologie comme Javascript, CSS, XML, le DOM et le
XMLHttpRequest pour réaliser des applications Web.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
DOM et JavaScript servent à modifier le contenu de la page dans le navigateur par
programmation.
XMLHttpRequest est utilisé pour dialoguer avec le serveur Web (Asynchrone). La notation XML
structure les informations transmises entre le serveur Web et le navigateur.
A la place de XML on peut utiliser JSON.
AJAX permet le dialogue entre un navigateur et un serveur web de manière Asynchrone.
L’’avantage de l’AJAX est qu’il fait tout cela sans recharger la page, il modifie directement le
contenu de la page.
Lorsque le navigateur envoie une requête au serveur, il n’attend pas ca réponse ce qui permet
à l’utilisateur de pouvoir continuer à effectuer des modifications.
Il ne nécessite pas l’installation d’un plug-in comme ses concurrents Adobe Flex ou Microsoft
Silverlight ce qui est un avantage.
User Interface :
Pour la réalisation de l’user interface nous allons utiliser un framework réalisé
par Pierre Gotab : UI.
Notre tuteur Pierre Gotab a décidé de créer son propre Framework car il n’existe à notre
connaissance aucune librairie maintenue qui permet de faire des composants d’interface
graphique suffisamment personnalisables pour s'intégrer parfaitement dans un jeu.
Le framework de Pierre est un système unifié de gestion des composants, il manipule les UI.*.
Ces composants sont soit des interfaces avec une autre librairie, soit un composant réalisé par
nous même lorsque aucune solution existante n’est satisfaisante.
Nous privilégierons en premier lieu les composants issus de la librairie Jquery.UI car nous utilisons
déjà Jquery pour le reste de l’application.
Voici l’interface commune des composants :
 instanciable grâce a la fonction initialise et installe
 représente un Objet HTML concret, plaçable et déplaçable (fonction getElement)
 peut éventuellement contenir de HTML arbitraire ( fonction getContent)
 peut être hautement personnalisable avec du css (fonction getElement().addClass)
 peut être détruit (fonction delete)
Les composants :

Root :
C’est un objet qui prend tout l'écran, il représente le contexte général de l’application. Il
réagit au redimensionnement de la fenêtre. Aucune librairie ne propose de composant
comme cela.

Button :
C’est un objet cliquable, il réagit au clic, peut être toggle (actif ou non actif) et peut
faire partie d’un radio Group (les boutons interagissent entre eux s’ils sont dans le même
groupe).
Jquery propose le bouton Jquery.button qui est satisfaisant mais pas personnalisable.
Donc nous créons une interface d’un fork de jquery.button -> jquery.xButton.

Toolbar :
C’est un conteneur pour d’autre composant UI. Il peut être horizontal ou vertical.
Des composants de ce style existent dans des librairies externes mais il n’accepte que
des composants natifs de leur librairie.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges

ProgressBar :
Cet objet représente une barre de progression.
Nous avons choisi le composant Jquery.ProgressBar de la librairie Jquery mais peu
personnalisable donc il est utilisé comme Button.

Slider :
C’est un objet composé d’un curseur pouvant être déplacé entre deux bornes. Il
change dynamiquement les valeurs sélectionnées.
Le composant Jquery.Slider nous convient.

Windows :
C’est une fenêtre redimensionnable, déplaçable, avec titre, bordures et bouton de
fermeture.
FancyBox, shadowBox, Fancy Zoom (rapide).

Drag :
C’est un objet qui peut être déplacé grâce à la souris.
Draggable jquery, Dragdealer

Grid :
C’est un composant qui permet de créer des tableaux.
jqGrid

Scrollbar :
Il permet de se déplacer au sein d’un document.
Tiny scrollbar, jScrollPane
Model objet Interne de Javel :
Tout d’abord voici les conventions de nommage pour les modèles objet :
 Quelque soit le modèle :
o UneClasse,
o uneInstance,
o propriete_publique,
o propriete_privee,
o methodePublique(),
o methodePrivee()
 Modèle objet interne : _propriete_builtin_
 Modèle objet de javel : _propriete_builtin_
Le cœur de Javel est composé d’un factory ( obj ) qui prend en entré une Hashmap et
retourne une fonction constructeur contenant le code de création d’une instance de l’objet.
La Hashmap contient des fonctions, qui seront les méthodes de classe, et éventuellement un
bloc de déclaration _static_.
Si autre chose y est présent, une exception SyntaxError sera levée.
La fonction constructeur, que l’on appellera classe par la suite et elle possède comme
propriétés celles présentent dans le bloc _static_.
Utilisé avec le mot clé new, elle va créer une instance possédant une propriété _class_ se
référant à la classe, puis va exécuter la méthode _init_ en lui passant les arguments nécessaires.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Model objet de Javel :
Le model contient quatre entités :
 Components,
 Core,
 Lib,
 View.
Un Core, Lib, View est un Component.
Une View est attachée à une Lib.
Component :
Un component est une factory de classes, il retourne une classe ayant des propriétés et des
méthodes prédéfinies.
Il prend en entrée :
 Le type parmi :
o Component.TYPE_CORE = 0
o Component.TYPE_LIB = 1
o Component.TYPE_VIEW = 2
 Le classname : une chaine de caractères unique
 Les properties du composant : une hashmap ne contenant que des méthodes (et pas
de bloc static)
Il renvoie une classe ayant les méthodes définies dans properties avec en plus :
 Des variables statiques :
o _type : le type de composant
o _classname : le nom de la classe
o _debug_mode : le niveau de débogage du composant (0 par défaut)
 Des méthodes :
o toString() et toSource() renvoient un texte adapté (usage interne au débogueur)
o debug(message [, level]) : affiche message dans la console si le niveau de
débogage du composant est supérieur ou égal à level (défaut 0)
o debugEx([message,] exception [, level]) : affiche les détails de l'exception assortie
de message dans la console
Core :
Un Core produit un Singleton essentiel au fonctionnement du jeu.
Singleton : permet de restreindre l’instanciation d’une classe a un seul objet (ou quelque objet
seulement)
le Core est appelé avec deux arguments :
 classname est une chaine de caractères unique servant à identifier ce Core
 properties est un ensemble de méthodes
Il doit posséder :
Une méthode initialize(params) qui initialise le composant, notamment ses propriétés
d'instance.
Eventuellement une méthode install() qui peut installer le composant sur la page
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
En réalité il ne fait que créer un Component avec comme type Component.TYPE_CORE, puis il
retourne une instance de ce Component.
Lib :
Une Lib est une librairie de fonctions de manipulation de données.
Tout comme un Core, une Lib prend deux arguments.
En revanche elle retourne une classe. Javelutilise plusieurs librairie de façon interne.
Il faut comme pour le Core il faut implémenter une fonction initialize.
View :
Une View est une vue sur les données manipulées par une Lib. C'est la partie contrôleur d'un
modèle MVC. Elle gère la majeure partie de l'affichage et les interactions avec l'utilisateur
Le deuxième argument est la Lib dont la View dépend. Les deux autres sont les mêmes que
pour Lib ou Core.
La view retourne une classe instanciable. Cette classe à une propriété statique _Lib qui pointe
sur la classe Lib rattachée.
Il faut également implémenter la fonction initialize pour initialiser le composant.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
b. Outils et procédures de développement coté serveur :
PHP et Programmation Orientée Objet
Le langage PHP est un langage de programmation web côté serveur, ce qui veut dire que
c'est le serveur qui interprète le code PHP et génère du code qui sera interprété par le
navigateur Internet.
La version actuelle de PHP est la version 5, sortie le 13 juillet 2004.
Elle utilise Zend Engine et introduit un véritable modèle objet, une gestion des erreurs fondée sur
le modèle des exceptions, ainsi que des fonctionnalités de gestion pour les entreprises. PHP 5
apporte beaucoup de nouveautés, telles que :
 le support de SQLite, qui est un système léger de gestion de bases de données
embarqué, au détriment de la bibliothèque cliente de MySQL, plus puissante mais qui
n'est désormais plus activée par défaut

des moyens de manipuler des fichiers et des structures XML basés sur libxml2 :
o une API simple nommée SimpleXML
o une API Document Object Model assez complète
o une interface XPath utilisant les objets DOM et SimpleXML
o intégration de libxslt pour les transformations XSLT via l'extension XSL
o une bien meilleure gestion des objets par rapport à PHP 4, avec des possibilités
qui tendent à se rapprocher de celles de Java
Framework
Definition :
Un framework est un ensemble d'outils et de composants logiciels organisés conformément à
un plan d'architecture et des design patterns. L'ensemble forme un squelette de programme. Il
est souvent fourni sous la forme d'une bibliothèque logicielle, et accompagné du plan de
l'architecture cible du framework.
Avec un framework orienté objets, le programmeur qui utilise le framework pourra personnaliser
les éléments principaux du programme par extension, en utilisant le mécanisme d'héritage :


créer des nouvelles classes qui contiendront l’implémentation des fonctionnalités
spécifiques au programme
Surcharger les fonctionnalités existantes dans les classes du framework
Un framework est conçu en vue d'aider les programmeurs dans leur travail.
L'organisation du framework vise la productivité maximale du programmeur qui va l'utiliser afin
de baisser les coûts de construction du programme.
Frameworks PHP les plus utilisés :





CakePHP (open source)
Zend Framework
CodeIgniter
Copix
Jelix
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Symfony :
Historique du framework
La première version publique de Symfony, bien qu'alors encore en béta, est apparue
en Octobre 2005. Symfony a finalement été publié en version 1.0 stable en janvier 2007.
La version actuelle est la version 1.4 en LTS (Long Time Support), elle est supposée perdurer
jusqu’en 2012.
La nouvelle version, Symfony 2.0 devrait bientôt voir le jour et est déjà disponible en béta.
Origine et motivations du framework
Symfony est un framework développé par l'entreprise française Sensio. A ses origines se trouve
le framework Mojavi et, comme la plupart des frameworks de la nouvelle génération, Symfony
s'inspire très largement de certains concepts du Ruby On Rails.
Symfony a été créé à partir d'un constat bien simple : il n'existait pas, auparavant, de solution
PHP suffisamment vaste et bien réalisée pour assurer la pérennité et la réutilisabilité du code.
Même PEAR, effort lancé en 2001, ne parvient pas à fournir une réponse satisfaisante aux
problématiques récurrentes des projets PHP : sécurité, respect d'un modèle (MVC, par
exemple), nommage, portabilité, etc.
Points forts du framework
Même si cela conduit parfois à qualifier Symfony de “mastodonte”, il est forcé de
reconnaître que Symfony est, de tous les frameworks, celui qui propose le plus de
fonctionnalités.
L'extensibilité du framework est assurée par le biais des plugins, qui permettent de profiter très
rapidement de nouvelles fonctionnalités développées par d'autres contributeurs.
Fait remarquable, Symfony dispose sans doute d'une des meilleures documentations :
 l'API est quasiment intégralement documentée
 “The definitive Guide to Symfony”, un livre qui explique, pas à pas, l'emploi de Symfony.
C'est ce livre qui, depuis, sert de documentation officielle à Symfony via sa mise à
disposition gratuite sur le site officiel du framework
 un tutoriel appelé Jobeet est mis régulièrement à jour et permet, en 24 étapes d’environ
une heure, d'apprendre à utiliser le framework de A à Z.
Un des derniers gros avantages de Symfony en tant que framework de développement est qu'il
est sans doute l’un de ceux qui assure le mieux son rôle de framework, cadre de
développement.
En effet le formalisme de développement et les conventions de codage sont bien définis, de
sorte que chaque partie du code d'un projet trouve une place logique dans l'arborescence.
Points faibles du framework
Différentes
études
font
état
d'une
relative
lenteur
de
Symfony.
Tout d'abord, l’utilisation d’un tel outil implique l’ambition de réaliser un programme évolué,
nécessitant un moteur souvent lourd.
Cependant, la version 2.0 de Symfony est actuellement en fin de développement et sera
bientôt présentée au public. Ainsi d’après les premiers tests, cette nouvelle version semblera
nettement améliorer les performances.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Organisation des fichiers
Un projet Symfony propose une structure hiérarchique d'organisation du code, sous forme
d'applications elles-mêmes divisées en différents modules.
Symfony emploie la syntaxe YAML pour ses fichiers de configuration. Cette syntaxe, même si
elle ne répond pas au formalisme de XML, elle a cependant l'avantage de la simplicité :
dev:
.settings:
web_debug:
cache:
no_script_name:
etag:
true
false
false
false
Processus d'internationalisation
Symfony est sans doute le premier framework à proposer une internationalisation (i18n), reprise
du framework Prado, et une localisation (l10n) intégrale, à base de fichiers XLIFF. C’est
un langage de balisage créé pour standardiser les échanges liés à la régionalisation.
Cette partie est assez simple à mettre en œuvre et la gestion des « cultures » de l’utilisateur est
très performantes.
En effet, on distingue comme dit précédemment des fichiers pour chaque culture pour
l’ensemble des formulaires, il suffit alors de créer pour chacune les traductions appropriées pour
que symfony puisse lier le fichier de langue à la culture correspondante.
Cependant, il reste du contenu qui n’est pas géré par Symfony, le texte du site. Effectivement,
Symfony gère la culture des titres et menus mais nous devons néanmoins garantir « à la main »
l’internationalisation de l’ensemble des textes du site. Comme souvent nous devrons gérer une
base de données contenant toutes les traductions sur plusieurs colonnes avec un texte par
ligne et sélectionner le bon élément en fonction du texte demandé et de la culture actuelle.
La culture est stockée en cession. C’est à dire qu’à la connexion le site tente de reconnaître la
culture « préférée » de l’utilisateur (si des cookies ont déjà été créés) sinon il définit une culture
par défaut. L’utilisateur a bien sur l’opportunité de redéfinir la culture souhaitée sur le site
(icônes drapeaux).
Processus de contribution au framework
Le projet Symfony s'appuie sur un atelier de développement composé de Trac (Trac Open
Source Project) et de Subversion ( logiciel permettant le téléchargement et la gestion de
différentes versions de programmes), et dispose d'une communauté vraiment vivante.
Après obtention d'un compte d'accès au Trac, chaque utilisateur du framework est libre de
créer un ticket, de proposer un patch. Le wiki de Symfony est le lieu approprié pour discuter
des évolutions majeures à apporter au framework.
Les plugins, déjà très nombreux, peuvent être contribués par le biais d'une procédure plus
simple : il suffit simplement d'attacher le plugin en pièce jointe à une page du wiki pour que
celui-ci soit disponible à l'installation par le biais de l'outil en ligne de commande, pour tous les
utilisateurs du framework.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Outre le forum officiel, très actif, des listes de diffusion locales développeur et utilisateur, sont
disponibles. La liste de diffusion symfony-fr, par exemple, permet des discussions en français au
sujet du framework.
Gestion des extensions
Un plugin Symfony ajoute des fonctionnalités à la
Ces fonctionnalités peuvent être de différentes sortes :
 modification du comportement par défaut de l'ORM
 gestion des droits utilisateurs, librairies Javascript, etc.
base
fonctionnelle
initiale.
L'installation d'un plugin Symfony est largement simplifiée par l'emploi de l'interface en ligne
de commande :
$ ./symfony plugin-install
Structurellement, un plugin Symfony se présente sous la forme d'un dossier placé dans le dossier
« plugins/ », à la racine du projet.
Actuellement, Symfony propose plus de 975 plugins, qui vont de la simple inclusion de librairies
externes (Swift, jQuery, etc.) à l'utilisation d’application complète (CMS, forum, blog, etc.).
Implémentation de référence
Une implémentation de référence de Symfony a été réalisée peu après le lancement
de Symfony, en Décembre 2005 : il s'agit d'Askeet, un site de question – réponse :
Remise à jour de manière irrégulière, cette implémentation ne reflète plus toute la qualité et la
richesse de Symfony.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Cependant, le tutoriel Jobeet possède des maintenances plus fréquentes et permet de bien
intégrer les grands concepts architecturaux du framework.
De plus, Symfony met à disposition un certain nombre de screencasts ou d'exemples
de fonctionnement d'applications, permettant une prise en main pas à pas du framework
à travers des cas divers et variés.
ORM, Doctrine
Un ORM (Object-Relational Mapping) est une technique permettant de lier un objet à une
base de données relationnelle.
A titre d'exemple, en PHP 5 (Orienté Objet), nous aurons un Objet Utilisateur qui sera
directement lié à une table Utilisateur.
Ainsi l'objet est directement lié et permet de mettre en place des méthodes qui vous
simplifieront la vie pour créer, modifier, récupérer et supprimer des informations.
Ce concept existe dans beaucoup de langages, et en PHP5, il existe notamment 2 frameworks
d'ORM qui sont:
Ce sont ces deux Frameworks qui sont proposés dans Symfony et on ne peut en utiliser qu'un
seul par projet web, il faut donc choisir l'un des deux.
Or il se trouve que des développeurs de Doctrine font désormais partie de celle de Synformy,
l’utilisation de Doctrine est ainsi de plus en plus conseillée.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
B. Communication des technologies
Afin d’établir une communication entre les technologies du client vers le serveur et
inversement, nous devrons développer le protocole suivant :
a. Du client vers le serveur
A chaque interaction du joueur avec le monde semi-persistant via l’interface utilisateur, le
client Javascript prend en compte les modifications voulues pour créer une requête HTTP grâce
à un service Ajax pour contacter le serveur.
Le serveur reçoit alors la requête, vérifie et effectue le traitement souhaité sur la base de
données qui définit le monde.
Enfin le client attend la réponse du serveur pour effectuer la modification ou non de l’interface.
b. Du serveur vers le client
A chaque demande du client, le serveur génère dans un flux correspondant aux objets
souhaités sous la forme de données Json ou XML.
Cette réponse est reçue par le service Ajax du client qui effectuera les modifications
appropriées sur l’interface.
C. Sécurité :
La connexion du joueur sera en SSL, et nous nous appuierons sur un cookie de session géré par
Symfony.
La triche sera détectée par un système de validation d'actions côté serveur. Toute action
invalide (qui peut être causée par une latence réseau, une désynchronisation du client ou une
tentative de piratage) sera consignée. Les joueurs qui cumulent de telles erreurs seront suivis à
la trace par des modérateurs (probablement élus parmi la communauté). De manière
générale, des modérateurs seront en charge de contrôler le bon déroulement du jeu.
La sécurité au niveau du serveur lui-même sera assurée par une bonne administration système
et un backup régulier des données.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
A. Zoning :
Le zoning permet de découper la page en autant de zones que nécessaire. Cela permet de
positionner les zones de navigation, les contenus, le logo, le pied de page, etc.
Il faut commencer par définir les zones générales puis ajouter les zones de plus en plus précises.
On obtient donc au final un schéma de la structure de la future interface.









Ressources : permet d’afficher l’état des ressources actuelles
Chat : permet de discuter avec les joueurs alliés
Actions contextuelles : permet en fonction des unités sélectionnées de proposer des
actions spécifiques à ce type d’unité
Informations du joueur : affiche le pseudo, l’avatar et le niveau du joueur
Menu : permet de naviguer dans le site
Unités sélectionnées : affiche l’ensemble des unités présentent sur la case cliquée
Informations sur l’élément sélectionné : affiche le descriptif de l’élément cliqué
Aperçu général de la carte : mini carte donnant une vision globale du monde
Calques applicables : permet de définir les options d’affichage de l’aperçu général de
la carte (afficher les unités amies, les ressources, etc)
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Nous avons à notre disposition plusieurs outils afin de garantir la communication au sein du
groupe et avec nos tuteurs/clients.
Nous disposons tout d’abord d’une liste de mailing regroupant l’ensemble des personnes
associées au projet. De cette façon nous pouvons transférer une information et/ou des fichiers
rapidement à l’ensemble de nos collègues.
Conformément au souhait des directeurs de projets, nous avons réalisé un site Internet
spécifique au projet : http://projets-gmi.iup.univ-avignon.fr/projets/proj1011/M1/p03/
Ce site est hébergé sous Wordpress, ce qui permet de définir des accès sécurisés aux différents
rédacteurs de l’équipe et de pouvoir modifier le contenu du site de manière rapide et sans
accès au code source des pages.
Bien sur, en vue d’être archivé en fin de projet, nous nous sommes préalablement informer sur
la possibilité d’exporter une version statique HTML du site afin de la rendre accessible sur le
serveur de l’IUT. Nous utilisons alors PageNest, un aspirateur de site très simple qui remplit
parfaitement cette tâche.
Le site du projet permet avant de présenter le projet, son contexte et l’équipe qui y travaille. Il
permet aussi de s’informer de l’avancement du projet via un système de news et la mise en
ligne des comptes rendus de réunions.
Enfin, nos tuteurs ont mis en place un Wiki : ajax.univ-avignon.fr/doku. Celui ci leurs permet de
partager des conseils et principes techniques qui nous seront nécessaire pour le bon
déroulement de notre projet.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Nous nous efforçons d’effectuer au moins une rencontre toutes les deux semaines.
Durant les réunions nous commençons alors par présenter l’avancement, les initiatives et les
difficultés du travail réalisé depuis la rencontre précédente.
Une fois cette présentation faite, nous sommes très attentifs aux différents retours. En effet, nos
interlocuteurs nous font part de leurs appréciations en tant que clients dans le projet mais aussi
en tant que tuteurs de l’équipe.
Enfin suivant le memento expliquant le déroulement du projet, nous terminons ces réunions par
la rédaction de comptes rendus reprenant les points importants, les remarques, les
modifications à apporter, le travail validé et un rappel du travail à venir.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
A. Tâches concernant les fonctionnalités coté client :
Tâches à réaliser
Interface graphique (UI, widgets, intégration)
Root, Button, StateButton, Toolbar, Window,
Progress, Slider, Grid
Protocole de communication (teneur des
messages envoyés)
Interactions joueurs (déplacements, échanges,
...)
Interactions environnement (construction, récolte,
pose de bombes, ...)
Répartition du travail
26 %
30 %
5%
24 %
15 %
B. Tâches concernant les fonctionnalités coté serveur :
Tâches à réaliser
Répartition du travail
Frontend pour gestion des comptes
15 %
Backend complet pour la gestion des comptes
16 %
Algorithme de création de sprites
21 %
Protocole de communication (teneur des
messages envoyés)
5 %
Mise à jour nocturne "générique"
13 %
Implémentation de la logique de jeu en utilisant
la structure et les outils existants
20 %
Templates des pages annexes
10 %
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Séparant le début de la seconde phase du projet, la semaine du 18 Janvier 2011, et la fin, la
semaine du 20 Mai, nous possédons 14 semaines soit 70 jours et donc environ 140 heures de
travail sur une base de 2h par jour pour une personne.
La répartition des ressources est simple car le projet se décompose en deux parties majeures, le
client Javascript et le serveur PHP. Rémy Leuneunier et Jade Tavernier sont en charge du
Javascript et Romain Poli s’occupera des tâches liées au Php.
De plus nous avons le plaisir d’accueillir un nouveau collègue Erasmus, Martin Repka, qui
travaillera en collaboration avec Romain Poli.
Nous travaillerons donc lors d’une première période comme deux groupes distincts jusqu’à la
définition d’un protocole de communication entre le client et le serveur.
Par la suite, nous effectuerons un travail intimement lié qui nécessitera un respect stricte des
dates.
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Projet n°3 M1 IngéLog 2010/2011 – Cahier des charges
Cette première partie du projet nous a permis de mettre en pratique les enseignements et
compétences de chacun à travers un exercice demandant :
 Une compréhension de l’existant
 Un travail de modélisation complexe
 L’adaptation à des technologies nouvelles imposées
 La mise en place de solutions techniques avancées :
 Un travail d’équipe nécessitant une grande rigueur de travail, un respect des dates et un
bon dialogue au sein du groupe.
De plus, étant donné que nos clients soient nos tuteurs favorise grandement le dialogue et la
disponibilité de nos entretiens, cela nous permet alors d’exprimer notre opinion plus librement
et encourage nos initiatives.
En somme ce travail de compréhension et de conception est une bonne approche du travail
professionnel pour la réalisation d’une application importante orientée web.

Documents pareils

Symfony et Dailymotion : une migration réussie

Symfony et Dailymotion : une migration réussie •  Une base de code saine, documentée et cohérente •  Cadrer les développeurs en leur imposant certaines bonnes pratiques •  S’équiper de meilleurs outils (tests unitaires) •  Profiter de l’aide d’...

Plus en détail