我试图创造一个游戏,其中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的初学者。
任何想法都将不胜感激。谢谢!
答案 0 :(得分:1)
我从未使用过Jade,但我的第一个想法是你添加行为,然后假设 Jade将决定在某些时候运行它们。如果你说你从未看到你的行为被激活,那就加强了这个假设。
我查看了源代码,确实,addBehaviour()
和removeBehaviour()
只是在名为myScheduler
的集合中添加和删除。看看这些用法,我找到了一个名为activateAllBehaviours()
的私有方法,看起来像是运行了行为。该方法是从Agent类的公共doWake()
调用的。
我猜你只需要在你的代理上拨打doWake()
即可。从JavaDoc或示例中可以看出这一点并不十分明显。这些示例假定您使用jade.Boot
类,只需将代理的类名传递给该Boot类。这会导致代理程序被添加到管理“唤醒”和运行代理程序的容器中。由于您为GUI运行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)
,因为你的UI可以处理关闭JVM而不是Jade容器。