好的2D Platformer物理[关闭]


76

我为Box2D的2D平台游戏者设置了基本的角色控制器,并且我开始对其进行调整以使其感觉良好。物理引擎有很多旋钮需要调整,我不清楚,我是第一次使用物理引擎编写,我应该使用哪种。跳跃应该施加力几次tick吗?一时冲动?直接设定速度?如何在不消除化身的所有摩擦的情况下阻止化身粘在墙上(或者我消除了所有的摩擦,但仅限于空中)?我应该将角色塑造成胶囊吗?有圆角的盒子吗?一个有两个轮子的盒子?只是一个大轮子?我觉得以前一定有人做过!

在网络上,似乎只有很少的资源不是“婴儿的第一物理学”,这一切都切断了我希望有人已经解决了这些问题的地方。用于平台游戏的物理引擎的大多数示例都具有浮动感控件,空中跳跃或当临时穿透力过高时容易利用的行为等。

我的意思的一些例子:

  • 轻按一下跳会跳很短距离;长按会跳得更高。
  • 高速停止或反转方向时打滑短。
  • 稳定地站在斜坡上(但在避开时可能会滑下)。
  • 使用模拟控制器时的模拟速度。
  • 所有其他将优秀平台游戏者与劣质平台游戏者区分开的事物。
  • 我敢说,稳定的移动平台吗?

我并不是真正在寻找“嘿,这样做”。显然,正确的做法取决于我在游戏中想要的东西。但是我希望某个地方的人经历了各种可能性,并说“技术A的X很好,技术B的Y很好,但是不适用于C”,或者除了“如果(key = = space)character.impulse(0,1)“

Answers:



25

使用真正的物理引擎来实现“类似于马里奥”的物理非常棘手。

上一次我尝试使用花栗鼠(Chipmunk)进行建模时,将播放器建模为2个圆圈-在“脚圆圈”上方的“身体圆圈”

“脚圈”有些摩擦,没有弹性,而且很小。“体圈”更大且无摩擦,以避免粘在墙壁/陡峭的斜坡上

该对象被限制为不允许旋转-它只会在周围滑动

如果“脚”接触到某物,或者在最后几帧之内(以允许跌倒),则认为该玩家在地面上(也可能进行了表面法线检查)

自从我看了一段代码以来已经有一段时间了,但是其行为大致如下:

在地面上时:

  • 施加“附加重力”(向下的力以帮助下坡)
  • 施加地面摩擦(更大程度的水平阻尼)
  • 根据控件施加左右移动力。
  • (按接近最大运行速度的比例减小左/右移动力)
  • 如果按下跳跃,则施加向上的脉冲

在空中时:

  • 施加空气阻力(少量水平阻尼)
  • 施加常规(或减小的)重力
  • 如果允许空中控制,请施加左右移动力

您必须在两种状态之间进行切换时要格外小心-记住,在斜坡上奔跑时,您可能会离开地面几帧-您可能不想在此状态下切换状态/禁止跳跃

但是,还需要注意其他一些事情……“跳入式”平台可能难以实现,并且当您开始做有趣的事情(移动平台,旋转世界等)时,您必须小心谨慎确保玩家不会被任何“动画驱动”的移动物体困住/压碎。


我知道这是一个很老的答案,但是对此我有一些疑问。1)您如何解决“无论您在什么地形坡度上都保持相同的速度”?2)如果您在脚上使用一个小圆圈而在身体上使用一个较大的圆圈,那么播放器会不会有些时候挂在边缘上?我真的对您的方法感兴趣。
Notbad 2012年

18

老实说,对于具有超严格要求的大小领域的东西,我不认为使用物理引擎是正确的方法。

自己写吧。通过说“按住跳动按钮y时将字符以这种抛物线形状向上移动x个单位”将获得更好的结果,而不是使用一堆旋钮进行调整。


我过去已经做过几次了。它可以工作到一定程度,但是您总是最终会抛出其他东西,因为用hacky控制器正确地进行物理操作“太困难了”。在这个特定的游戏中,我希望为玩家的运动提供一些弹簧/绳索机制,并且涉及到“我宁愿破解一个真正的物理引擎”而不是“我宁愿破解一个盒子”动子”。

3
我宁愿破解一个盒子移动器,至少它不会变得不稳定,而如果您对它施加过多的力,则物理引擎往往会爆炸,因为您需要将运动限制为精确的规格(并且物理引擎约束仍然存在)如果太严格,他们只能尝试遵守那么多)。而且,施加力量解决一个不希望的问题往往会影响其他所有事情,从而导致调整者陷入困境。
Kaj 2010年

10

我写了一系列有关使用现代技术从头开始构建平台游戏的文章,其中包括如何处理简单的物理学:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

但是,如果您想要更多高科技产品,则完全可以使用完整的物理引擎来解决。这是您可以使用的技术(来自Little Big Planet),它使玩家角色成为物理引擎的完全集成的一部分:

您可以施加约束来控制角色,而不是施加脉冲或设置速度来移动玩家作为物理引擎的“外部输入”。

因此,此约束将具有玩家期望的速度和方向作为输入(来自游戏),并将对诸如玩家的最大力量和速度之类的东西进行建模。约束将尝试根据其输入(并遵守最大值)移动玩家,并且由于其约束,它将对玩家站立的对象施加相等且相反的力,从而允许玩家站在移动的平台上并影响他移动的事物。

做这样的事情意味着您可以使玩家完全自然地能够应对诸如处于沉重的盒子之下或在多个移动平台上跳跃的情况,因为他现在已经是物理引擎的核心部分。

希望有帮助!

干杯,保罗。


6

这个问题已经在Box2D论坛上进行了重要讨论。通过阅读有关角色移动,跳跃或平台游戏的讨论,您会遇到每一个可能的问题。但是,问题变得非常复杂,以至于更新了碰撞过滤系统,并创建了一个“测试床”示例来专门说明应如何进行操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.