Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 翡翠中的代理行为不起作用_Java_Swing_Agents Jade - Fatal编程技术网

Java 翡翠中的代理行为不起作用

Java 翡翠中的代理行为不起作用,java,swing,agents-jade,Java,Swing,Agents Jade,我正在尝试创建一个游戏,其中翡翠特工是“敌人”,他们在迷宫中追逐玩家 到目前为止,我已经: java(使用Swing在屏幕上绘制各种内容,并允许用户通过按键进行交互) java(具有搜索、追踪等行为的JADE代理) 还有一些其他类做一些事情,比如生成实际的迷宫数据结构等 我的问题是,虽然我可以实例化一个代理并将其绘制在屏幕上,但由于某些原因,我无法添加任何行为。例如,如果我想要这样的东西(在敌方.java中): 当我运行代码时,不会抛出任何错误,我可以看到控制台中显示的“EndofSetup()

我正在尝试创建一个游戏,其中翡翠特工是“敌人”,他们在迷宫中追逐玩家

到目前为止,我已经: java(使用Swing在屏幕上绘制各种内容,并允许用户通过按键进行交互) java(具有搜索、追踪等行为的JADE代理) 还有一些其他类做一些事情,比如生成实际的迷宫数据结构等

我的问题是,虽然我可以实例化一个代理并将其绘制在屏幕上,但由于某些原因,我无法添加任何行为。例如,如果我想要这样的东西(在敌方.java中):

当我运行代码时,不会抛出任何错误,我可以看到控制台中显示的“EndofSetup()…”。因此,出于某种原因,它根本没有进入addBehavior()方法。即使DoThings()行为不起作用(现在它只是打印一条消息),它至少应该在抛出错误之前显示“5秒滴答”消息。这里出了什么问题

我想这可能是因为目前我的迷宫中没有“时间”的概念。用户按下一个键,然后进行处理。因此,如果在迷宫中没有真正的方法来促进,那么让代理每5秒钟做一次事情可能不起作用?但我仍然不明白为什么它只是跳过addBehavior(),而我没有得到一个错误

一个可能的解决方案可能是将我的迷宫重新实现为一个等待输入的常量循环。这会允许“时间”的概念吗?基本上我不知道如何将两者联系起来。我对玉完全是个初学者


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

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

我查看了源代码,确信,
addbehavior()
removebhavior()
只需从名为
myScheduler
的集合中添加和删除即可。查看用法,我发现了一个名为
activateAllBehaviours()
的私有方法,它看起来像是在运行行为。该方法是从代理类上的public
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
的my agent并开始运行它。我实现了与您的代码片段类似的功能,并且每5秒就看到一次消息


我想您应该使用
setCloseVM(false)
,因为您的UI可以关闭JVM,而不是Jade容器。

单独调用doWake()似乎不起作用,但您可能说得对,我需要手动执行引导类通常应该执行的任何操作。我会看一下文档。谢谢,你的语法很好用!因此,我需要为我的代理创建一个新容器及其属性,然后将其设置为主容器。
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);