2014-01-26 23 views
2

我正在製作一款遊戲,應該有一個機器人將球形物體扔向另一個機器人。如何使對象在弧的路徑中移動?

投擲的球應該呈對稱弧形飛行。很確定這個數學詞是拋物線。

兩個機器人都在x軸上。

我該如何在我的遊戲中實現這樣的事情?我嘗試了不同的方法,都沒有工作。

在我的遊戲搬東西的現行制度,就像這樣:每個對象都有xy座標(變量),以及dxdy變量。

每個對象都有一個move()方法,這個方法被稱爲遊戲循環的每個循環。它只是增加dxxdyy

我該如何實現我所描述的,進入這個系統?

如果涉及到很多數學問題,請嘗試用簡單的方式解釋,因爲我對數學不太瞭解。

我的情況:

enter image description here

非常感謝

回答

6

您應該添加速度你的導彈。

速度是一個向量,這意味着它表示導彈在X軸上的移動速度和在Y軸上的速度有多快。現在,使用Move()而不是Update()。事情是這樣的:

void Update() 
{ 
    position.X += velocity.X; 
    position.Y += velocity.Y; 
} 

現在讓我們想到,會發生什麼導彈,一旦它拍:

在開始的時候有一定的啓動速度。例如有人以x 1米/秒的速度和y的-0.5米/秒的速度擊中導彈。然後,當它歸檔時,導彈將被拉到地面 - 它的速度將會向地面增長。

void Update() 
{ 
    velocity.Y += gravity; 

    position.X += velocity.X; 
    position.Y += velocity.Y; 
} 

這將根據您的導彈移動到物理(不含空氣阻力),並會產生一個非常漂亮的拋物線。

編輯: 您可能會問如何計算初始速度。我們假設我們有一個給定的角度(在射線和地面之間),以及最初的速度(我們可能知道射擊後的導彈有多快,只是不知道X和Y值)。然後:

velocity.X = cos(angle) * speed; 
velocity.Y = sin(angle) * speed; 
1

添加到米哈爾的答案,以確保導彈擊中機器人(如果你想它來跟蹤機器人),您需要調整其x速度。

void Update() 
{ 
    ball.dy += gravity; // gravity = -9.8 or whatever makes sense in your game 
    ball.dx = (target.x - ball.x); // this needs to be normalized. 

    double ballNorm = sqrt(ball.dx^2 + ball.dy^2); 
    ball.dx /= ballNorm; 


    ball.x += ball.dx; 
    ball.y += ball.dy 
} 

這將導致導彈跟蹤你的目標。 Normalizing矢量的x分量確保它永遠不會超過一個的速度。它也不完全「正常化」矢量,因爲通常你也必須對y成分執行此操作。如果我們在這裏沒有正常化,最終會有一個球在第一次更新時跳到您的目標。如果你想讓你的導彈飛得更快,只需乘以ballNorm

0

你可以從這幾個方程 得到你需要的所有東西,以獲得最大高度和時間距離。

g = gravity 
v = start vorticity M/S 
a = start angle deg 

g = KG of object * 9.81 
time = v*2 * sin(a)/g 
range = v^2 * sin(a * 2)/g 
height = v^2 * sin(a)^2/2*g 
相關問題