Pygame 命中框相互碰撞检查列表只检查列表中的最后一个框

Pygame collision checking lists of hit boxes against each other only checks the last box in the list

我正在 pygame 编写游戏代码,我的实体对象具有命中框的属性列表。

所有的命中框都是 pygame.rect 对象,当我将它们绘制在屏幕上时,它们都会显示出来,但由于某些原因,只有当列表中的最后一个命中框发生碰撞时,这些对象才会表现得像它们发生碰撞一样与其他对象列表中的最后一个命中框。

这是我用来检查的方法:

def collide_check(self, obj):
    self.update_hit_boxes()
    obj.update_hit_boxes()
    is_collide = False
    if self.can_collide and obj.can_collide:
        for box in self.hit_boxes:
            for obj_box in obj.hit_boxes:
                is_collide = box.colliderect(obj_box)
                if is_collide:
                    break
    else:
        is_collide = False
    return is_collide

任何人都知道我在这里做错了什么,或者仅使用 pygame.rect 个对象和 pygame.rect.collide_rect 是否有可能做到这一点?

我无法测试它,但问题可能是因为 break 只能退出 last/inner for-loop - 所以代码仍然运行外部 for-loop可以重新设置is_collide = False(因为它运行is_collide = box.colliderect(obj_box))。最后它只有在最后一个盒子发生碰撞时才会得到 is_collide = True

你应该在不赋值给变量的情况下检查碰撞,并且只在 if`

内部赋值变量
                if box.colliderect(obj_box):
                    is_collide = True
                    break

而不是

                is_collide = box.colliderect(obj_box)
                if is_collide:
                    break

Ot 将两个 for 循环放在单独的函数中并使用 return True 而不是 break

def test(obj1, obj2):
    for box1 in obj1.hit_boxes:
        for obj2 in obj2.hit_boxes:
            if box1.colliderect(box2):
                return True
    return False

def collide_check(self, obj):
    self.update_hit_boxes()
    obj.update_hit_boxes()
    is_collide = False
    if self.can_collide and obj.can_collide:
        is_collide = test(self, obj)
    return is_collide

编辑:

你可以直接在原函数中使用return

def collide_check(self, obj):
    self.update_hit_boxes()
    obj.update_hit_boxes()

    if self.can_collide and obj.can_collide:
        for box in self.hit_boxes:
            for obj_box in obj.hit_boxes:
                if box.colliderect(obj_box):
                    return True

    return False