2014-01-15 107 views
1

我正在使用libgdx編程一個遊戲。對於我想寫一個簡單的AI的敵人。這個人工智能應該跟蹤玩家,如果他曾經在視覺領域。 Vision的領域是一個圓形扇形或二維錐形。什麼纔是最有效的方法來達到這個目標?我已閱讀媒體鏈接如下: Point in circle sectorlibgdx中的矩形和圓形扇區之間的交集

我可以用我的播放器的每一個角落點用這個,但我也有方向和角度(部門direction + angle/2direction - angle/2之間)給出的視野。 角度不會超過180°(因爲這對算法來說是一個問題)。計算遊戲中每個敵人的扇區開始和結束的矢量是否會成爲一個問題?什麼是最好的解決方案,我如何計算給定方向和角度的矢量?

回答

2

您可以使用鏈接帖子中描述的解決方案,但必須通過計算dir +/- angle/2的正弦和餘弦將角度轉換爲矢量。有關整數運算所鏈接的解決方案的會談,但你的載體將是花車:

arm1 = [cos(d - 0.5 * a), sin(d - 0.5 * a)] 
arm2 = [cos(d + 0.5 * a), sin(d + 0.5 * a)] 

的參數cossin的弧度。 x方向上的零點角度,即在傳統笛卡爾系統中爲東。

爲了不做不必要的工作,您應該首先檢查容易的事情。

我會做一個簡單的框檢查檢查與行業路口前:如果您的長方形的四個角點周圍敵人的方盒子外面,沒有交集:

if (x0 < x-r && x1 < x-r && x2 < x-r && x3 < x-r) return false; 
if (x0 > x+r && x1 > x+r && x2 > x+r && x3 > x+r) return false; 
if (y0 < y-r && y1 < y-r && y2 < y-r && y3 < y-r) return false; 
if (y0 > y+r && y1 > y+r && y2 > y+r && y3 > y+r) return false; 

這個簡單檢查應該排除許多敵人。

接下來,檢查鏈接答案中描述的所有四個點的半徑,如果您的任何角點都不在半徑範圍內,則返回false。

只是現在我們必須計算帶有trig函數的向量。你可以用上面給出的公式來做到這一點。如果你有敵人和角度的正弦和餘弦已經,您可以使用addition theoremes加快矢量計算:

# sin_d = sin(d), cos_d = cos(d) 
# sin_a = sin(0.5 * a), cos_a = cos(0.5 * a) 

arm1 = [cos_d * cos_a + sin_d * sin_a, sin_d * cos_a - cos_d * sin_a] 
arm2 = [cos_d * cos_a - sin_d * sin_a, sin_d * cos_a + cos_d * sin_a] 

視角可能是對每個敵人恆定的,所以你可以預先計算它,你可能已經預先計算了cos_dsin_d

如果你不關心精確度,也不想進入弧度,你可以預先計算正弦和餘弦的一度步長,並將它們存儲在兩個大小爲360的數組中。然後計算正弦將成爲查找一個數組的問題,即它會很快,你可以做你所有的計算n度。 (但照顧包裝:5° - 15°應該是350°,而不是-10°)。

+0

非常感謝(:我不需要高度準確,因爲它只是用來說enemie跟蹤球員,只是一個小問題:爲什麼我應該首先進行方格檢查然後進行半徑檢查?半徑檢查不會花費太多,因爲它只是將中心之間的平方距離與視野場和球員的平方半徑進行比較(實際上我的玩家和敵人都是兩個圓形,因爲它們可以旋轉,旋轉的圓形更容易,然後旋轉矩形:P)。 所以我可以讓盒子檢查一下而不會丟失性能? – Springrbua

+0

@Springrbua:當你不計算平方根時,raduis檢查可能會更好,你是對的。您可以通過比較帶有和不帶附加方格檢查的表演輕鬆檢查。 –

+0

我不使用平方根(沒有意義)。所以我做了半徑檢查,然後進行了ClockWise和Counter-ClockWise檢查。 – Springrbua