碰撞检测代码结构与倾斜的瓷砖

我正在制作一个基于2D瓦片的游戏,我需要帮助进行碰撞检测。 这个问题不是关于在斜坡上给定水平位置的玩家的垂直位置,而是代码的结构。

这里是我的碰撞检测的伪代码:

void Player::handleTileCollisions() { int left = //find tile that's left of player int right = //find tile that's right of player int top = //find tile that's above player int bottom = //find tile that's below player for(int x = left; x <= right; x++) { for(int y = top; y <= bottom; y++) { switch(getTileType(x, y)) { case 1: //solid tile { //resolve collisions break; } case 2: //sloped tile { //resolve collisions break; } default: //air tile or whatever else break; } } } } 

当玩家在倾斜的瓷砖上时,他实际上是在瓷砖本身内部水平的,这样玩家看起来不像是漂浮的。 这就产生了一个问题,因为当一个坚实的正方形瓷砖旁边有一个倾斜的瓷砖时,玩家不能移动,因为这个algorithm解决了与实体瓷砖的任何碰撞。 这是一个显示这个问题的gif:

碰撞问题

那么构建代码的好方法是什么?当玩家在倾斜的瓷砖内时,实体瓷砖会被忽略?

最不能防止的方法就是不要与斜坡下的固体块碰撞。 在所有拼贴块上进行相当简单的遍历可以确定哪些边是“外”边(不与另一个固体边对接的平铺边)和“内”边(直接对应于相邻块的边)。

在你的例子中,实体块至less有两个内边:顶边对着它上面的斜坡的底边,左边与左边的斜边alignment。

您不需要对内边进行碰撞检测。 由于物体必须移动通过相邻的固体块,所以不可能“碰触”内边缘,所以内边缘不能与任何东西碰撞。

您可以将这些内部/外部边缘标志存储为一个简单的位掩码。 0x01作为顶部, 0x02作为右侧, 0x04作为底部, 0x08作为左侧工作正常(你可以设置他们为1为外部或内部为1,无论你喜欢)。 在进行检测时,可以检查位掩码,看是否应该考虑边缘。

请注意,有一个可靠的debugging线绘图工具有助于testing。 在过去的学生项目中,我知道在学校里,我们发现能够打开所有外部边界的绘图,然后closures瓷砖的绘制,使世界变成轮廓vector事物,这是非常有帮助的,甚至是有趣的。 当做更多涉及物理学的时候,为边缘的法线添加一些额外的信息也派上用场。

你也可以做边缘组合。 对于具有相同法线的任意两条边共享一个顶点,可以将它们组合成一个较长的边。 这允许您继续使用拼贴进行编辑,同时使用更多的几何碰撞方法,这也可以解决一些其他潜在的问题,并且如果您想要将拼贴与完整的2D物理结合,可以轻松地与Box2D的边缘链支持相结合发动机。