箱碰撞检测和弹跳

时间:2010-12-29 00:02:17

标签: java collision-detection bounce

我正在制作乒乓球,并且发现很难编写一种能够将球从四面墙上弹回的算法(我将在稍后处理得分,因为只有西部+东部的一部分将成为目标) 。所以此刻我想让球在盒子周围反弹。

检测球是否撞墙很容易,但我在计算新角度时遇到了麻烦。

这是我到目前为止所提出的:

        if(dstY == 0) {
            // North wall
            if(angle < 90) {
                newAngle = angle + 90;
            } else {
                newAngle = angle - 90;
            }
        } else if(dstX == maxWidth) {
            // East wall
            if(angle < 90) {
                newAngle = angle + 270;
            } else {
                newAngle = angle + 90;
            }
        } else if(dstY == maxHeight) {
            // South wall
            newAngle = angle + 90;
        } else if(dstX == 1) {
            // West wall
            if(angle < 270) {
                newAngle = angle - 90;
            } else {
                newAngle = angle - 270;
            }
        }

这只适用于大约一半的碰撞,看起来真的很难看。我确信这应该非常简单,之前已经做了很多次。

在我的代码中,dstX / dstY是X / Y目标坐标。左上角X = 0,y = 0。

4 个答案:

答案 0 :(得分:1)

在这个KineticModel中,方法collideWalls()使用二维矢量运算来简化粒子与平面之间弹性碰撞的模拟。

答案 1 :(得分:1)

你可以通过两种方式来看待这个:

角度:如果您知道球碰撞的角度,只需执行180°角度即可找到新角度。

渐变:可能更简单。你必须每隔t毫秒将球移动一定的dY和dX。因此,如果你碰壁,你可以简单地使用dY和dX的反转标志。例如,如果你碰到了右边的墙,那么dX会变成-dX,而dY会继续它的路线。

答案 2 :(得分:0)

关于使用jbx渐变方法的智慧之词。如果球击中了球的角落附近,而dx将被反转,则dy可以将球置于顶部边界之上。

答案 3 :(得分:-1)

谢谢@jbx,我知道有一种更简单的方法:)但是,这似乎不适用于东西墙和桨(如果它们在那些墙上)。这似乎对我在东西墙上有用:

(180 - (angle + 90)) - 90.

简化为(180-angle)。 希望有所帮助。