Treesharp C # библиотека дерева поведения - с чего начать? - PullRequest
0 голосов
/ 21 ноября 2010

Недавно я пытался реализовать устойчивое дерево поведения, используя библиотеку treesharp, опубликованную apoc .Я изучал итераторы и интерфейсы в своих книгах, но я все еще не могу понять, как тестировать, не говоря уже об использовании этой библиотеки.То, как интерфейсы соединяются друг с другом и как на самом деле выполнять тестирование / построение дерева с ними, запутывает меня до чертиков.

Обычно в этой ситуации я бы искал примеры кода и получал просветление, глядя наработа других людей, однако, для этой библиотеки, похоже, нет примера кода.

Может ли кто-нибудь помочь мне понять, как я мог бы начать строить дерево поведения с использованием этой библиотеки?Я извиняюсь, если вопрос очень дурацкий (и я думаю, что это может быть так), но перечислители и прогрессивные интерфейсы в интерфейсах мне очень трудно понять сейчас.

Ответы [ 2 ]

12 голосов
/ 27 марта 2012

Я являюсь автором TreeSharp, если у вас, ребята, есть какие-либо вопросы, не стесняйтесь отправлять мне электронные письма (они содержатся в каждом исходном файле в шапке).

Сначала вам нужно понять концепции деревьев поведения (различия между селекторами, последовательностями, декораторами, действиями и т. П.). Я также предоставляю несколько «тщеславных» композиций, чтобы немного упростить задачу (например, «Ожидание»).

API на основе конструктора позволяет полностью определять деревья с помощью ctors (с использованием делегатов, которые оцениваются во время выполнения для принятия решений и т. Д.)

К сожалению, я так и не удосужился реализовать класс TreeExecutor, который обрабатывает выполнение ветви произвольного поведения из чего-то вроде метода Tick (). Самый простой способ (с использованием PrioritySelector в этом примере, но вы можете использовать любой композит) заключается в следующем:

    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;
        }
    }

К сожалению, приведение «примеров» его использования действительно зависит от того, для чего вы его используете. (Поскольку он настолько общий, трудно давать примеры, которые будут иметь смысл для любого конкретного проекта. Я использовал его от вещей до логики ИИ, рабочих процессов, вплоть до процессов планирования)

Небольшой пример, который может немного помочь;

    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))
                        )
                    )
                )       
        );
    }

Опять же, это действительно зависит от ваших требований. Библиотека позволит вам создавать подклассы для любых композитов для упрощения их повторного использования. (Например, вы можете создать действие SetTargetAndRotate, которое исключает два действия в последовательности)

Опять же, если у вас, ребята, есть вопросы, не стесняйтесь спрашивать.

0 голосов
/ 02 марта 2012

Джейсон, Библиотека, похоже, реализует все идеи, которые я видел в других примерах библиотек BT.Я пытаюсь использовать такую ​​библиотеку для одного из моих собственных проектов, поэтому пока я не сделаю этого, я лишь думаю о том, как использовать эту библиотеку, основываясь на кратком осмотре.

Тем не менее, я думаю, что вы быПредоставьте свои собственные функции обратного вызова для экземпляров класса Action, а затем объедините различные действия в групповые комбинации, основанные на идеях BT (подождите, пока что-то не станет правдой, прежде чем действовать, действуйте, пока одно из этих действий не будет успешным, выполните все эти действия, если не произойдет сбойи т. д.).

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...