0

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

为了更新位置(垂直运动),我在每次更新中使用基本运动学方程:

  • 位置 = oldPosition + 速度(delta) +1/2(gravity)(delta)^2
  • 速度 = oldVelocity + (gravity)(delta)

出于某种原因,游戏看起来不太逼真。尽管我的重力有多大,但在弧顶附近似乎需要很长时间。如果我想让我的精灵跳相同的高度,但减速和加速更快,但仍然跳得和以前一样高,我应该怎么做?我希望这是有道理的。

4

2 回答 2

1

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

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

然后,您希望通过速度 = old_velocity + 加速度 * 时间来更新角色在 y 方向上的速度。

完成此操作后,您然后以类似的方式更新位置:位置 = old_position + 速度 * 时间。

仅当 delta 是总经过时间而不是时间步长时,您用于更新位置的等式才有效!(我假设 delta 是一个时间步长,因为这就是物理游戏通常的编程方式。)

我希望这有帮助!如果您想了解更多信息,请查看 suvat 方程,如果您知道初始速度和恒定加速度,您可以计算最终位置,因为您的游戏在跳跃和碰撞时速度会发生变化,所以它不现实也就不足为奇了!有更多问题,请发表评论,我会尽力为您提供进一步的帮助。

编辑:我重新编程了你在这里所做的一些使用 OpenGL 绘制的框。您更新职位的方法似乎不起作用。如果 or 时间步长为 1.0d,这些框似乎只会正确落下dt,我不知道为什么。然后,当它们与某物发生碰撞时,它们会一起停止而不是弹跳。我不确定究竟是为什么。

但是,屏幕上还有另一个使用我描述的物理原理的框: v = u + a*t并且s = s_last + v*t 该框完全按照预期落下并正确反弹。由于简化,能量在弹跳中损失。

于 2012-12-29T21:27:56.453 回答
0

您可能更愿意在您的 cocos2d-iphone 游戏中尝试 Box2d 或 Chipmunk 物理引擎,以获得更逼真的效果。另外,它们相对容易实现。

无需制作自己的物理系统——记住让技术为你工作;D

于 2012-12-20T01:03:30.507 回答