我正在打乒乓球,发现很难编写一种算法来正确地使球从四壁弹回(我将在稍后处理得分,因为只有西+东双方会成为进球)。所以此刻,我希望球在盒子周围弹跳。
检测球是否撞到墙壁很容易,但是我在计算新角度时遇到了麻烦。
到目前为止,这是我想出的:
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继续前进。