2012-01-03 109 views
6

我有一個彈跳牆壁的球。這個反彈很簡單,我只是這樣做(代碼片段)彈跳球邏輯

if (x - moveSpeed < 0) // Ball hit left wall 
    xVel *= -1; 

但是我也得到了一個玩家移動的矩形。這種反彈實際上是在牆壁上反彈時起作用的。

但我想通了,當球得到了類似的運動爲圖片,它不可能爲我讓它再次走直線上升。因此,我需要一些關於矩形運動的計算來影響球的輸出角度。移動時矩形始終具有恆定的移動速度。這張圖片顯示了一個矩形向左移動,並且球在其移動過程中擊中它,這導致90度角。 (它不應該總是90)。

對不起我的蹩腳的照片,我希望他們是有意義的。我的數學是生鏽的,這就是爲什麼我真的需要在正確的方向推動。

+4

什麼是這裏的問題? – 2012-01-03 16:49:48

+1

在此提供一些您的嘗試代碼^ _^ – Gabe 2012-01-03 16:51:39

+1

您是否想要準確的物理或只是比當前行爲「感覺更好」的東西? – Howard 2012-01-03 16:53:39

回答

6

這裏不需要任何花哨的數學。我對這些類型的比賽的理解是球從球拍上脫落的角度取決於球拍在球拍上反彈的位置。如果它在中間彈跳,則保持當前角度。當它靠近槳的邊緣反彈時,角度沿着槳的那一側的方向進行調整。把槳看成圓形的表面。

+0

這不是它在我的世界中的作用。 – 2012-01-03 16:58:48

+0

產生的角度不是基於「槳」的速度嗎? – Kekoa 2012-01-03 17:02:21

+4

記住打乒乓球,即使槳是靜止的,如果球擊中球頭附近,角度受到很大影響。我認爲@Treebranch是對的。我認爲衝擊時槳的運動不會影響它 - 只有在球擊中的位置。 – hatchet 2012-01-03 17:05:47

9

這裏是一些物理學教程(這是你需要知道的),你需要了解矢量。本教程沒有詳細介紹你正在尋找的東西(反射和角度的反映),但這是一個很好的開始,因爲你需要知道所有這些才能完成你的項目。 Game Physics 101

如果您想以簡單的方式執行此操作,here是C++中的代碼,它描述瞭如何執行所需操作。

編輯


你實際上應該檢查出的第二個鏈接第一,它是一個教程,你需要知道什麼。但是如果你想要做的不僅僅是讓球反彈,還要說包括其他運動物體或類似物,請查看第一個鏈接。

+2

+1優秀教程 – Offirmo 2012-01-03 17:10:42

+1

如前所述,優秀教程! – 2012-01-03 17:47:49

+0

在撰寫本評論時代碼已轉換爲JS,我還沒能找到C++版本。 – Funk247 2014-02-17 18:01:00

1

此代碼演示瞭如何拍球通過顛倒球的XYball.headingX=-ball.headingXball.headingY=-ball.headingY回籠或在另一個方向。

把理論到實踐:

/* update ball's x heading */ 
ball.x+=ball.headingX; 

/* update ball's y heading */ 
ball.y+=ball.headingY; 

/* if ball at most right of screen then reverse ball's x heading */ 
if((ball.x>PONG_SCREEN_RIGHT)) 
{ 
    ball.headingX=-ball.headingX; 

} 

/* check if ball's location at top or bottom of screen,if true reverse ball's y heading */ 
if((ball.y<PONG_SCREEN_TOP) || (ball.y>PONG_SCREEN_BOTTOM-2)) 
{ 
    ball.headingY=-ball.headingY; 
} 



/* check if ball lands on pad, if true bounce back */ 
if ((ball.y>= PlayersPad.LEFT) && (ball.y<= PlayersPad.RIGHT) && (ball.x==PlayersPad.x)) 
{ 
    ball.headingX=-ball.headingX; 
    playersScore+=10; 
} 

/* let computer track ball's movement */ 
if (ball.x>PONG_SCREEN_RIGHT-18) computersPad.y=ball.y; 


/* check if ball misses pad, if true display you missed */ 
if (ball.x<PONG_SCREEN_LEFT) 
{ 
    displayYouMissed(); 
    ball.x=ball_Default_X; 
    ball.y=ball_Default_Y; 

} 
+0

這段代碼如何回答這個問題? – Howard 2012-01-03 17:26:04

+0

通過顯示如何用ball.headingX = -ball.headingX和ball.headingY = -ball.headingY來反轉球的標題。 – 2012-01-03 17:33:48

4

去模擬實際的物理路徑(而不是@ Treebranche的答案,這是我覺得那些形式的遊戲真正的工作)可能會非常複雜。你可以考慮摩擦,旋轉,接觸的持續時間等。這裏有一些討論這個的鏈接。

https://physics.stackexchange.com/questions/11686/finding-angular-velocity-and-regular-velocity-when-bouncing-off-a-surface-with-f

https://physics.stackexchange.com/questions/1142/is-there-a-2d-generalization-of-the-coefficient-of-restitution/