[英]Breakout paddle collision with angle
我知道互聯網上有很多關於此的東西,我已經看了很多,但是我無法使其與我的代碼一起使用。 我有點了解它背后的數學原理,但是再次努力將其納入代碼中。 我有2個速度變量,用於float xSpeed, ySpeed
。 兩者都等於3(或-3取決於碰撞-我只有基本的碰撞atm)。 我還為ball ballRect
和paddle paddleRect
使用了一個矩形。 我正在這樣更新職位:
ballRect.X += xSpeed; ballRect.Y += ySpeed;
我已經找到了一些代碼,並嘗試自己做,但是它們確實是越野車。 (我認為)第一個擊中將起作用,但是當涉及下一個擊時,它將粘在槳上。
double relativeBallPos = (paddleRect.X + ballRect.X);
double ballVelx = xSpeed;
double ballVely = ySpeed;
double angleRads = Math.Tan((ballVelx / relativeBallPos));
double angleInDeg = angleRads * (180 / Math.PI);
double angleOfReflection = (angleInDeg * 2);
ballVelx = ballVelx * angleOfReflection;
if (ballRect.X + (ballRect.Width / 2) < paddleRect.X + (paddleRect.Width / 2))
{
xSpeed = (float)-ballVelx;
}
else if (ballRect.X + (ballRect.Width / 2) > paddleRect.X + (paddleRect.Width / 2))
{
xSpeed = (float)ballVelx;
}
(這會以(可能不正確的)角度傾斜,並且在第一次打擊后會一直向上傾斜)感謝您的幫助:)
如果您的球與任何水平閾值(磚塊或球拍的水平邊) ySpeed
,請否定ySpeed
。 如果它與任何垂直閾值相交,則取xSpeed
。 在那里,現在您有了功能突破游戲。
您可以根據碰撞沿球的位置來改變球在擊中球時的角度,從而增加一點拋光效果,其中中心為ySpeed
(即ySpeed
取ySpeed
), xSpeed
為距離的正數(正)或負數)到中心的距離。
是的,您所看到的完全是正常現象,如果您的物體移動得非常快而游戲滴答速度很慢,則您可能會遇到一些小故障,例如粘在槳上,甚至完全錯過了槳,然后一直直走。
解決缺少槳的方法是提高游戲的滴答速度,即過程游戲的移動更加頻繁。
可以通過及時回滾物體運動來減輕球對槳的粘性。 例如,您有對象A和B在某個時間點碰撞。 如果簡單地反轉它們的X和Y速度,則可能在下一個時間點再次發生碰撞,因此您將再次反轉它們的速度,依此類推,好像卡住了。 有時它可能卡在一個軸上,因此它將在槳上滑動,然后筆直向下,這只是同一問題的另一個副作用。
如何回滾? 您知道A在哪里移動,並且假設B是一個槳,所以它是靜態的。 您知道A目前正在與B碰撞。 您可以計算A的運動向量,然后將A反向移動到那個向量上。 例如,如果屏幕的左上角是(0,0)
,並且A以X=+10,Y=+10
的速度移動,則可以將其向后移動整個步長或小數步(取決於的復雜程度),因此乘以(-10,-10)
或其中的一部分。 您可以使用相交矩形來計算精確值,並且只能移動足夠遠,以使對象幾乎不接觸。
理想情況下,您將向量從擊球表面反射(使用物理方法,即擊球角=反射角),並在應用新速度之前,以不與球拍碰撞的方式移動球。 為簡化起見,您可以假設擊球表面是水平的並且只是一條直線,因此反射公式非常簡單。
這里很好地涵蓋了該主題(盡管使用XNA,但原理相同):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.