游戏中的重力如何处理移动物体(例如玩家,怪物或物体)与地面之间的关系? 玩家是否会不断地“掉进”地面并被弹回来?
我发现有两种反应碰撞的方法:将玩家移回到碰撞前的位置,以及在移动前测试新位置是否会导致碰撞,但我不知道这两种方法如何处理需要抬起玩家的上升平台。 我从2D游戏设计的角度看待这个问题,但我想3D游戏设计也会遇到同样的问题。 有什么提示吗? 有哪些参考资料我应该查看? 谢谢。
游戏中的重力如何处理移动物体(例如玩家,怪物或物体)与地面之间的关系? 玩家是否会不断地“掉进”地面并被弹回来?
我发现有两种反应碰撞的方法:将玩家移回到碰撞前的位置,以及在移动前测试新位置是否会导致碰撞,但我不知道这两种方法如何处理需要抬起玩家的上升平台。 我从2D游戏设计的角度看待这个问题,但我想3D游戏设计也会遇到同样的问题。 有什么提示吗? 有哪些参考资料我应该查看? 谢谢。
您可能想查看GameDev.net的重力常见问题解答以获取一些基本信息。
由于您正在制作游戏而不是高度精确的物理建模,因此我们可以使用欧拉积分。如果您对准确性的需求增加,则我看到使用最多的积分方法是龙格-库塔(RK4)积分。您很可能不需要这些简单的游戏,但它们绝对用于更高级的物理模拟和3D游戏中。使用RK4的缺点是稍微增加了复杂性和略慢。它非常准确,但现在让我们坚持好老的欧拉。
我问了一个类似的问题“如何将重力应用于我的弹跳球游戏”,并得到了几个很好的答案。首先,您需要为游戏选择任意的重力常数。在我的弹跳球应用程序中,我使用默认重力常数为2000px / s。您将希望尝试这种重力常数,以获得特定游戏所需的效果。
接下来,您需要确保独立渲染游戏并更新游戏对象。这是为了防止游戏内物体在快速计算机上移动得非常快,在慢速计算机上移动得非常慢。您希望物体移动的物理和速度与计算机速度无关。有一篇很好的文章介绍了这方面的内容:游戏物理学:修复您的时间步长!。private long previousTime = System.currentTimeMillis();
private long currentTime = previousTime;
public void updateGame()
{
currentTime = System.currentTimeMillis();
float elapsedSeconds = (currentTime - previousTime) / 1000f;
foreach(GameObject gameObject in gameObjects)
{
// Apply gravity to velocity vector
gameObject.velocity.y += (gravityConstant * elapsedSeconds);
// Move objects x/y position based off it's velocity vector
gameObject.position.x += (gameObject.velocity.x * elapsedSeconds);
gameObject.position.y += (gameObject.velocity.y * elapsedSeconds);
}
checkCollisions();
previousTime = currentTime;
}
关于这个主题最全面的教材之一是Christer Ericson的实时碰撞检测(Realtime Collision Detection)。他还有一个配套博客。Eric Lengyel的3D游戏编程和计算机图形学数学基础(Mathematics for 3D Game Programming and Computer Graphics)也很有用。
我不是专门的游戏程序员,但这是我的理解: