最近我一直试图创造一些我一直想要的东西,但从未有过技巧和时间 - 计算机游戏。更准确地说,是我最喜欢的游戏之一的致敬/克隆。首先,我决定创建一个基于Castlevania系列的经典2D平台。
作为Ruby程序员,我决定使用Gosu。然后我决定不想重新发明轮子,所以我将使用Chipmunk。
几天后,我最终遇到了无法解释的碰撞检测问题。我添加了边界框绘图功能,只是为了看看到底发生了什么。
正如你所看到的,贝尔蒙特与他不是非常接近的墙壁相撞。由于gosu gem附带的演示游戏工作正常,我一定有些不对劲,我可能不会真正了解如何定义多边形Shape
并将其添加到空间中。我很确定这不是我画的地方。
游戏中有一个公共回购,因此您可以看到墙(Brush < Entity
)和玩家(Player < Entity
)是如何定义的,并且它们确实具有简单的矩形多边形形状。墙没有添加到空间(他们是流氓),只有玩家是。我已经尝试调试游戏,看看body
位置在哪里,但一切都很好。
https://github.com/ellmo/castellvania
玩家缓慢下降,但你可以用向上/向左/向右箭头控制他。 Tilde按钮(~
)显示boudning框,碰撞框应始终可见。
我需要一些帮助,试图了解我做错了什么。
答案 0 :(得分:0)
我可能并不真正了解如何定义多边形形状并将其添加到空间中。我很确定这不是我画的地方。
就是这样。形状坐标被添加到身体位置,而不是从身体位置减去。
在Entity.boundaries
替换
verts << CP::Vec2.new(@shape.body.p.x - @shape[vert].x, @shape.body.p.y - @shape[vert].y)
与
verts << CP::Vec2.new(@shape.body.p.x + @shape[vert].x, @shape.body.p.y + @shape[vert].y)
你会得到正确的照片。 (绘图仍然会被打破,但边界框将是正确的。