您将必须了解法线是什么才能计算 collison 上的反射向量。幸运的是,这并不难理解。对于那里的数学头脑,我会有点不精确,所以请不要因为它而殴打我。:)
法线只是一个与表面正交(成 90 度角)的单位向量(单位:大小 = 1)。您可以将法线可视化为直接伸出曲面的箭头。由于您的墙壁没有倾斜,因此很容易找出它们的法线(假设屏幕的左上角为 0,0):
top: (0,1)
bottom: (0,-1)
left: (1,0)
right: (-1,0)
我们需要做的是获取你的球的速度并沿着你击中的墙壁的法线向量“反射”它。反射公式如下:
V2 = V1 - 2*N*(N.dot(V1))
其中 V1 是您的入射矢量(在这种情况下是您的旧速度),N 是我们撞到的墙壁的法线,V2 是您的反射矢量(您的新速度)。“N.dot(V1)”是N和V1的“点积”,也就是(Nx V1.x + Ny V1.y)。
一张来自 Wikipedia 的图片,展示了我们正在做的事情(P 是入射矢量,Q 是反射矢量):

这是伪代码中的全部内容:
float nx = 0, ny = 1; // replace these with the normal of the wall you hit
float ix = ball.vx, iy = ball.vy; // incident vector
float dotprod = (nx*ix + ny*iy); // the dot product i mentioned earlier
ball.vx = ix - 2*nx*(dotprod);
ball.vy = iy - 2*ny*(dotprod);
让我知道是否有任何不清楚的地方。:) 另外,虽然这对墙壁来说有点矫枉过正,但当你进行球-球碰撞时,你需要计算法线,所以这并不是完全浪费......