2010-01-08 10 views
0

Je suis sûr qu'il existe une solution de conception à mon problème, mais je n'arrive pas à décider quelle approche est réalisable. Je sais ce que je veux, j'ai juste du mal à faire les connexions ... Je vais vous expliquer:Définition de comportements d'objet de jeu en XML

Je travaille sur un jeu. J'ai GameObjects. J'ai GameBehaviors. Les propriétés de mes GameObjects sont définies dans un fichier XML qui contient tous les détails.

<type name="Object"> 
    <unit name="follower" behavior="followMouse" > 
     ...other unit info here... 
    </unit> 
</type> 

Alors comme gameobject est instancié, en fonction de la valeur de la propriété de comportement dans le XML, il en quelque sorte a le comportement attaché. J'ai besoin du comportement pour pouvoir accéder à toutes les propriétés de son parent, de telle sorte qu'il peut dire déplacer l'objet autour et ce qui ne ...

je n'ai pas beaucoup d'expérience avec des modèles de conception .. ., et un certain nombre d'entre eux semblent avoir presque raison, mais aucun des exemples que j'ai lus ne semble en faire un clic.

Je travaille avec AS3, mais n'hésitez pas à le rendre un peu plus général.

Répondre

0

Je suggérerais d'utiliser la composition, bien que votre objectif principal devrait être de trouver une bonne solution (fiable, extensible et maintenable) plutôt que d'utiliser un modèle de conception nommé. Donc, votre objet de jeu peut avoir une méthode initFromXML (xml), ou peut-être a une méthode d'usine statique qui prend xml comme argument. Cela analyse le fichier XML et recherche les comportements, puis crée le comportement approprié. Créer le comportement pourrait être fait avec une autre usine.

Vous ajoutez ensuite le comportement à la liste des comportements des objets de jeu. Les comportements peuvent tous être des objets issus d'une classe commune, ou ils peuvent tous implémenter une interface IBehavior.

Les comportements peuvent faire leur chose en étant appelés par un objet de jeu, ou en ajoutant des écouteurs d'événements.

+0

Je donne cette réponse pour l'instant. C'est un sujet avec beaucoup de solutions, donc je suis déçu par le manque de variété, mais c'est certainement une bonne recommandation. – grey

0

Je pense avoir compris votre approche.

Cela se produit beaucoup dans les jeux car vous avez un nombre infini d'effets, de statuts, de comportements, etc., potentiellement.

Ce que je vois dans votre problème est que vous traitez plus avec des choses fonctionnelles comme « ce que cela suit cette souris », « Est-ce répondre aux commandes du clavier », etc ...

Dans ce cas, ce que vous pouvez do est créer des classes fonctionnelles comme "MouseFollower" ou "KeyboardResponder" qui acceptent génériquement un GameObject comme l'argument de leur constructeur.

Ces objets peuvent ensuite appliquer des gestionnaires d'événements directement à GameObject, tels que les écouteurs d'événement.

Vous pouvez stocker tous vos objets fonctionnels dans un tableau dans GameObject au cas où vous auriez besoin de les supprimer. Quand ils sont dans un tableau, vous pouvez aussi faire cool comme créer une classe fonctionnelle Interface avec un ensemble uniforme de méthodes.Donc, si, par exemple, le gameobject ont été rendus inactifs ou désactivé, vous pouvez dire

for each IFunctionalObject in GameObject.FunctionalObjects 
IFunctionalObject.disable() 

Je suppose que cette approche serait tolérable si vous aviez une variété vraiment énorme d'objets de jeu, et je suppose un RPG serait exemple décent où vous gérez un grand nombre de sprites de différentes fonctionnalités.