EDIT: Pour clarifier quelle est exactement ma question: est-ce un bon moyen de gérer les animations / l'état d'animation dans un moteur de jeu avec un œil sur la création / gestion de contenu? Quels sont les défauts de le faire de cette façon et quelle serait une autre façon de le faire? - Bien que ma réponse ait été partiellement répondue dans les commentaires, car cela semble être la voie à suivre.
J'essaie de gérer des animations dans un projet de passe-temps de moteur de jeu 2D , sans les coder en dur. Les états d'animation codés en dur me semblent être un phénomène courant mais très étrange.
Un peu d'histoire: je travaille avec un système d'entités où les composants sont des sacs de données et les sous-systèmes agissent sur eux. J'ai choisi d'utiliser un système d'interrogation pour mettre à jour les états d'animation.
Avec les états d'animation, je veux dire: "walking_left", "running_left", "walking_right", "shooting", ...
Mon idée pour gérer les animations était de le concevoir comme un modèle piloté par les données . Les données pourraient être stockées dans un fichier xml, un rdbms, ... Et pourraient être chargées au début d'un jeu / niveau / ... De cette façon, vous pouvez facilement éditer des animations et des transitions sans avoir à aller changer le code partout dans votre Jeu.
À titre d'exemple, j'ai fait un brouillon xml des définitions de données que j'avais en tête.
Une donnée très importante serait simplement la description d'une animation . Une animation aurait un identifiant unique (un nom descriptif). Il contiendrait un identifiant de référence à une image (la feuille de sprites qu'il utilise, car différentes animations peuvent utiliser différentes feuilles de sprites). Les images par seconde pour exécuter l'animation. Le "replay" définit ici si une animation doit être exécutée une fois ou à l'infini. Ensuite, j'ai défini une liste de rectangles comme cadres.
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
Les données d'animation seraient chargées et conservées dans un pool de ressources d'animation et référencées par les entités de jeu qui les utilisent. Il serait traité comme une ressource comme une image, un son, une texture, ...
La deuxième donnée à définir serait une machine à états pour gérer les états d'animation et les transitions. Cela définit chaque état dans lequel une entité de jeu peut se trouver, ce qui indique qu'elle peut effectuer une transition et ce qui déclenche ce changement d'état.
Cette machine d'état diffère d'une entité à l'autre. Parce qu'un oiseau pourrait avoir des états "marcher" et "voler" alors qu'un humain n'aurait que l'état "marcher". Cependant, il pourrait être partagé par différentes entités car plusieurs humains auront probablement les mêmes états (surtout lorsque vous définissez des PNJ communs comme des monstres, etc.). De plus, un orc peut avoir les mêmes états qu'un humain. Juste pour démontrer que cette définition d'état peut être partagée mais uniquement par un groupe sélectionné d'entités de jeu .
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
Ces états peuvent être gérés par un système de sondage . À chaque partie, il capture l'état actuel d'une entité de jeu et vérifie tous les déclencheurs. Si une condition est remplie, elle change l'état de l'entité en l'état "goto".
La dernière partie avec laquelle je me débattais était de savoir comment lier des données d'animation et des états d'animation à une entité . L'approche la plus logique m'a semblé ajouter un pointeur sur les données de la machine d'état qu'une entité utilise et définir pour chaque état de cette machine quelle animation elle utilise.
Voici un exemple xml de la façon dont je définirais le comportement d'animation et la représentation graphique de certaines entités communes dans un jeu, en abordant l'état d'animation et l'identifiant des données d'animation. Notez que "wizard" et "orc" ont les mêmes états d'animation mais une animation différente. En outre, une animation différente peut signifier une feuille de sprite différente, ou même une séquence d'animations différente (une animation peut être plus ou moins longue).
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
Lorsque l'entité est en cours de création, elle ajouterait une liste d'états avec des données de machine d'état et une référence de données d'animation.
À l'avenir, j'utiliserais le système d'entités pour créer des entités entières en définissant des composants dans un format xml similaire.
-
C'est ce que j'ai trouvé après quelques recherches. Cependant, j'ai eu du mal à m'en sortir, alors j'espérais avoir des retours. Y a-t-il quelque chose ici qui n'a pas de sens, ou existe-t-il une meilleure façon de gérer ces choses? J'ai saisi l'idée d'itérer à travers des cadres mais j'ai du mal à aller plus loin et c'est ma tentative de le faire.