【问题标题】:Agent in JADE behaviour not workingJADE行为中的代理不起作用
【发布时间】:2015-10-16 14:43:15
【问题描述】:

我正在尝试创建一个游戏,其中 JADE Agents 是“敌人”,他们在迷宫中追逐玩家。

到目前为止,我有: 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 的初学者。

任何想法将不胜感激。谢谢!

【问题讨论】:

    标签: java swing agents-jade


    【解决方案1】:

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

    我查看了源代码,果然,addBehaviour()removeBehaviour() 只是在名为 myScheduler 的集合中添加和删除。查看用法,我发现了一个名为activateAllBehaviours() 的私有方法,它看起来像是运行了行为。该方法是从 Agent 类上的公共 doWake() 调用的。

    我猜你只需要在你的代理上调用doWake()。这在 JavaDoc 或示例中不是很明显。这些示例假设您使用jade.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 类型的代理并开始运行它。我实现它类似于你的代码 sn-p,我每 5 秒看到一次消息。

    我认为您会想要使用 setCloseVM(false),因为您的 UI 可以处理关闭 JVM,而不是 Jade 容器。

    【讨论】:

    • 单独调用 doWake() 似乎不起作用,但您可能说得对,我需要手动执行 Boot 类通常应该执行的任何操作。我会看看文档。
    • 谢谢,您的语法有效!所以我需要为我的代理创建一个新容器及其属性,然后将其设置为主容器。
    猜你喜欢
    • 2022-01-13
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多