游戏物理 - 不是很像生活

时间:2012-12-19 23:51:19

标签: iphone cocos2d-iphone sprite physics game-physics

在一个简单的游戏(cocos2d)中,我制作了一个小型物理引擎来移动一个精灵,以便它可以跳跃并站在平台上等。

要更新位置(垂直移动),我在每次更新中都使用基本的运动学方程式:

  • position = oldPosition + velocity(delta)+1/2(gravity)(delta)^ 2
  • velocity = oldVelocity +(gravity)(delta)

出于某种原因,游戏看起来并不像生活。尽管我引力很大,但似乎需要很长时间才能靠近弧顶。如果我希望我的精灵跳到相同的高度,但减速和加速更快,但仍然像以前一样跳高,我应该怎么做?我希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

这里的问题是你的物理错误!但这没关系,因为它很容易解决。

在精灵位置上调用更新方法时,首先应设置加速度。我认为引力是这个游戏的常数,所以你只需要设置一次。 (-9.81,或类似的东西。)

然后你想通过velocity = old_velocity + acceleration * time来更新y方向上角色的速度。

完成此操作后,您将以类似的方式更新位置:position = old_position + velocity * time。

用于更新位置的公式仅在delta为总耗用时间而非时间步长时才有效! (我假设delta是一个时间步,因为这就是物理游戏通常被编程的方式。)

我希望这有帮助!如果你想了解更多信息,请查看suvat方程式,如果你知道初始速度和恒定加速度,你会看到你可以计算最终位置,你的游戏在跳跃和碰撞时的速度会变化,所以它并不奇怪,这是不现实的!还有其他问题,请发表评论,我会尽力帮助您。

编辑:我使用OpenGL绘制的一些框重新编程了你在这里做了什么。您更新位置的方法似乎不起作用。如果dt或时间步长为1.0d,则框似乎只能正确落下,我不知道为什么。然后,当他们碰到某些东西时,他们会一起停下而不是弹跳。我不确定为什么。

然而,我在屏幕上还有另一个框,它使用我描述的物理: v = u + a*ts = s_last + v*t 该框完全按预期落下并正确弹跳。由于简化,在弹跳中会消耗能量。

答案 1 :(得分:0)

您可能更喜欢在cocos2d-iphone游戏中试用Box2d或Chipmunk物理引擎,以获得更逼真的效果。此外,它们相对容易实施。

无需制作自己的物理系统 - 记得让技术为您服务; D