我正在制作乒乓球,并且发现很难编写一种能够将球从四面墙上弹回的算法(我将在稍后处理得分,因为只有西部+东部的一部分将成为目标) 。所以此刻我想让球在盒子周围反弹。
检测球是否撞墙很容易,但我在计算新角度时遇到了麻烦。
这是我到目前为止所提出的:
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。
答案 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)
。
希望有所帮助。