Résumé des états d'animation du système d'entité

8

J'ai récemment commencé à concevoir un moteur de jeu en utilisant le paradigme Entity System, c'est-à-dire avoir des entités comme agrégation de composants et des systèmes qui implémentent le jeu réel. Alors que j'ai eu des difficultés sous divers aspects, ce qui me préoccupe le plus, c'est l'abstraction / modularité des différents composants / systèmes. Plus précisément, disons que mon Playera plusieurs états d'animation, par exemple. Walking, Sleeping, JumpingEt un type d' Opponententité a plusieurs (pas nécessairement les mêmes) états ainsi, par exemple. Walking, Hidingetc.

Comment dois-je concevoir le moteur pour qu'il gère les différents états (d'animation) de chaque type d'entité? Doit-il y avoir différents systèmes d'animation pour chaque type d'entité? Dois-je utiliser des drapeaux qui signalent au système d'animation de restituer l'entité correcte? De plus, puis-je éviter d'utiliser des énumérations "codées en dur" pour les différentes poses? Je peux voir qu'un système de script pourrait probablement aider, mais je suis presque sûr qu'il existe une solution plus simple.

petermer
la source

Réponses:

4

Non aux systèmes différents pour chaque type, cela coupe trop fin le partage des responsabilités.

Voici ce que je fais dans mon projet personnel actuel:

Il existe de nombreuses façons de gérer l'état, mais vous en avez probablement besoin d'une logique pour les humains, ou du moins d'un pont entre l'humain et le code. Vous devez considérer le système d'animation comme un gros mélangeur au lieu d'un état discret, par exemple, vous passez du ralenti à la marche lente en ajoutant 50% de marche au système, puis plus tard 100% de course.

Externe au système d'animation, vous pouvez utiliser des chaînes pour rendre le travail avec le système agréable et facile à utiliser comme scripts et code. En interne au système, vous créez un mappage entre cette chaîne et les données d'animation , cela peut être fait avec un magasin de valeurs-clés comme un hashmap (pour éviter complètement les énumérations en faisant des données d'animation le magasin) ou avec une chaîne à énumérer recherchez si vous aimez travailler de cette façon. C'est une question de goût à ce stade. Je préfère la valeur-clé car elle peut être totalement basée sur des données à partir de fichiers XML ou INI.

Pour gérer différents types, vous pouvez, au niveau de la couche système, autoriser la création d'ensembles de mappage d'animations de sorte que l'ensemble pour "minion" et "run" pour "minion" soit différent de celui pour "run" et "joueuse". type.

En résumé: le système d'animation est générique et vous n'avez qu'un seul système; le monde extérieur a besoin d'une interface conviviale; le monde intérieur doit mapper des états génériques aux types d'entités.

Et ma liste de choses que je veux faire mais qui ne correspondent pas encore à ma conception:

À FAIRE : mapper automatiquement la vitesse de déplacement au type d'animation. Ainsi, au lieu de faire en sorte que le programme principal connaisse «marcher» ou «courir», le système d'animation peut convertir «se déplacer à une vitesse x» en l'animation appropriée.

TODO : divisez les animations comme le suivi de la tête et du torse de manière transparente.

TODO : animations de réaction (comme se faire frapper au visage) gérées par le système et non par le programme principal.

Patrick Hughes
la source
Donc, vous suggérez d'utiliser quelques-uns ifà l'intérieur du système d'animation; J'étais auparavant sceptique quant à l'utilisation de dictionnaires de chaînes (en C ++), en termes de mémoire. Après avoir lu aujourd'hui sur les tables de hachage, je trouve votre réponse assez simple. En ce qui concerne la partie «blender»: «Ajouter 50% de marche» signifie-t-il remplacer certains cadres par ceux de «marche» à 50% du temps?
petermer
Le mélange est un terme assez courant dans l'animation, cela signifie littéralement que vous mélangez deux (ou plus) animations de base ensemble pour obtenir la sortie finale. Dans l'exemple à 50%, je suppose un mélange de 50% de "ralenti" et de 50% de "marche", ce qui produirait une marche à demi-vitesse vers l'avant. De cette façon, vous pouvez varier en continu le mouvement de "Ralenti" à "Marcher" puis "Exécuter". Le mélange vous permettra plus tard de faire des choses comme faire fonctionner le torse inférieur pendant que le torse supérieur tire sur une arme à feu, ou salue quelqu'un, etc. Si votre moteur d'animation ne prend pas en charge le mélange, utilisez-le comme un moyen d'y penser et non une règle.
Patrick Hughes
1
Pour info: s'inquiéter de la mémoire pour les chaînes de votre programme à ce stade est une perte de temps, c'est ce qu'on appelle "l'optimisation prématurée" et généralement une mauvaise idée. Plus tard, si les chaînes causent vraiment une énorme charge, elles peuvent être transformées en nombres CRC courts pour les réduire toutes considérablement, au détriment de la facilité de débogage et d'une étape supplémentaire dans votre processus de génération.
Patrick Hughes