Machines à états dans un environnement de jeu
J'essaye actuellement de réaliser une petite machine à états pour un jeu et je me heurte à quelques problèmes de conception
Basiquement, ma boucle de jeu se présente ainsi :
- réception des inputs (clavier, souris) et transmission par message-passing à la logique de jeu
- update de la logique de jeu (déplacements des objets, collisions, IA...) à chaque frame
- rendu
L'ensemble des objets est regroupé dans un objet Scène, contenu dans la logique de jeu
Par ailleurs, la logique de jeu peut se trouver dans différents états, que ce soit l'initialisation, le chargement, le menu principal, la scène, menu pause, etc... La navigation entre les différents menus implique des changements d'état
La modélisation de ces états et leurs transitions m'a conduit au design pattern State et par extension, aux FSM
Le problème, c'est que dans les FSM un état ne contient pas de données (seulement un comportement) et ne présente que deux méthodes, onEntry et onExit, executées à chaque transition
Or j'ai besoin d'appliquer deux actions sur la logique de jeu :
- update à intervalles réguliers, même s'il n'y a pas d'input utilisateurs
- traitement des inputs utilisateurs à intervalles irréguliers
Les états sont alors le seul moyen de communiquer avec la Logique
Faut il leur ajouter deux méthodes représentant les actions ci-dessus ? Ou bien une seule méthode Handle(evt) avec en paramètre des évènements "update" ou "keyboard" ?
Il y a également le problème des données partagées, que sont la Scène et l'IA
Il faut bien que l'état puisse communiquer avec s'il veut leur transmettre les évènements; comment faire s'il ne contient aucune donnée ni référence ? Une possibilité serait de tricher avec unique pointeur sur un objet GameLogic
et de dispatcher le traitement en interne
Voilà les quelques pistes que j'ai pu élaborer
Sans doute certains d'entre vous ont été confrontés à ce genre de situation, mais dans d'autres contextes :)
Si vous avez de meilleures idées, n'hésitez pas :)
merci :)