Le package labpyproject.apps est destiné aux applications « réelles ». Il n’en contient qu’une seule initialement, le jeu labpyproject.apps.labpyrinthe.

labpyproject
├── labpyproject.apps
│   └── labpyproject.apps.labpyrinthe
│       ├──     labpyproject.apps.labpyrinthe.app
│       ├──     labpyproject.apps.labpyrinthe.bus
│       ├──     labpyproject.apps.labpyrinthe.gui
│       ├──     clientConsole
│       ├──     clientPygame
│       ├──     serverConsole
│       ├──     standaloneConsole
│       ├──     standalonePygame
│       └──     standaloneTkinter
└── labpyproject.core

Ce pakage contient:

  • un package applicatif app dédié à l’initialisation de l’application et à son fonctionnement global (communication inter-threads) ,
  • un package métier bus prenant en charge la gestion du jeu,
  • un package graphique gui dédié aux différentes interfaces,
  • six scripts permettant de lancer différentes versions du jeu (standalone, client, serveur) dans un ou plusieurs formats (console, pygame, tkinter).

Remarque:

Les aspects réseau sont traités via le package générique labpyproject.core.net.

3.1- A propos du package applicatif (app)

Ce package définit le gestionnaire global de l’application (classe AppManager du module application). Celui-ci assure un rôle d’initialisation puis de communication entre les composants de l’application.

3.2- A propos du package métier (bus)

Ce package définit le composant métier de l’application (classe GameManager du module game_manager). Ce composant gère les différentes phases du jeu (voir le plan du code source du composant métier)

Remarques à propos des problématiques de synchronisation

  • Synchronisation du composant métier et de l’interface

Certains affichages pouvant demander une durée indéterminée (publication initiale d’une carte, animation avec n pas d’explosions), un système d’affichages suivis permet au GameManager de lancer un ordre d’affichage associé à un id et un callback. Lorsque l’interface a achevé le processus d’affichage elle confirme le traitement de l’id associé, le GameManager appelant alors le callback enregistré.

  • Synchronisation clients / serveur

En mode réseau, le GameManager du serveur prend en charge toutes les actions de jeu. Il envoie à tous les clients des ordres de mise à jour (nouveaux bonus, nouvelles mines, bots éliminés ou joueurs déconnectés) et les commandes à appliquer. Le serveur ne pouvant savoir à priori quelles durées ces traitements prendront côté clients, il attend une confirmation de chacun d’eux avant de passer au coup suivant. Plutôt que de renvoyer systématiquement l’intégralité des données du labyrinthe, le serveur n’envoie que les dernières données modifiées. Pour s’assurer de la synchronisation des clients, il procède par comparaison de clefs reflétant ces modifications. Si un client ne renvoie pas la bonne clef, il est intégralement resynchronisé (rechargement complet des données du labyrinthe).

Le package contient également trois sous packages (commands, helpers et model) découpés en plusieurs modules.

Parmi ceux-ci :

3.3- A propos du package graphique (gui)

Le package gui est structuré selon une publication « multi formats »:

  • Le sous package skinBase est une collection de modules génériques portant la logique applicative des interfaces
  • Les sous packages skinConsole, skinPygame et skinTkinter dérivent les éléments de skinBase dans leur format respectif
  • Les trois modules GUIConsole, GUIPygame et GUITk proposent le composant d’interface principal (au sens de GUIComp de pylabproject.core.app.app_components) associé à leur format (console, pygame ou tkinter)

Les ressources (images, polices) sont gérées dans des classes dédiées (SkinBase du module skinBase.skin_base et ses subclasses) optimisant leur gestion (mise en cache).

Le format le plus abouti est le format pygame dans lequel on utilise le moteur de publication développé dans labpyproject.core.pygame:

aperçu pygame

Aperçu de la maquette Tkinter :

aperçu tkinter

Aperçu du format console (injouable mais utile lors des développements):

aperçu console