Swang开发日志—修复垃圾冲突

如前一篇文章所述,我一直在研究并尝试解决与我所使用的物理引擎(Chipmunk2D)发生过高的碰撞处理问题。 撞到地面时,您通常可能会以怪异的方向弹起,或者失去以前积累的动力。

让我用一个简单的例子说明这个问题:

对于大多数物理引擎来说,此限制是常见的,因为它们使用专门针对凸多边形优化的碰撞检测算法,例如吉尔伯特-约翰逊-基尔蒂距离算法或分离轴定理。 创建凹面形状所需要做的就是使用多边形分解,这意味着您可以将它们分成多个凸面多边形。 这就是导致上面显示的水平地形中所有接缝的原因。

解决方法

那么我们如何处理这个问题呢? 好吧,一种方法是只切换到另一个物理引擎,看看是否能更好地处理这个问题。 但是,就我而言,我非常喜欢Chipmunk2D,因为它与Cocos2D JS附带了C ++绑定,这是我用来构建游戏的框架。 如果我要使用另一个基于JavaScript的纯物理引擎,那么不幸的是,它在移动设备上的运行会不那么顺利。

迷上了这个物理引擎,我想出了另一种方式来表示关卡的地形。 我不使用多边形,而是使用线段跟踪形状的边缘。 这些部分本身不是可碰撞的,而只是充当传感器,以告知玩家何时将与地面接触。

在每一帧的开始时,当玩家的位置尚未更新时,我确定是否要与地面碰撞。 我们可以通过查询物理引擎来做到这一点,即玩家当前位置和下一个位置之间是否有任何线段。 如果即将发生碰撞,我将沿着玩家将与之碰撞的线段的斜率创建一个临时框。 看起来是这样的:

这就是全部! 地面仅在需要时逐步存在,并且严格以凸多边形(在这种情况下为矩形)的形式出现,这意味着不必担心多边形分解及其产生的接缝。

这工作得很好,我很高兴我找到了一个很容易实现的解决方法。 但是,我在Chipmunk2D存储库中创建了一个问题,以查看是否可以在引擎本身中解决此问题。

还值得注意的是,该技术仅适用于如上所示的平滑地形,与尖角碰撞将导致一些问题。 但是我总是可以退一步使用凸多边形来获得更尖的地形。

解决了这个问题后,我已经准备好在游戏的第一组关卡中投入生产了-这就是有趣的部分开始的地方! 哦,我还必须开始学习声音设计,因为这是我尚未研究的游戏开发的重要方面。 下一次更新可能与此有关,但在此之前,请保持良好状态!