La traduction de YASEP est actuellement en cours et temporairement consultable à : http://ygllo.com/~llo/index_fr.html
Architecture des jeux
J'ai finalement une vague idée de l'agencement logiciel des jeux et de la console.
Le langage :
J'aurai voulu les faire en C, pour qu'ils restent accessibles au plus grand nombre aux programmeurs les plus fous mais j'ai fini par changer d'avis devant l'étendu des problèmes liés à l'intégration du C dans la console.
Je vais donc programmer en assembleur YASEP (pour mon plus grand plaisir) mais que les programmeurs qui souhaiteraient un langage haut niveau se rassurent, ils pourront construire des jeux via un futur éditeur graphique... dont je parlerai plus tard.
Les jeux :
Tous les jeux seront organisés autour d'un programme : Majordome. Ce dévoué serviteur permettra de naviguer dans les menus, de paramétrer la console, les jeux, et même plus tard de naviguer dans un système de fichier.
Chaque jeu aura également son propre programme : Histoire, qui permettra ... de jouer. :p Les inputs génereront des actions OC(PID) en fonction des paramètres du jeu (préalablement sélectionnés via le majordome). Ces actions genéreront des points et des positions OC(PID).
OC(PI quoi ?)
Objet à Contrôle :
* ComPuter (IA)
* Direct (via les inputs)
* Indirect (via un ou plusieurs autres objets)
Les objets correspondent à tout les élements graphiques du jeu. Ils peuvent être déplacés, effacés, modifiés (et donc animés). Que ce soit par le joueur directement (quand il s'agit de son propre personnage/outil d'interaction avec le jeu). Indirectement, via un OCD (un joueur, par exemple la palette dans le jeu pong). Ou par l'IA elle même (adversaire, objet à détruire, ...). Ils peuvent même changer de classe aussi souvent que voulu dans le jeu, passant d'OCD à OCI voir à OCP... c'est libre.
Il y aura également une classe appellée "ensemble d'objets", à l'intérieur de laquelle il y aura une sous classe "widget". La classe "ensemble d'objets" permettra de manipuler plusieurs objets à la fois (cette classe permettra par exemple de traiter les blocs de tetris de façon beaucoup plus fluide). Quand à la classe "widget", elle permettra l'affichage en tout premier plan d'informations importantes, qu'elles soit en rapport avec le jeu (affichage du score, mini carte...) ou avec la console elle même (niveau des batteries, réception infrarouge, ...).
Une dernière classe appellée "déco" permettra quand à elle l'affichage en fond d'un décor (image ou simple couleur) hors de la portée du joueur. Cette décoration pourra être plus large que l'écran, permettant au joueur de circuler dans un univers changeant. Il pourra également y en avoir plusieurs, permettant de créer des univers de jeu variés, par exemple en fonction des niveaux.
Le programme Histoire :
Le programme Histoire (ré)génèrera les positions des objets, en fonction des inputs, des paramètres du majordome et du scénario. Il génèrera également des points, qu'il s'agisse du score, de l'avancement dans le jeu ou de toute autre donnée persistante après l'arrêt du jeu.
Les données du jeu :
* Le scénario,
* la bibliothèque des objets,
* la déco (du jeux et du majordome),
* l'arborescence du majordome spécifique au jeu (et tout ce qui en découle éventuellement)
... seront stockés très proprement dans une plage de la mémoire spécifique, réservée et protégée. Les élements utilisés seront copiés dans la RAM de GPL et c'est à partir de là qu'ils seront manipulés (modifiés, surécrits, ...).
* Les points seront eux stockés dans la RAM de façon particulière à cause de leur caractère persistant. À long terme ils pourraient être stockés dans une puce spéciale regroupant les données personnelles de chaque joueur.
... et mon travail s'arrête là.
Whygee récuperera au final trois types d'objets :
* les objets de la classe "déco", le décor du jeu (pas très éloigné du décor de théatre, toujours en arrière plan),
* les OC(PID) (leur position, leur classe, leur contenu graphique, leur plan, leur taille)
* les widgets (toujours en premier plan)
Il se chargera de les transformer en pixels. Il se chargera également de m'apporter les informations en provenance des inputs. Et la boucle sera bouclée ;)