pygame 碰撞检测导致我的电脑挂起

pygame collision detection causes my computer to hang

我正在尝试制作一款类似于 agar.io 的游戏。我有一个由玩家控制的斑点。它可以四处走动和吃东西。食物也有不同的 class。创建了 200 个食物实例 class:

def spawn_food(self):
    if len(self.foods) <= 200:
        self.foods.append(Food())

到目前为止一切正常,但是,如果我尝试 运行 所有食物和 blob 之间的碰撞检测,我的整个计算机都会挂起。这是代码:

  def ate(self):
    for food in self.foods:
        if circle_collision(blob, food):
            d.win.set_caption("eating")
        else:
            d.win.set_caption("not eating")

我觉得它正在崩溃,因为 circle_collision 中的计算非常繁重,我每帧运行 200 次。这是 circle_collision 函数

def circle_collision(one, two):
    dx = one.pos[0] - two.pos[0]
    dy = one.pos[1] - two.pos[1]

    distance = math.hypot((dx**2), (dy**2))

    if distance <= (one.radius + two.radius):
        return True
    return False

现在我的问题是如何改进此 circle_collision 功能?另外,有没有办法只检查距离 blob 一定距离内的食物是否发生碰撞,这样就不必检查所有 200 种食物。谢谢

问题是多次调用 set_caption。 window 字幕的更改非常昂贵,每帧要更改 200 次。
在全局范围内的变量中声明当前标题。仅在更改时更新标题。此外,如果检测到碰撞,您可以 break 循环:

current_caption = ""

def ate(self):
    global current_caption

    new_caption = "not eating"
    for food in self.foods:
        if circle_collision(blob, food):
            new_caption = "eating"
            break

    if new_caption != current_caption:
        current_caption = new_caption 
        d.win.set_caption(current_caption)