【发布时间】:2013-12-18 18:11:39
【问题描述】:
所以现在我正在尝试让我的游戏有一些流畅且易于制作的碰撞。我想要做的是让游戏一次添加一个向量的每个维度,所以如果只有 X 值可以改变,那么它只会在 X 值上改变。示例代码如下。
代码注释:
- 使用 C# 和添加的 XNA 库。
- IsCollision 方法查看输入的两个模型是否在彼此内部。
- 播放器模型只是一个盒子,地板只是一个地板。
- X、Y 和 Z 是摄像机位置,lookAt Vector 是摄像机正在查看的位置。
- 范数向量被添加到 X、Y、Z 和 lookAt 以创建运动。
- 游戏是 3D 的。
代码:
//Forward movement
if (key.IsKeyDown(Keys.W) || pad1.ThumbSticks.Left.Y >= 0.2)
{
//Check X axis
playerCollisionMatrix = Matrix.CreateTranslation(new Vector3(X - 10, Y - 10, Z - 10) + (norm + new Vector3(Vector3.Normalize(lookAt).X, 0, 0) / 10));
if (!IsCollision(playerModel, playerCollisionMatrix, floor, floorMatrix)) norm += new Vector3(Vector3.Normalize(lookAt).X, 0, 0) / 10;
//Check Y axis
playerCollisionMatrix = Matrix.CreateTranslation(new Vector3(X - 10, Y - 10, Z - 10) + (norm + new Vector3(0, Vector3.Normalize(lookAt).Y, 0) / 10));
if (!IsCollision(playerModel, playerCollisionMatrix, floor, floorMatrix)) norm += new Vector3(0, Vector3.Normalize(lookAt).Y, 0) / 10;
//Check Z axis
playerCollisionMatrix = Matrix.CreateTranslation(new Vector3(X - 10, Y - 10, Z - 10) + (norm + new Vector3(0, 0,Vector3.Normalize(lookAt).Z) / 10));
if (!IsCollision(playerModel, playerCollisionMatrix, floor, floorMatrix)) norm += new Vector3(0, 0, Vector3.Normalize(lookAt).Z) / 10;
}
显然不止一个,每个方向一个。但我想知道这是最好的方法,还是有另一种更好的方法?
更多代码和信息可根据要求提供。
【问题讨论】: