Как ускорить или оптимизировать цикл, используемый для обнаружения столкновений с помощью pygame / pytmx? - PullRequest
0 голосов
/ 06 мая 2019

Я использую цикл for в сочетании с .colliderect () для обнаружения столкновений при попытке создать игру с использованием pygame, цикл становится слишком медленным с ~ 340 прямоугольниками стены, мне было интересно, может ли он быть как-то быстрее, потому что он сильновлияет на игровой цикл?

Я пытался использовать координатные точки в разных местах на каждой стене, но работает, только если вы перемещаете определенное количество пикселей за раз, и каждый раз, когда вы вдвое уменьшаете скорость движения, оно увеличивается в четыре раза.количество координатных точек, которые вы сохраняете.

#disregard indent, this is all in an update function that is called every time that a player decides to move.
        self._old_position = self.position
        PlayerRectangle = pygame.Rect(self.position[0]+ x,self.position[1]+y,16,16)
        cwd = os.getcwd()
        tmxData = load_pygame(cwd+"\\Maps\\TestfileMap.tmx")
        movement = True
        for obj in self.walls:                   
                if(pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle)):
                        movement = False
                        self.move_back()
                else:
                        continue
        if movement:
                self.position[0] += x
                self.position[1] += y
                self.stats["position"]=self.position
                self.rect.topleft = self.position
                self.feet.midbottom = self.rect.midbottom

Предоставленный код работает, однако он слишком медленный, мне было интересно, есть ли другой метод обнаружения столкновений или есть способ сделать то, что показанобыстрее, это сильно сковывает вещи.Спасибо

РЕДАКТИРОВАТЬ:

Таким образом, решение было в основном в том, что у меня было load_pygame, который запускался буквально каждый раз, когда он зацикливался, просто удалял строку, которая делает это, и это проясняло вещи намного больше, дляДля дальнейшей оптимизации измените строку, которая делает Rect для каждого объекта, и просто используйте список уже построенных Rects, это ограничивает вызовы функций.

1 Ответ

0 голосов
/ 06 мая 2019

Без минимального рабочего примера сложно дать напористый совет.

Как я уже говорил в комментариях, есть ложный вызов функции «load_pygame», которая, кажется, читает данные файла внутри этого кода -это само по себе может быть причиной вашего замедления.Более того, считанные данные не используются при обнаружении столкновений.

Другой совет, который у меня нет, - это предварительно рассчитать прямоугольники ваших стен в группе спрайтов, вместо создания новых прямоугольников для всех стен в каждойпроверить с: pygame.Rect(obj[0],obj[1],16,16).colliderect(PlayerRectangle)).тогда вы можете использовать метод sprite "spritecollideany" - https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollideany - который должен оптимизировать проверку столкновения прямоугольника.

(Это также потребует, чтобы ваш объект Player был спрайтом, если это еще не сделано).

...