2010-08-29 5 views
3

Je cherche à créer une scène graphique pour mon projet F # somthing comme:syndicats discriminées et l'héritage

root 
->player_bob 
-->torch 
->enemy_1 
-->extravagant_hat 
-->enemies_cat_jess 
--->fleas 
--->fur_ball 
->loot 

etc, etc.

Chaque objet doit contenir une collection d'objets de jeu pour représenter ses enfants.

par exemple la liste ennemi1 contient un chat et un chapeau et la liste des chats contient des puces et une boule de poils

donc je prévois de les faire tous hériter d'une classe qui contient une collection qui décrit que les objets enfants.

maintenant à ma question: Dois-je les objets enfants en bas-jeté à son gameobject et de les stocker dans une liste de la classe de base « gameobject » OU créer une union de discrimination par exemple

type SceneObject = 
     |Character of Character //e.g player, enemy, cat 
     |Item of Item //e.g hat, torch, furball 

Et magasin des objets comme une liste de "SceneObjects" pour éviter les problèmes/overheads avec les monter, etc. En plus de me permettre de décrire des cas spéciaux où l'objet n'est pas rendu et/ou pas utilisé dans la détection de collision par ex. , déclencheurs de pièges, etc.

La combinaison discriminée union + héritage est ma pensée initiale; Cependant, comme je suis nouveau à la FP, j'ai pensé qu'il serait sage de demander aux professionnels de la meilleure manière, fonctionnelle, d'aborder cela.

Merci,

JD

Répondre

9

Vous pouvez utiliser l'union discriminée récursive.

type SceneObject = 
    | Character of <characterData> * (SceneObject list) 
    | Item  of <itemData>  * (SceneObject list) 

Et l'utiliser comme ceci

let root = [Character("Bob", [Item("Torch", []); ...]); ...] 
+1

Brillant! Cela élimine le besoin de l'héritage: ¬) Merci Dario, la moitié de mon problème avec l'apprentissage FP me tire la tête hors de la terre OO. – jdoig

7

Une alternative à ce que Dario Suggest est de déclarer un type distinct pour les objets réels dans le jeu (comme les articles et les personnages) et l'envelopper dans un autre objet Cela ajoute une liste d'objets enfants. Cela ressemblerait à ceci:

type SceneObject = 
    | Character of <characterData> 
    | Item of <itemData> 

type ObjectWithChildren = 
    { Object : SceneObject 
    Children : ObjectWithChildren list } 

Les deux options sont la conception fonctionnelle correcte, mais je préfère cette version, car il rend certains types de traitement plus facile. Par exemple, si vous vouliez traverser tous les objets dans l'arborescence de jeu, vous pouvez écrire quelque chose comme:

let rec traverse tree = 
    // Do something with tree.Object 
    for child in tree.Children do traverse child 

Dans cette version, vous n'avez pas besoin de correspondance de motif sur SceneObject du tout, donc vous ne besoin d'inclure tous les cas (tels que Item et Character).

+0

Intéressant. C'est ainsi que j'ai modélisé la classe Character et sa machine d'état. Un enregistrement de personnage pour contenir toutes les données brutes (emplacement, santé, etc) (CharacterRecord). Un processeur de boîte aux lettres en tant que machine d'état (CharacterStateMachine). Puis enveloppé les deux dans l'enregistrement "Character" qui contient {state: CharacterStateMachine; données: CharacterRecord}. Ensuite, les membres utilisés pour faire quelques getters et setters conviviaux ... Donc cette solution s'intègre bien avec mon modèle actuel. Je vais devoir donner à ces deux un essai, Un grand merci. – jdoig

Questions connexes