【问题标题】:python pygame physics rectange - circle collisionpython pygame物理矩形-圆碰撞
【发布时间】:2026-02-14 03:00:02
【问题描述】:

这个问题再次出现在 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

我的问题

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

【问题讨论】:

  • “非常慢”是相对的。过早的优化可能会削弱项目。
  • 你签出related questions了吗?
  • @PaulC 如果墙壁较长或矩形的周长较大,游戏的最终帧数可能会变慢.....
  • @martineau 我没有看到有矩形圆碰撞
  • 如果它确实变慢了,并且您对其进行了分析,您可以查看四叉树。但我认为这对你的游戏来说太过分了。

标签: python pygame physics


【解决方案1】:

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

rect.colliderect(rect): Return bool

把它放在代码中的某个地方,如果它返回真,让球爆炸。

【讨论】:

  • @paddila 我知道。您需要使用圆圈的矩形,而不是圆圈本身。
【解决方案2】:

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

您要求精确碰撞,这将为您提供圆形和矩形之间的像素完美碰撞检测。不过,您的游戏中可能不需要它,因此我建议您先尝试使用colliderect。如果您一般对 pygame 中的碰撞检测感兴趣,有很多选项直接在 MaskSprite 文档中描述的函数中实现或基于函数实现。

【讨论】:

    【解决方案3】:

    您可以使用 Rect.collidepoint 与圆的中心,但使 rect 更大

    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
    

    【讨论】: