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)
我正在尝试制作一款类似于 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)