箱子碰撞检测和弹跳

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

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

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

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。

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

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

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

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

关于使用jbx的梯度方法的智慧之言。 如果球击中框的角落附近,而dx将被反转,dy可以将球放在顶部边界上方。

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

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

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