2015-10-16 63 views
1

我正在嘗試創建一個遊戲,其中JADE代理是'敵人',他們在迷宮附近追逐玩家。代理在JADE行爲不起作用

到目前爲止,我有: MazeView.java(使用Swing來在屏幕上繪製各種事情,並讓用戶通過按下按鈕交互) Enemy.java(玉劑,將有行爲,如搜索,追求,等等) 和其他一些類,如生成實際的迷宮數據結構等

我的問題是,雖然我可以實例化一個代理並在屏幕上繪製它,出於某種原因,我不能添加任何行爲。例如,如果我想這樣的事情(在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(),我沒有得到一個錯誤。

一個可能的解決方案可能是重新實現我的迷宮作爲一個等待輸入的常量循環。這會允許「時間」的概念嗎?基本上我不知道如何將兩者聯繫在一起。我是一個完整的初學者與JA​​DE。

任何想法,將不勝感激。謝謝!

回答

1

我從來沒有用過玉,但我首先想到的是,你是添加行爲,然後假設翡翠將決定在某一時刻運行。當你說你從來沒有看到你的行爲激活時,它加強了這一假設。

我看了看源代碼,果然,addBehaviour()removeBehaviour()只是簡單地從名爲的集合中添加和刪除。看着這些用法,我發現了一個名爲activateAllBehaviours()的私有方法,看起來好像它運行了Behaviors。該方法由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容器。

+0

自己調用doWake()似乎並不奏效,但您可能正確地說我需要手動執行Boot類應該正常執行的任何操作。我會看看文檔。 – Touchdown

+0

謝謝,你的語法工作!所以我需要爲我的代理創建一個新的容器及其屬性,然後將其設置爲主容器。 – Touchdown