簡體   English   中英

帶角度的爆發式槳葉碰撞

[英]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 (即ySpeedySpeed ), 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM