python pygame物理矩形 - 圆形碰撞

时间:2013-01-05 16:32:04

标签: python pygame physics

此问题再次出现在PyParticles4上 Link to last question for reference

评论如果不清楚......

我正在制作一个射击游戏,就像this一样,但是在一个平坦的土地上,每一个转弯都会改变它的高度(游戏中有趣的东西)和2个玩家,每个都有一个可以在每个转弯处移动一些距离(有一个限制,并且它们不能从其起始位置移动超过一定量)的加农炮(玩家决定他是否希望移动)。

到目前为止我的代码(对于子弹和射手)

class Bullet(PyParticles.Particle):
    def hit(self,shooterlist):
        for shoot in shooterlist:
            #confusion
            dist = math.hypot(dx,dy)
    # other funcs to added
class Shooter:
    def __init__(self,pos,size):
        self.rect = pygame.Rect(pos,size)
    # other funcs to added

我的问题

子弹与射手的碰撞。关于如何知道子弹与矩形碰撞的任何想法?
有人建议我查看矩形边缘的所有点,看看它是否在圆圈内,但看起来很慢。
我认为更快的东西会更好..
..
..
更新
圆圈周围可以有一个矩形,如果与矩形相撞,我现在知道矩形接近圆圈,甚至可能触摸它。我如何向前移动?(Thx to PygameNerd)

3 个答案:

答案 0 :(得分:1)

我不确定你的问题是什么意思,但我认为你需要colliderect函数。

rect.colliderect(rect): Return bool

将它放在某处的代码中,如果它返回true,则让球爆炸。

答案 1 :(得分:1)

每次colliderect返回true时,您都可以运行另一个测试。该测试可以有几种选择。一个类似于你已经收到的建议但是墙壁和圆圈已经切换。检查圆周上的点,看看是否有一个点使用Rect.collidepoint与墙碰撞。在pygame中,您可以通过从圆形表面创建Mask并运行Mask.outline来获取圆周点列表。你可能不需要每一点,所以你可以得到每一个点。实际上,您可能只需要圆的rect的边缘的中点,您可以从Rect对象本身获得。

您要求进行精确碰撞,这样可以在圆形和矩形之间进行像素完美碰撞检测。但是,你可能不需要在游戏中使用它,所以我建议先尝试colliderect。如果您对pygame中的碰撞检测感兴趣,那么有很多选项可以直接在MaskSprite文档中描述的函数中实现或基于这些函数。

答案 2 :(得分:0)

您可以将Rect.collidepoint与圆心一起使用,但使矩形更大

collide_rect = Rect(x - p.radius,y - p.radius,w + 2 * p.radius,h + 2 * p.radius)
if collide_rect.collide_point(p.pos):
    # Collision Resolution