Агент в JADE поведение не работает

Я пытаюсь создать игру, в которой Агенты JADE являются "врагами" и преследуют игрока по лабиринту.

На данный момент у меня есть: MazeView.java (использует Swing для рисования различных вещей на экране и позволяет пользователю взаимодействовать с помощью нажатия кнопок) Enemy.java (агент JADE, который будет иметь такие поведения, как поиск, преследование и т. Д.) И несколько другие классы делают такие вещи, как создание фактической структуры данных лабиринта и т. д.

Моя проблема в том, что, хотя я могу создать экземпляр Агента и нарисовать его на экране, по какой-то причине я не могу добавить поведение. Например, если я хотел что-то вроде этого (в Enemy.java):

protected void setup() {      
    // Add a TickerBehaviour that does things every 5 seconds
    addBehaviour(new TickerBehaviour(this, 5000) {
        protected void onTick() {
            // This doesn't seem to be happening?
            System.out.println("5 second tick... Start new patrol/do something?");
            myAgent.addBehaviour(new DoThings());
        }
    }); // end of addBehaviour
    System.out.println("End of setup()...");
} // end of setup

Когда я запускаю код, никаких ошибок не появляется, и я вижу "Конец настройки ()...", отображаемый в консоли. Так что по какой-то причине он просто не входит в метод addBehaviour(). Даже если поведение DoThings() не сработало (сейчас оно просто печатает сообщение), оно должно по крайней мере отобразить сообщение "5 секунд", прежде чем выдать ошибку. Что здесь не так?

Я думаю, это может быть связано с тем, что в моем лабиринте в настоящее время нет понятия "время". Пользователь нажимает клавишу, и тогда происходит обработка. Таким образом, наличие агента, который делает вещи каждые 5 секунд, может не сработать, когда нет реального способа облегчить это в лабиринте? Но я все еще не понимаю, почему он просто пропускает addBehaviour(), и я не получаю сообщение об ошибке.

Возможное решение может состоять в том, чтобы повторно реализовать мой лабиринт как постоянный цикл, который ожидает ввода. Позволит ли это понятие "время"? По сути, я не уверен, как связать их вместе. Я начинающий с JADE.

Любые идеи были бы хорошы. Спасибо!

1 ответ

Решение

Я никогда не использовал Jade, но моей первой мыслью было, что вы добавляете поведения, а затем предполагаете, что Jade решит запустить их в какой-то момент. Когда вы говорите, что никогда не видите активизации своего поведения, это укрепляет эту гипотезу.

Я посмотрел на источник и, конечно же, addBehaviour() а также removeBehaviour() просто добавьте и удалите из коллекции под названием myScheduler, Глядя на обычаи, я нашел частный метод под названием activateAllBehaviours() это выглядело так, как будто оно управляло поведением. Этот метод вызывается из общественности doWake() на агентском классе.

Я предполагаю, что вам просто нужно позвонить doWake() на вашего агента. Это не очень очевидно из JavaDoc или примеров. В примерах предполагается, что вы используете jade.Boot класс и просто передайте имя класса вашего агента этому классу загрузки. Это приводит к добавлению агента в контейнер, который управляет "пробуждением" и запуском ваших агентов. Поскольку вы используете Swing для своего графического интерфейса, я думаю, что вам придется запускать агенты вручную, а не так, как показано в примерах.


Мне стало любопытнее, поэтому я написал свой собственный код для создания и запуска контейнера Jade. Это сработало для меня:

Properties containerProps = new jade.util.leap.Properties();
containerProps.setProperty(Profile.AGENTS, "annoyer:myTest.MyAgent");

Profile containerProfile = new ProfileImpl(containerProps);

Runtime.instance().setCloseVM(false);
Runtime.instance().createMainContainer(containerProfile);

Это автоматически создает мой агент типа myTest.MyAgent и начинает работать Я реализовал это подобно вашему фрагменту кода, и я видел сообщения каждые 5 секунд.

Я думаю, вы захотите использовать setCloseVM(false) поскольку ваш пользовательский интерфейс может обрабатывать закрытие JVM, а не контейнера Jade.

Другие вопросы по тегам