Обнаружение столкновений с помощью Pygame приводит к зависанию моего компьютера - PullRequest
2 голосов
/ 20 февраля 2020

Я пытаюсь сделать игру похожую на agar.io. У меня есть блоб, который контролируется игроком. Он может передвигаться и есть пищу. Есть и другой класс для еды. Создается 200 экземпляров класса еды:

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

Все до тех пор, пока все работает нормально, однако мой компьютер зависает, если я пытаюсь запустить обнаружение столкновений между всеми продуктами и каплей. Это код:

  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 ед. Спасибо

1 Ответ

2 голосов
/ 20 февраля 2020

Проблема заключается в нескольких вызовах на set_caption. Изменение заголовка окна очень дорого, и вы делаете это 200 раз за кадр.
Укажите текущий заголовок в переменной в глобальной области видимости. Обновляйте заголовок только при его изменении. Кроме того, вы можете break l oop, если обнаружено столкновение:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...