:: Enseignements :: ESIPE :: E4INFO :: 2008-2009 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | GalaxIR |
Le but de ce projet est de réaliser un jeu proche du jeu
GalCon (pour Galactic Conquest). Le jeu se déroule dans une galaxie en proie à
la guerre planétaire et met en scène des vaisseaux en masse parcourant la carte à la
recherche de planètes à conquérir jusqu'à l'anéantissement de vos adversaires. C'est
un Risk en temps réel. Chaque planète fabrique un certain nombre d'unités par seconde. A
vous de les envahir pour dominer l'univers!
Bibliothèque graphique
Le projet est à réaliser avec la bibliothèque graphique
fr.umlv.remix. C'est cette bibliothèque qui doit être utilisée pour prendre en charge
toute la partie graphique.
Il n'est pas autorisé de gérer l'affichage graphique par un autre moyen.
Déroulement du jeu
La galaxie contient les éléments suivant:
- une planète d'origine par joueur;
- un ensemble de planètes neutres;
- des zones "libres" (i.e. l'espace).
Les acteurs du jeu sont des vaisseaux - de différents types et ayant des
caractéristiques fixées (e.g. vitesse, temps de production, puissance d'attaque)
- produits par les planètes contrôlées par un joueur.
Chaque joueur possède initialement une planète. Toutes les planètes - exceptées les neutres -
peuvent produire des vaisseaux. Le taux de production de chaque planète est fixé à la
création de cette dernière. Il peut être variable d'une planète à une autre et ne
dépend pas uniquement de la taille de cette dernière. A tout moment du jeu, seules les
planètes que vous contrôlez peuvent produire vos vaisseaux.
Le jeu consiste à déplacer vos vaisseaux de planète en planète. Pour ce
faire, il suffit de sélectionner une ou plusieurs planètes "sources" et une planète
de destination. Une fois l'ordre émis, une partie (en nombre contrôlable) des
vaisseaux décolle de vos planètes "sources" pour aller sur la planète de
destination. Pendant que vos vaisseaux se déplacent à l'écran, vos planètes
continuent de produire de nouveaux vaisseaux.
Lorsqu'un vaisseau atteint une planète,
- soit elle est à vous et c'est juste un mouvement de troupes (sa réserve de
vaisseaux est alors incrémentée de 1);
- soit elle n'est pas à vous et c'est une attaque (sa réserve de vaisseaux est
alors décrémentée de 1 ou de la puissance d'attaque du-dit vaisseau);
- si la planète est neutre ou contrôlée par votre adversaire et sa réserve est
nulle (lors de l'attaque), la planète est conquise et devient vôtre. Elle se met à
produire des vaisseaux du même type que celui qui en a permis la conquête.
Tout joueur ne contrôlant plus de planète perd la partie (règle valable
pour tout nombre de joueurs). Le jeu s'interrompt lorsqu'il n'y a plus qu'un seul
joueur.
Contraintes du jeu à respecter
Toutes les planètes peuvent produire et envoyer des vaisseaux à
l'exception des planètes neutres qui jusqu'à leur conquête ne peuvent qu'utiliser leur réserve de
vaisseaux à titre défensif. A un instant donné, toute planète ne peut produire
qu'un seul type de vaisseaux.
L'envoi de vaisseaux doit être fait par diffusion (pas de gros paquet) en
profitant au mieux du périmètre couvert par la planète émettrice. Par conséquent, le
décollage d'un grand nombre de vaisseaux sur une petite planète peut nécessiter
plusieurs vagues de décollages. Les vaisseaux envoyés par un unique ordre compose un
escadron. Il doit être possible de diriger tout un escadron (ou ce
qu'il en reste).
Lors des déplacements, les collisions entre les vaisseaux ne doivent pas
être gérées (i.e. il peut y avoir plus d'un vaisseau à une même position). D'autre part, un vaisseau devant atteindre
une planète donnée ne devra ni survoler, ni rentrer en collision avec une autre
planète. Pour ce faire, vous devrez mettre en place un algorithme de déplacement
permettant le contournement des planètes non visées.
Mode d'interactions sur le jeu
Il vous est demandé de mettre en place une interaction à la souris avec le jeu
qui peut s'accompagner de l'utilisation simultanée des touches gérées par la bibliothèque
graphique (à savoir; CTRL, SHIFT, ALT-GR). Vous avez également la possibilité d'interagir avec le jeu par l'utilisation
du clavier; cette utilisation est limitée comme indiqué dans la javadoc de la bibliothèque graphique.
Fonctionnalités
Ce qu'on attend au moins de vous
Il vous est demandé de fournir une implémentation fournissant au moins les
fonctionnalités suivantes:
- contrôle du jeu à la souris+clavier
- le déplacement de troupes de planète en planète -- en mode attaque et
défense (i.e. mouvement de troupes)
- contrôle de la quantité de troupes envoyées par escadron
- possibilité de changer l'objectif d'un escadron (ou de ce qu'il en reste) en
cours de vol
- proposer la production et l'exploitation de plusieurs types de vaisseaux à
caractéristiques différentes (e.g. vitesse, temps de production, puissance
d'attaque). Si vous donnez la possibilité de changer le type de production d'une
planète; vous devrez assurer qu'à tout moment la planète en question ne contient
pas dans sa réserve plusieurs types de vaisseaux (e.g. en détruisant sa réserve au
préalable, ou en expulsant les vaisseaux du type actuel, ou ...).
- fournir une Intelligence Artificielle permettant de jouer contre
l'ordinateur ou de faire jouer l'ordinateur contre lui-même. Il n'est pas demandé
de pouvoir gérer plus d'un joueur "humain" mais votre implémentation ne doit pas l'empêcher.
- contrôler les déplacements de vaisseaux pour garantir qu'un vaisseau d'un
type donné ne puisse atterrir sans exploser que sur une planète produisant ce type
de vaisseaux.
- l'action
MouseWheel couplée à la touche
CTRL provoque la selection de l'ensemble des bataillons dans un rayon
proportionnel au déplacement de la molette (vous penserez à fixer un rayon min et
max); le centre de cette sélection étant la position de la planète sur laquelle on effectue
l'action de molette.
- il n'y a aucune contrainte sur le graphisme de votre application. Elle peut
contenir uniquement des formes géométriques, uniquement des images ou les deux.
Il n'y aura pas de bonus pour l'utilisation d'images plutôt que des formes 2D
simples.
- le chargement facilité de parties de jeux prédéfinies (e.g. à l'aide de fichiers de configuration XML)
Pour aller plus loin
Vous pouvez apporter d'autres fonctionnalités rendant votre jeu un peu
plus intéressant. Ces ajouts ne seraient compenser des manques dans les
fonctionnalités attendues et sont, par conséquent, des bonus non compensatoires du
minimum attendu.
Quelques idées en vrac à s'approprier: plus de 2 joueurs (mais un seul humain), des vaisseaux pirates (sans
propriétaire et frappant au hasard), des planètes malades (dont la production
n'est pas constante), des vaisseaux annihilateur (détruisant une planète - en modifiant sa forme, sa taille - plutôt
que de la conquérir), ...
Conditions de rendu
Le projet est à rendre par mail aux chargés de TD et à l'enseignant de cours,
pour la date fixée par l'agenda des projets. Le format de rendu est une archive au format
zip (tout rar, tar.gz, 7z et autre ne sera pas ouvert) contenant:
- un répertoire src contenant les sources du projet et les
éventuelles ressources (images, sons, etc.) à recopier à
côté des classes;
- un répertoire docs contenant le manuel de l'utilisateur
(user.pdf) et le manuel qui explique votre architecture
(dev.pdf) au format PDF;
- un répertoire classes vide dans l'archive et qui contiendra les classes une fois compilées
- un jar exécutable GalaxIR.jar qui fonctionne avec java
-jar GalaxIR.jar et donc qui possède un fichier manifest adequat;
- un build.xml qui permet de
- compiler les sources (target compile)
- créer le jar exécutable (target jar)
- générer la javadoc dans docs/doc (target
javadoc)
- nettoyer le projet pour qu'il ne reste plus que les éléments
demandés (target clean)
- un répertoire lib contenant les éventuelles bibliothèques dont a
besoin votre projet pour fonctionner.
Cette archive zip aura comme nom
Nom1Nom2_GalaxIR.zip,
où les noms sont ceux des membres du binôme par ordre alphabétique.
L'extraction de cette archive devra créer un répertoire
de nom
Nom1Nom2_GalaxIR pour contenir tous les éléments demandés ci-dessus.
Elle sera envoyée par mail aux
enseignants de la matière,
avec dans le corps du message les noms et prénoms de chacun des membres du binôme.
Notation
- Cas de 0 sans aucune correction:
- projet non effectué en binôme (i.e. 2 personnes !) sans l'accord préalable de l'intervenant de TD
- projet envoyé après la date
- projet non envoyé à TOUS les chargés de TDs et le chargé de cours (AUX BONNES ADRESSES !)
- mail ne contenant pas les noms et prénoms de chacun des membres du binôme
- reception d'une archive qui n'a pas comme nom Nom1Nom2_GalaxIR.zip,
où les noms sont ceux des membres du binôme par ordre alphabétique
- fichier d'archives dont l'extraction ne produit pas un répertoire dont le nom est Nom1Nom2_GalaxIR
- fichier d'archive foireux (vérifiez le et mettez vous en copie du mail)
- l'absence de Java Doc
- Base de la notation:
- la notation ne dépendra pas que de l'aspect visuel du projet
- la propreté et la lisibilité du code auront un poids très important dans la note
- l'architecture que vous aurez définie (interfaces, classes abstraites, concretes ...) devra être donnée dans les documents
PDF et aura également un poids très important dans la note
- la réutilisabilité et donc la factorisation de votre code (e.g. peut-on facilement créer des planètes carrées, triangulaires, ... sans tout refaire
dans votre code)
- la présence de code inutile
- les différents rapports et, par conséquent, l'orthographe !
- la soutenance (dirigée entièrement par vous!)
Quelques captures d'écran du jeu GalCon
FAQ
-
"Le projet est à réaliser avec la bibliothèque graphique fr.umlv.remix"
: C'est cette bibliothèque qui doit être utilisée pour prendre en charge
toute la partie graphique ?
Oui
-
"Pour tracer des rectangles dans l'exemple vous avez utilisé la méthode
drawLine puis fillRect, si nous souhaitons tracer des cercles,
pouvons-nous utiliser le package Ellipse2D puis le tracer directement ?
Plus généralement pouvons-nous utiliser tous les outils de Java pour les
formes géométriques en n'ayant pas le droit de passer par tous les
packages pour l'interface graphique (ce qui concerne les Components,
JPanel ...)"
En fait, dans l'exemple c'est un rectangle et une diagonale. Le rectangle n'est produit
que par l'instruction fillRect. Pour une ellipse, il y a la méthode fillOval. Je ne
vois pas donc l'intérêt de Ellipse2D.
D'après la bibliothèque graphique
que vous nous avons fournie, la seule restriction est de définir pour votre élément affichable
un ItemManager redéfinissant la méthode public void draw(Graphics2D g, TestItem item) qui d'après
la javadoc doit "Renders the item as a graphical element in the Graphics2D graphics" et dont les
paramètres sont "graphics - the graphical container of the rendering of item ; and item - the I to graphically render".
-
"Contrôler les déplacements de vaisseaux pour garantir qu'un vaisseau
d'un type donné ne puisse atterrir sans exploser que sur une planète produisant
ce type de vaisseaux." : Si un vaisseau de J1 va vers une planete de J1 qui produit un
autre type de vaisseaux, celui-ci est tout simplement détruit et cela n'affecte
en rien la planète sur laquelle a eu lieu l'explosion ? Ou alors cela détruit-il
une unité de l'autre type de vaisseau ?
Cela détruit autant d'unités que si cela avait été une planète ennemie.
-
"Est-il possible d'utiliser l'algorithme "Astar" pour gérer les déplacements et l'évitement des obstacles lors de mouvements
de vaisseaux ?"
Si vous voulez mais, a priori, ce n'est pas forcément adapté à ce projet étant donné qu'il n'y a pas de grille.
Il vous faudra donc discrétiser l'espace de jeu pour mettre en oeuvre A* ... Il y a plus simple -- indice 1 : le plus court chemin entre
deux points est la ligne droite ; indice 2 : le fameux proverbe chinois "Si obstacle il y a ; toi le contourner".
-
"Est t-il permis d'utiliser une petite partie en Swing (pour réaliser un
petit menu d'accueil; etc.) sachant que "ReMix" nous permet d'exécuter du code
de ce type :
final JSplitPane pane = new
JSplitPane(JSplitPane.VERTICAL_SPLIT,myComponentArena,
myComponentPanel); où
myComponentArena est l'arena où se déroule le jeu et
myComponentPanel est un panel de test."
N'oubliez pas qu'il ne faut pas trop perdre de temps sur des choses futiles
qui ne vous rapporterons pas de points. Il vaut mieux passer plus de temps sur la
conception et la reflexion sur l'architecture ... Mais, si toutefois cela vous
semble indispensable (plutôt qu'un menu en ligne de commande par exemple),
perdez tout le temps que vous voulez.
-
"Comment peut-on récupérer la position de l'évènement mouseWheel?"
La bibliothèque graphique ne renvoit jamais directement la position de la souris. Elle
renvoit uniquement l'ensemble des éléments graphiques de l'arène étant à cette position. Par conséquent,
la seule façon de gérer l'action mouseWheel+CTRL pour la sélection de bataillons et de
gérer cette dernière à partir de planète.
-
"Quels sont les différences entre les méthodes run et timer de la classe fr.umlv.remix.Application ? "
La méthode run est utilisée pour mettre en place le jeu. La méthode timer (qui peut être appelée plus d'une fois) permet,
quant-à elle, de définir une tâche périodique qui s'exécute tant qu'elle n'a pas été annulée (par l'appel de sa méthode cancel).
-
"Est-il possible d'implanter l'envoi contrôlé par le mouseWheel des vaisseaux d'une planete de façon indépendante
des autres planète ; Chaque planète possèderait ainsi son nombre de vaisseaux à envoyer lors d'une attaque. Cela permetterait d'augmenter la stratégie
d'attaque : on peut en effet décider que telle planète envoit à chaque fois 100% de
ses réserves, tandis que telle autre en envoit 30%."
Uniquement si vous donnez la possibilité de choisir quel mode de jeu on veut :
contrôle global et/ou contrôle par planète.
-
"L'implémentation AffineTransform semble être gourmande en ressources, est-elle conseillée pour l'orientation des vaisseaux?"
Si c'est lent, c'est à cause de la carte graphique. Certaine carte ne marche pas bien si les images sont petites ou n'ont
pas de taille (width et heigth) multiple de 2. Il vous est conseillé d'utiliser du vectoriel plutôt que des images pour les
vaisseaux. Sinon les rotates sur un Graphics change l'AffineTransform courante.
-
"Avec la bibliothèque, il semble possible de récupérer la position de la souris où qu'elle soit dans la frame. Doit-on
généraliser le CTRL + mouseWheel à n'importe quel objet ou bien se limiter à la sélection depuis les planètes ?"
Il faut prendre en compte le sujet dans sa version actuelle. Si tu as trouvé un moyen qui te semble propre d'étendre la fonctionnalité à
d'autre éléments que les Planètes, c'est une extension ... Moralité, il faut respecter le sujet et si tu le veux implémenter une extension
(si la solution est propre ! ).
Binômes
- P.Antoine Vandenberghe -- Martin Le Bas
- Clément Lecigne -- Rémy Masson
- Clément Lebreton -- Jordane Marcel
- Yoann Prot -- Vincent Tisseront
- Aurélien Dumolin -- Thibault Palud
- Tran Frédéric -- Tran Khai-Wen
- Demany Vincent -- Grauffel Cyril -- Colotte Guillaume
- Olory Marc -- Mahendran Aravindan
- Thiesson Damien -- Duriez Hélène
- Andrianarimanga Michaël -- N'Guyen Christophe
- Allgeyer Patrick -- Arnold Florian
- Jannin Francois -- Olivier Aurélien
- Antoine Charpentier -- Arnaud Delalande
- Michon Etienne -- Magnin Marc
© Université de Marne-la-Vallée