Structure du programme
1 . L'organisation en packages et le systeme MVC (modele, vue, controleur) :
On a divisé le programme en trois parties principales :Le modele :
C'est le jeu lui meme, il se dessine dans un Canvas et toutes ses classes se trouvent dans le package
JSkweek.ConsoleDeJeu.
La vue :
C'est l'interface du jeu, elle ne connait rien du jeu, elle ne fait qu'afficher une fenetre avec une interface,
et le Canvas qu'on lui a passe en argument (donc a priori on devrait pouvoir faire un autre jeu pratiquement sans
toucher à notre interface).Les classes de l'interface se trouvent dans le package JSkweek.Interface.
Le contrôleur :
C'est lui qui gere les interactions entre l'interface et le jeu, c'est le seul qui connaisse a la fois l'interface et le jeu.
La classe du contrôleur se trouvent dans le package JSkweek c'est JSkweek.Go.
2 . Les observers et les observables :
Ils servent au jeu et à l'interace pour communiquer entre eux sans se connaître. C'est le contrôleur qui les lie entre eux.3 . Le fichier de configuration, les tableaux et les images :
Ils sont tous consideres comme des classes par le programme. Ils se trouvent respectivement dans JSkweek.ConsoleDeJeu.configuration, JSkweek.levels et JSkweek.images.4 . L'utilsation de l'héritage :
Tous les sprites affichés à l'écran hérite d'une unique classe (abstraite) : la classe sprite.class. Ensuite, ils se répartissent en 3 groupes : les dalles, les balles et les personnages animés (classe abstraite). Puis la classe personnage animé se décompose en 2 classes : les skweeks (les joueurs) et les monstres.5. Le double buffering :
Pour ne pas avoir de clignotement on utilise le double buffering (remarque : sans oublier de surcharger la classe update cf. la classe JSkweek.ConsoleDeJeu.Console). On utilise egalement un 3ème buffer qui contiendra l'image en fond d'ecran (en fait les dalles) par dessus laquelle viendront se dessiner les skweeks, les monstres et les balles (voir paragraphe 8).6 . Les threads :
Nous avons fait en sorte que tous les sprites qui apparaissent à l'écran évoluent indépendamment du programme, se sont des threads. Quand ils veulent avancer, et quand ils avancent, ils font appels à des méthodes de la classe console qui appellent à leur tour les méthodes des threads avec lesquels ils intéragissent (cf paragraphe 8).7 . L'utilisation d'une table de hash (hashtable) :
Pour ne charger qu'une seule fois en mémoire les images du jeu, on met chacune d'elle dans une table de hash la première fois qu'on en a besoin (classe JSkweek.ConsoleDeJeu.Sprite). Ainsi, quand on a besoin d'une image déjà chargée on la recupère directement dans la table de hash.8 . Un bref exemple de ce qu'il se passe quand le jeu se déroule :
L'initialisation :
Le jeu demarre par la fonction main de la classe JSkweek.Go.
Cette classe fabrique une Console (qui va gerer le jeu) et une Interface.
La console fabrique à son tour un tableau (et ses monstres à partir du nom de fichier qu'on lui passe en paramètre)
et des skweeks à partir du fichier configuration. Ensuite le jeu peut commencer.
L'affichage :
C'est le thread de Console qui va gerer l'affichage du jeu :
Il demande au tableau en cours de se dessiner dans le double buffer :
Lors de son initialisation, le tableau en cours avait demandé à toutes ses dalles de se dessiner dans un buffer (bufferTab).
Il n'a plus alors qu'à afficher bufferTab dans le double buffer.
Il demande ensuite à tous les skweeks (qui s'occuperont eux-même de l'affichage de leurs balles) et à tous les monstres de s'afficher, par dessus, dans le double buffer.
Une dalle n'a, a priori, pas de thread lui correspondant, sauf lorsqu'on la peint : elles fait alors naître un thread qui s'occupera de modifier son apparence dans bufferTab.
Les interactions :
Tout le reste est geré de manière indépendante par chacun des threads (monstres, skweek, balles, dalle).
Par exemple, que se passe-t-il lorsqu'un skweek désire avancer alors qu'il est face à un mur ?
Il fait appel à la méthode interactionSkweekObstacle de Console qui lui dit si il peut avancer.
Pour ce faire interactionSkweekObstacle va interroger les autres skweeks pour savoir si ils gènent la progression de notre skweek,
ensuite elle interrogera le tableau courant qui interrogera les dalles suceptibles de gener le skweek. Et dans notre exemple, une de ces
dalles répondra qu'il n'est pas possible d'avancer. Donc le skweek n'avancera pas dans cette direction...