2012-12-28 76 views
0

我試圖編程一個捕食者/獵物類型模擬,其中兩種不同類型的代理在模擬中移動。現在我有8種可能的移動方向(右,右前,前進等)代理商可移動in.To使它看起來更自然,我想實現像這樣基於角運動:模擬遊戲 - 檢查代理是否被阻止

xPos+= speed * Math.cos(Math.toRadians(angle)); 
yPos+= speed * Math.sin(Math.toRadians(angle)); 

我已經碰撞檢測已經在模擬其中代理不能互相重疊執行。 現在我面臨的問題是,如何檢查我的代理是否被阻擋(被其他代理裝箱),從而無法移動。以前的8方向移動我做的是我嘗試移動到一個在八個可能的方向中,如果代理不能朝那個方向移動(碰撞或邊界),則從可能的移動方向移除方向並再試一次。一旦沒有移動方向,則表示代理已裝箱。

但是,如果我要實現基於角度的移動(確實檢查單個可能的移動角度是非常低效的),我該如何檢查代理是否已裝入,如果沒有,接下來應該選擇哪個角度的移動。或者,我應該只是堅持八向運動?

目前代理人正朝着最近的食物移動,否則它會自由漫遊。代理人沒有限制它轉多快等等(現在可以馬上轉身)。

+1

首先,定義「代理人」的規則。例如,它應該如何移動?一個非常簡單的方法就是總結所有的「威脅」(或「食物」或「信息素」)向量在附近的區域 - 這就是旅行(或撤退)的向量。當然,這就是「本地目標」矢量,它可能有其他限制,例如: 「只能轉得這麼快」。對於更好的人工智能而言,它實際上「提前思考」會變得更復雜一些,但對於簡單的捕食者/獵物遊戲模擬來說,這應該是很好的。 – 2012-12-28 23:11:49

+1

(同樣的方法可以用來找到「最大的開放」,將其他N個代理人視爲「威脅」並試圖避開它們。矢量也可以簡化爲網格單元或謹慎的移動) – 2012-12-28 23:15:42

+0

Ahh對不起,代理商真的可以自由漫遊,對轉速等沒有任何限制。在它朝着它的方向移動之前,它會檢查它是否與周圍的任何其他代理髮生碰撞(如果它正在朝那個方向移動)(或者是否它已經達到了模擬窗口的範圍)。我遇到的問題是如果我使用基於角度的運動(不會與任何物體碰撞的運動),我如何選擇下一個最佳可用運動角度(即代理可以移動而不碰撞或達到邊界),而不必實際檢查所有的360度。 – Tohmas

回答

1

只需檢查角色周圍的所有4個邊界,就像你已經在做的一樣,如果它們不可用,那麼使四個對角線移動同樣不可用。

+0

哦,對不起,懷疑這個問題,我遇到的真正問題是,如果代理沒有被阻止,我該如何選擇下一個角度來檢查代理是否可以這樣移動。我的意思是我可以檢查所有360度但是這將會非常昂貴並且效率不高。 – Tohmas