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
这个也有解释,大家可以看看,我不太会解释
我正在尝试为 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
这个也有解释,大家可以看看,我不太会解释