【问题标题】:pygame collision detection causes my computer to hangpygame 碰撞检测导致我的电脑死机
【发布时间】:2020-02-20 15:36:56
【问题描述】:

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

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 函数?此外,有没有一种方法可以只检查与斑点有一定距离的食物的碰撞,所以它不必检查所有 200 种食物。谢谢

【问题讨论】:

    标签: python optimization pygame collision-detection


    【解决方案1】:

    问题是多次调用set_caption。更改窗口标题非常昂贵,每帧要执行 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多