Почему объекты ускоряются в течение цикла? - PullRequest
1 голос
/ 25 сентября 2019

В моем цикле for есть утверждение, говорящее p.x -= p.vel.Очевидно, это вызывает ускорение объекта для каждого объекта на экране.Если я вытолкну объект из списка, он не так сильно ускоряется, но все же немного ускоряется.Как я могу это исправить?Программа написана с использованием pygame

Игра в основном игра в жанре flappy bird, и ускоряются трубы, но я хочу, чтобы они все время двигались с одинаковой скоростью

Вот класси переменные


    def __init__(self, x, width):
        self.bottom_height = random.randint(50, 400)
        self.top_height = screen_height - 175 - self.bottom_height
        self.width = width

        self.bottom_y = screen_height - self.bottom_height
        self.top_y = 0
        self.x = x

        self.vel = 2.5

        self.pipes = []

Вот функции

    def spawn(self):
        for p in pipe.pipes:
            if bird.x == p.x:
                pipe.pipes.append(Pipe(pipe.x, pipe. width))

    def move(self):
        self.spawn()
        for p in pipe.pipes:
            if 0 - p.width < p.x < screen_width + 50:
                p.x -= p.vel
            else:
                pipe.pipes.pop(pipe.pipes.index(p))

1 Ответ

3 голосов
/ 25 сентября 2019

Скорее всего, ваша проблема здесь:

for p in pipe.pipes:
    if 0 - p.width < p.x < screen_width + 50:
        p.x -= p.vel
    else:
        pipe.pipes.pop(pipe.pipes.index(p))

Вы выполняете итерацию по списку, и, повторяя его, вы удаляете из него элементы.

Возьмите этот пример, полученный изВаш код:

s = [1, 2, 3, 4, 5]
for i in s:
    print(i)
    s.pop(s.index(i))

Что вы ожидаете получить на выходе?Подсказка: это не будет 1 2 3 4 5.

Чтобы исправить это, вы можете либо зациклить список, отследить в другом списке, какие элементы вы хотите удалить и удалить их после цикла, либо зациклить надскопируйте список и удаляйте элементы из оригинала каждый раз, когда вам нужно.

Кроме того, будет быстрее, если вы сохраните индекс удаляемого элемента.

Что-то вроде (не проверено!):

def move(self):
    self.spawn()
    index_to_remove = []
    for i in range(len(pipe.pipes)):
        if 0 - p.width < p.x < screen_width + 50:
            p.x -= p.vel
        else:
            index_to_remove.append(i)
    for index in index_to_remove:
        del pipe.pipes[index]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...