JADE 行为中的代理不起作用

Agent in JADE behaviour not working

我正在尝试创建一个游戏,其中 JADE 特工是 'enemies',他们在迷宫中追逐玩家。

到目前为止我有: MazeView.java(使用 Swing 在屏幕上绘制各种东西,并让用户通过按下按钮进行交互) Enemy.java(一个 JADE 代理,将具有搜索、追踪等行为) 还有其他一些 类 做一些事情,比如生成实际的迷宫数据结构等

我的问题是,虽然我可以实例化一个 Agent 并将其绘制在屏幕上,但出于某种原因我无法添加任何行为。例如,如果我想要这样的东西(在 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

当我 运行 代码时,没有抛出任何错误,我可以看到 "End of setup()..." 显示在控制台中。所以出于某种原因,它根本就没有进入 addBehaviour() 方法。即使 DoThings() 行为不起作用(现在它只是打印一条消息),它至少应该在抛出错误之前显示“5 second tick”消息。这里出了什么问题?

我想这可能是因为目前我的迷宫中没有'time'的概念。用户按下一个键,然后处理发生。因此,当没有真正的方法在迷宫中促进它时,拥有一个每 5 秒做一次事情的代理可能行不通?但我仍然对为什么它只是跳过 addBehaviour() 而我没有收到错误感到困惑。

一个可能的解决方案是将我的迷宫重新实现为一个等待输入的常量循环。这会允许 'time' 的概念吗?基本上我不确定如何 link 将两者结合在一起。我是 JADE 的初学者。

如有任何想法,我们将不胜感激。谢谢!

我从未使用过 Jade,但我的第一个想法是您正在 添加 行为然后 假设 Jade 将决定运行 他们在某个时候。当你说你从未看到你的行为激活时,它加强了这个假设。

我查看了源代码,果然,addBehaviour()removeBehaviour() 只是在名为 myScheduler 的集合中添加和删除。查看用法,我发现一个名为 activateAllBehaviours() 的私有方法看起来像 运行 Behaviours。该方法是从代理 class.

上的 public doWake() 调用的

我猜你只需要在你的代理上调用 doWake()。这在 JavaDoc 或示例中不是很明显。这些示例假定您使用 jade.Boot class 并将代理的 class 名称简单地传递给该 Boot class。这导致代理被添加到管理代理的 "waking" 和 运行 的容器中。由于您 运行 正在为您的 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 容器。