2012-04-04 37 views
1

我已經遍尋搜索,並且無法找到這個看似常見的問題的答案,令人驚訝。我目前面臨的問題是檢查球員是否面對敵人,如果是球員的視野範圍(可調整),並且如果它在該範圍內,則以最近的安全方向移動。檢查兩個物體是否面臨海誓山盟

這裏有一個畫面:d Example

所以,我將如何做到這一點?我有每艘船舶物體的xydirection。這是我最後一次失敗的嘗試,試圖考慮玩家的方向與敵人相對於玩家的方向完全相差180度。

var direction=Math.direction(this.x,this.y,player.x,player.y,1), 
    playerview=Math.abs(direction)-Math.abs(player.direction-180) 
if(Math.abs(playerview)<10) { 
    console.log('in view') 
    this.xVelocity+=AI.speed*Math.sin(playerview*Math.PI/180) 
    this.xVelocity+=AI.speed*Math.cos(playerview*Math.PI/180) 
    } 

在這個例子中,10就是範圍。當然,我只是設法讓船隻向右轉,所以除了檢測只工作半圈之外,我也不能讓敵人向右轉。有任何想法嗎?

回答

0

在您的代碼中,您正在修改this.xVelocity兩次而不是修改this.yVelocity。我想Math.direction不在JavaScript/ECMA標準中。你確定,你正確使用它?考慮Math.atan2

此外,您應該提供「相互面對」的定義

如果它「看到對方」,那麼您的評論「在視野中」是誤導性的。


但主要問題是:

Math.abs(angleInDegrees)修改角度

建立一個角度的絕對值正確的方法是:

while (angleInDegrees < 0) 
{ 
    angleInDegrees += 360; 
} 

// If necessary, add this too: 
while (angleInDegrees >= 360) 
{ 
    angleInDegrees -= 360; 
} 

-10和350是相同的,-10和10相距20度。

爲了進一步說明,讓我們稱上述normalizeAngle

代碼(注:對於巨大的值,循環可能會遇到很長的甚至永遠如果可能發生這樣的價值觀,這應該進行檢查。)


下應該做的伎倆:

playerview = normalizeAngle(direction - player.direction - 180) 
if (playerview < range || playerview > 360-range) { 

順便說一句:「playerview」應該從視圖和ENEM球員場上的的最小值y的視野。

+0

謝謝,複製xVelocity是一個平庸的錯誤^^;然而,問題並不在於移動船,它正在得到正確的檢測。 我確定Math.direction的工作原理是我用它來處理所有其他事情。我自己添加了原型;我知道這不是標準。 而且,在昏昏欲睡的狀態中,我做了我想要的不好的話。我想要的是檢查玩家是否面對敵人,給出一個小範圍,如圖中所示。你知道我會怎樣做到嗎?或者,如果爲了保持角度在360度內而額外採取措施,還是會增加180個工作嗎? – Ruffy 2012-04-04 11:48:45

+0

我編輯答案來繪製解決方案。 – Black 2012-04-04 12:38:54