Pygame三角形碰撞检测

Pygame triangle collision detection

我正在尝试为 Pygame 中的游戏进行三角形碰撞检测。 我通过

成功地对我所有的矩形进行了碰撞检测
rect.collidelist(rectlist)

但现在我已经实现了多边形(或更准确地说是三角形),我不能做任何好的碰撞。三角形的碰撞是正方形,所以我现在不知道该怎么办..

在大多数游戏开发框架中,二维碰撞通常以正方形的形式实现。它们被称为 "collision boxes" 或 "hit boxes"。您可以安装 PyGame 扩展程序(例如 Pylygon)来处理多边形碰撞,或者还有一个更简单的解决方案:

在三角形对象上使用多个碰撞框,几个小方块可以将碰撞检测非常接近地映射到实际视觉的轮廓。当然这不会是 "pixel perfect" 但它通常工作得很好,当然如果你需要非常准确的碰撞这种方式不适合它。

这是一张图片来说明我的意思:

所以,如果你想做三角碰撞,可以用这个

要求你的三角形计算碰撞:

  • 3分的位置
  • 三角形的面积

如何计算面积

self.area = abs((self.points[1][0] - self.points[0][0]) * (self.points[2][1] - self.points[0][1]) - (self.points[2][0] - self.points[0][0]) * (self.points[1][1] - self.points[0][1]))

注意:这不是真正的三角形,它只是不除以 2 来节省一点时间

碰撞怎么办

def collision(self, pos):
    area1 = abs((self.points[0][0] - pos[0]) * (self.points[1][1] - pos[1]) - (self.points[1][0] - pos[0]) * (self.points[0][1] - pos[1]))
    area2 = abs((self.points[1][0] - pos[0]) * (self.points[2][1] - pos[1]) - (self.points[2][0] - pos[0]) * (self.points[1][1] - pos[1]))
    area3 = abs((self.points[2][0] - pos[0]) * (self.points[0][1] - pos[1]) - (self.points[0][0] - pos[0]) * (self.points[2][1] - pos[1]))
    areatotal = (area1 + area2 + area3) / 2
    if areatotal == self.area:
        return True

所以,是的,这就是提示,如果您想应用更多种类的东西,请查看:

http://www.jeffreythompson.org/collision-detection/tri-point.php

这个也有解释,大家可以看看,我不太会解释