Existe-t-il un modèle généralement accepté pour effectuer diverses actions dans un jeu? Une façon dont un joueur peut effectuer des actions et aussi qu'une IA puisse effectuer des actions, telles que déplacer, attaquer, s'autodétruire, etc.
J'ai actuellement une BaseAction abstraite qui utilise des génériques .NET pour spécifier les différents objets qui sont retournés par les différentes actions. Tout cela est implémenté dans un modèle similaire à la commande, où chaque action est responsable d'elle-même et fait tout ce dont elle a besoin.
Mon raisonnement pour être abstrait est pour que je puisse avoir un seul ActionHandler, et l'IA peut simplement mettre en file d'attente différentes actions implémentant la baseAction. Et la raison pour laquelle il est générique est que les différentes actions peuvent renvoyer des informations de résultat pertinentes pour l'action (car différentes actions peuvent avoir des résultats totalement différents dans le jeu), ainsi que des implémentations communes avant et après action.
Alors ... y a-t-il une façon plus acceptée de le faire, ou est-ce que ça vous va?
la source
Réponses:
Je ne pense pas qu'il existe une façon acceptée de mettre en œuvre ce concept, mais j'aimerais vraiment partager la façon dont je gère généralement cela dans mes jeux. C'est un peu une combinaison du modèle de conception Command et du modèle de conception Composite .
J'ai une classe de base abstraite pour les actions qui n'est rien de plus qu'un wrapper autour d'une
Update
méthode qui est appelée chaque trame, et unFinished
indicateur pour indiquer quand l'action a fini de s'exécuter.J'utilise également le modèle de conception composite pour créer un type d'actions capable d'héberger et d'exécuter d'autres actions. C'est aussi une classe abstraite. Se résume à:
Ensuite, j'ai deux implémentations d'actions composites, une pour l' exécution parallèle et une pour l'exécution séquentielle . Mais la beauté est que le parallèle et la séquence étant eux-mêmes des actions, ils peuvent être combinés afin de créer des flux d'exécution plus complexes.
Et celui qui régit les actions séquentielles.
Avec cela en place, il s'agit simplement de créer des implémentations d'actions concrètes et d'utiliser les actions
Parallel
etSequence
pour contrôler le flux d'exécution. Je termine avec un exemple:J'ai utilisé avec succès ce système pour piloter tout le gameplay dans une aventure graphique auparavant, mais il devrait probablement fonctionner à peu près n'importe quoi. Il était également assez simple d'ajouter d'autres types d'actions composites, qui étaient utilisées pour créer des boucles d'exécution et des conditions.
la source
Draw
méthode est déjà construite au-dessus de l'état de l'entité et les modifications sont automatiques. Dans un rendu en mode conservé tel que Flash, vous pouvez utiliser le modèle observable pour apporter des modifications à vos entités propager aux objets d'affichage, ou établir la connexion manuellement à l'intérieur de l'entité elle-même.Character
classe a unePosition
propriété et uneDraw
méthode qui lit la valeur actuelle dePosition
et y dessine l'image correcte. Dans cette situation, il vous suffit de mettre à jour la valeur pourPosition
que le résultat soit automatiquement affiché à l'écran.Character
possède unePosition
propriété, mais qu'elle délègue le rendu à une sorte d'Sprite
objet qui est automatiquement rendu par un graphique de scène ou quelque chose. Dans cette situation, vous devez vous assurer que la position du personnage et celle du sprite sont toujours synchronisées, ce qui implique un peu plus de travail. Pourtant, dans les deux cas, je ne vois pas pourquoi le gestionnaire d'actions devrait avoir quelque chose à voir avec cela. :)