2010-11-21 6 views
0

Récemment, j'ai essayé d'implémenter un arbre de comportement robuste en utilisant le treesharp library posted by apoc. J'ai parcouru les itérateurs et les interfaces dans mes livres, mais je n'arrive toujours pas à comprendre comment tester et encore moins utiliser cette bibliothèque. Comment les interfaces se connectent entre elles et comment effectuer un test/construire un arbre avec elles est déroutant de ma part.Bibliothèque d'arborescence de comportement Treesharp C# - par où commencer?

Habituellement dans cette situation, je chercherais des exemples de code et dériverais l'illumination en regardant le travail des autres, cependant, pour cette bibliothèque, il ne semble y avoir aucun exemple de code.

Quelqu'un pourrait-il m'aider à comprendre comment je pourrais commencer à construire un arbre de comportement en utilisant cette bibliothèque? Je suis désolé si la question est très noobish (et je pense que c'est peut-être) mais les Enumérateurs et les interfaces progressives au sein des interfaces sont extrêmement difficiles à comprendre pour le moment.

+0

on dirait que vous avez décidé d'aller avec Treesharp par choix, pas que vous deviez l'utiliser.Pour moi, dans un tel cas, j'irais avec quelque chose qui est plus populaire que vous trouveriez des exemples de code pour. – BeemerGuy

+0

le problème est ... lors de la recherche de quelque chose de plus populaire ... je ne pouvais pas vraiment trouver quelque chose. Avez-vous affiché d'autres bibliothèques d'arbre de comportement C# ou autres qui pourraient être utilisées dans la construction d'un arbre de comportement robuste? c'était le seul que je pouvais trouver – Jason

+0

Des idées? Quelqu'un pourrait-il aider? – Jason

Répondre

0

Jason, La bibliothèque semble mettre en œuvre toutes les idées que j'ai vu démontré dans d'autres exemples de bibliothèques BT. Je cherche à tirer parti d'une telle bibliothèque pour un de mes propres projets, donc jusqu'à ce que je fais, je devine seulement comment utiliser celui-ci basé sur une brève inspection. Néanmoins, je pense que vous fournirez vos propres fonctions de rappel aux instances de la classe Action, puis regrouperez différentes actions en combinaisons de groupes basées sur les idées de BT (attendez que quelque chose soit vrai avant d'agir, agissez jusqu'à l'une de ces actions est couronnée de succès, effectuez toutes ces actions à moins d'échouer, etc.).

HTH

12

Je suis l'auteur de TreeSharp, si les gars vous avez des questions, ne hésitez pas à me tirer un email (son contenu dans chaque fichier source dans l'en-tête).

Vous devez d'abord comprendre les concepts des arbres de comportement (les différences entre sélecteurs, séquences, décorateurs, actions, etc.). Je fournis également quelques composites de "vanité" pour rendre les choses un peu plus faciles (comme Wait).

L'API à base de constructeur-vous permet de définir des arbres entièrement via cteurs (avec l'utilisation des délégués qui sont évalués lors de l'exécution de fournir des décisions, etc.)

Malheureusement, je ne ai jamais réussi à mettre en œuvre la classe « TreeExecutor », qui gère l'exécution d'une branche de comportement arbitraire à partir de quelque chose comme une méthode Tick(). Le moyen le plus simple (utiliser un PrioritySelector dans cet exemple, mais vous pouvez utiliser n'importe quel composite) est le suivant:

static void Start() 
    { 
     // Start MUST be called before you can tick the tree. 
     Logic.Start(null); 
     // do work to spool up a thread, or whatever to call Tick(); 
    } 

    private static void Tick() 
    { 
     try 
     {    
      Logic.Tick(null); 
      // If the last status wasn't running, stop the tree, and restart it. 
      if (Logic.LastStatus != RunStatus.Running) 
      { 
       Logic.Stop(null); 
       Logic.Start(null); 
      } 
     } 
     catch (Exception e) 
     { 
      // Restart on any exception. 
      Logging.WriteException(e); 
      Logic.Stop(null); 
      Logic.Start(null); 
      throw; 
     } 
    } 

Malheureusement, donner des "exemples" d'utilisation dépend vraiment de l'utilisation que vous en faites. (Puisqu'il est générique, il est difficile de donner des exemples qui auront un sens pour un projet donné.Je l'ai utilisé des choses à la logique AI, aux flux de travail, aux processus de planification)

Un petit exemple qui peut aider un peu;

static Composite CreateFireMissile() 
    { 
     return new PrioritySelector(
      new Decorator(ret => CurrentShip.CurrentTarget != null, 
       new Action(ret => CurrentShip.CurrentTarget.FireMissile())), 

      new Decorator(ret => CurrentShip.CurrentTarget == null, 
       new Decorator(ret => CurrentShip.NearbyHostiles.Count > 0, 
        new Sequence(
         new Action(ret => CurrentShip.SetTarget(CurrentShip.NearbyHostiles[0])), 
         new Action(ret => CurrentShip.RotateTo(CurrentShip.CurrentTarget.Location)) 
         ) 
        ) 
       )  
     ); 
    } 

Encore une fois, cela dépend vraiment de vos besoins. La bibliothèque vous permettra de sous-classer tous les composites pour faciliter la réutilisation des composites. (Par exemple, vous pouvez créer une action SetTargetAndRotate, qui élimine les deux actions dans la séquence)

Encore une fois, si vous avez des questions, n'hésitez pas à demander.

Questions connexes