Java 盒碰撞检测与弹跳

Java 盒碰撞检测与弹跳,java,collision-detection,bounce,Java,Collision Detection,Bounce,我在打乒乓球,我发现很难写出一个能把球从四面墙上弹下来的算法(我稍后会处理得分问题,因为东西双方只有一部分是进球)。所以现在我想让球在禁区内反弹 检测球是否撞到墙很容易,但我在计算新角度时遇到困难 这就是我到目前为止的想法: if(dstY == 0) { // North wall if(angle < 90) { newAngle = angle + 90; } el

我在打乒乓球,我发现很难写出一个能把球从四面墙上弹下来的算法(我稍后会处理得分问题,因为东西双方只有一部分是进球)。所以现在我想让球在禁区内反弹

检测球是否撞到墙很容易,但我在计算新角度时遇到困难

这就是我到目前为止的想法:

        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;
            }
        }
if(dstY==0){
//北墙
如果(角度<90){
新角度=角度+90;
}否则{
新角度=角度-90;
}
}else if(dstX==maxWidth){
//东墙
如果(角度<90){
新角度=角度+270;
}否则{
新角度=角度+90;
}
}否则如果(dstY==最大高度){
//南墙
新角度=角度+90;
}else if(dstX==1){
//西墙
如果(角度<270){
新角度=角度-90;
}否则{
新角度=角度-270;
}
}
这只适用于大约一半的碰撞,看起来非常难看。我相信这应该非常简单,而且以前已经做过很多次了


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

在这种情况下,该方法使用二维矢量算法简化粒子与平面之间弹性碰撞的模拟。

您可以从两个方面来了解这一点:

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


梯度:可能更简单。你必须每隔t毫秒以一定的dY和dX移动球。因此,如果你撞到墙上,你可以简单地玩dY和dX的反转符号。例如,如果你撞到了右边的墙,dX变成了-dX,而dY继续它的进程。

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

谢谢@jbx,我知道有一个更简单的方法:)然而,这似乎不适用于东西墙和桨(如果它们在那些墙上的话)。尽管如此,这似乎对我在东墙和西墙上都有效:

(180 - (angle + 90)) - 90.
简化为
(180角)

希望有帮助。

你能描述一下它是如何失败的吗?如果球正好打在角落里会发生什么?这不是简化的方法。