Answers:
您没有指定是2D还是3D游戏。但是,如果它是2D游戏,并且您的墙保证是水平或垂直的,而您只想从其上弹开物体,则比处理反射要容易得多。
碰到垂直壁时,只需否定对象速度的X分量,或碰到水平壁时就可以否定对象速度的Y分量。例:
if( /* hit vertical wall */ )
{
object.velocity.x *= -1;
}
if( /* hit horizontal wall */ )
{
object.velocity.y *= -1;
}
但是,如果您真的很想知道角度,那么一般而言,反射角与入射角相同。该角度是相对于墙的法线测量的。这是一张清晰的图片:
如果您需要为任意墙处理此问题,则需要研究如何反射向量。它实际上只是一个小公式,它接受墙的法线和入射向量,并为您返回反射向量。这是XNA使用的公式:
public static Vector3 Reflect(Vector3 vector, Vector3 normal)
{
return vector - 2 * Vector3.Dot(vector, normal) * normal;
}
对于2D,您可以执行以下操作:
public static Vector2 Reflect(Vector2 vector, Vector2 normal)
{
return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
if it's a 2D game and your walls are guaranteed to be horizontal or vertical
不正确。答案的第二部分说明了正确的实现。恕我直言,零件的顺序应该颠倒,首先提出一般性解决方案,并以强调的方式提出,而为特殊情况下的简化方案则提出直角解决方案。
这仅是沿着壁法线向量反射向量。