2015-10-16 2 views
1

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

До сих пор у меня есть: MazeView.java (использует качание рисовать различные вещи на экране, и позволяет пользователю взаимодействовать через нажатие кнопок) 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 секунд» перед выбросом ошибки. Что здесь происходит?

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

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

Любые идеи будут оценены. Благодаря!

ответ

1

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

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

Я бы предположил, что вам просто нужно позвонить doWake() в ваш агент. Это не очень очевидно из JavaDoc или примеров. В примерах предполагается, что вы используете класс jade.Boot и просто передаете имя класса вашего агента этому классу 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.

+0

вызов doWake() сам по себе не работает, но вы, вероятно, правы, говоря, что мне нужно вручную делать то, что обычно должен делать класс загрузки. Я посмотрю документы. – Touchdown

+0

Спасибо, ваш синтаксис работал! Поэтому мне нужно было создать новый контейнер для моих агентов вместе со своими свойствами, а затем установить его как основной контейнер. – Touchdown