2012-10-11 132 views
4

我有敵船和玩家船。計算兩點之間的速度

我希望敵方的艦船總是在任何時候直接向玩家飛行,即使玩家正在移動。

我正在爲使用C#XNA的Ray類進行討論。

我有兩個矢量座標,射線的位置/原點(玩家當前位置)和射線的方向(敵人的當前位置)。我希望敵人的位置逐漸走向球員陣地。

到目前爲止我有這個代碼。

enemyPlayerTrack.Position = playerPos; 
enemyPlayerTrack.Direction = enemyPos; 

我不確定我是否需要另一個速度向量。

最後,敵人將被吸引到屏幕上與此代碼的新位置:

enemyWorldMatrix = Matrix.CreateTranslation(new Vector3(x, y, z)); 

沒有數學的背景,我無法創造的速度彌合兩個向量接近和更近。

+0

遊戲開發**需要**至少*一些*數學背景。從成千上萬本書中嘗試:克里斯托弗特倫布萊。遊戲開發人員的數學。課程技術,2004年。ISBN 9781592000388 –

+0

我同意以前的評論者 - 特別關注三角函數:) –

回答

2

我們選擇一些速度s。然後從敵人玩家的方向是:

dir_x = player_x - enemy_x 
dir_y = player_y - enemy_y 

總體速度S =開方(vel_x^2 + vel_y)^ 2,所以我們縮放DIR載體給予我們的速度:

factor = s/sqrt(dir_x^2 + dir_y^2) 
vel_x = dir_x * factor 
vel_y = dir_y * factor 

所以現在敵人總是以相同的速度飛向玩家。但是如果玩家靠近敵人,敵人就會過沖,並在玩家身上來回跳動。所以我們限制速度:

distance = sqrt(dir_x^2 + dir_y^2) 
delay_to_reaching_player = 2 // some measure of time 
enemy_speed = min(s, distance/delay_to_reaching_player) 

這樣,通過設置延遲,敵人會當它接近的球員,一旦得到足夠接近停止在其最大速度(S)移動減慢。

+0

然後我將如何實現最後的移動代碼? enemyWorldMatrix = Matrix.CreateTranslation(new Vector3(vel_x,vel_y,z)); ??? – Edge

+1

放緩?哈哈......猛擊速度! ; p –

+0

翻譯是位置變化,即速度乘以時間增量。如果您知道屏幕更新的頻率,請使用此值(例如0.01秒),但如果您不知道,則最好從最後一幀開始捕獲時間並使用它。 –

2

我沒有在我面前XNA,所以這只是僞...

兩者之間的總增量應該是簡單的:

var delta = playerPosition - enemyPosition; 

這指明瞭方向,但會通常有錯誤的幅度;所以我們可以重新調整,要通過單位向量:但是

var magnitude = Math.Sqrt(delta.x * delta.x + delta.y * delta.y + 
        delta.z * delta.z); // however many dimensions you have... 
var unitDelta = delta/magnitude; // assuming non-zero; if zero, don't move 
var newVelocity = unitDelta * enemySpeed; 

注意,這違背了勢頭,是非常基本的(不考慮玩家的速度 - 它會覺得像AI是愚蠢的)。

0

如果你有一個來自敵方的向量 - >玩家,你基本上有一個翻譯,你可以將它應用於敵人,讓它跳到玩家位置。你需要回歸到一個'單位',通過歸一化矢量來設置矢量的總長度爲'1',但它仍然指向玩家的方向,那麼你可以乘以你實際想要的速度得到一個向量來將敵人轉化爲朝向玩家移動

正如人們已經回答的那樣 - 爲了得到一個單位,你需要對矢量的兩個分量的乘積求和,然後取平方根。這關係到畢達哥拉斯定理例如:

如果你把一個向量的組件說

(2,2)

這將是這樣的:

2 
^
    | 
    | 
--> 2 

,然後繪製原點之間的直線( 0,0)和矢量結束的點 - 你得到一個三角形...

2 
^
/| 
/| 
--> 2 

該行表示向量的大小,你拿這兩個組件的平方和再開方它得到這條線的長度:

2 * 2 + 2 * 2 = 8

sqrt(8) = 2.82

所以這個矢量是2.82長 - 意思是2和2的值是單個單位矢量大小的2.82倍

要獲得'1'長或'單位'的分量,我們需要對矢量進行歸一化 - 我們這樣做將每個分量除以量級

2/2.82 = 0.70

這聽起來是正確的 - 我知道這個向量的夾角爲45度(最多2跨2必須是一個完美的對角),所以你可以用正弦或餘弦函數,因爲餘弦/正弦提供檢查對於給定的角度

sin(45) or cos(45) = 0.70

地點上

你現在知道一個向量分量的水平或垂直單元長度朝向玩家的角度採用了1個長度向量w第i個以下組件

(0.7, 0.7)

要移動的敵方3個單位對球員,你只需3

0.7 * 3 = 2.1

所以

(2.1, 2.1)

乘以組件

會在敵人身上移動敵人3個單位ics步驟

這有幫助嗎?