Pygame удалить объект
Мне нужна помощь в удалении объекта, и я имею в виду удаление, а не рисование или другие вещи. Мой код до сих пор:
Вот что делает мой игрок и враг:
Так что да, именно так я делаю свои пули, игрока и врагов. Пожалуйста, игнорируйте остальное, это необходимо, потому что в моем сообщении много кода.
Привет привет привет
4 ответа
Лучший способ решить вашу проблему — научиться использовать объекты Sprite в пигейм. Вместе с объектами Group они уже могут делать то, что вы хотите, прямо из коробки.
Короче говоря, ваш «враг» должен быть экземпляром некоторого подкласса Sprite , и вы должны добавить его к экземпляру Group (вместо того, чтобы создавать свой собственный enemy_list ). Когда вы хотите, чтобы враг умер, вы можете вызвать для него метод kill() , который удалит его из Group . Это служит для удаления его из игры, поскольку вы должны использовать методы объекта Group для обновления и отрисовки всех содержащихся в нем спрайтов (но не тех, которые были уничтожены).
Было бы полезно изучить спрайты и группы спрайтов для отслеживания сущностей в вашей игре. . В них встроено множество функций, которые упрощают работу.
Вот демонстрация, которая группирует спрайты, удаляя те, которые сталкиваются с указателем мыши:
Нажатие кнопки мыши создает больше спрайтов, а нажатие клавиши пробела рандомизирует их положение.
Метод update() спрайта пули регулирует положение спрайта по его скорости, например. self.rect.x += SPEED , и вам нужно будет вызывать метод .update() группы спрайтов пули в каждом игровом цикле.
Итак, у вас есть список вражеских позиций в enemy_list . Это хорошее начало. Я не вижу bullet_list , поэтому буду предполагать только одну пулю за раз, расположенную в точках b_x , b_y .
Таким образом, основной цикл этой программы может выглядеть примерно так:
Где столкновение с противником и удаление списка может выглядеть примерно так, как показано ниже. (Я пытался максимально соответствовать внешнему виду вашего кода.)
Мы делаем итерацию по списку врагов, проверяя наличие коллизий. Как только попадание найдено, он сохраняет индекс того, какой враг был поражен, и останавливает цикл.
Следующим шагом будет удаление врага из списка. Я написал это в отдельном блоке, а не перед break в цикле. Это связано с тем, что при изменении списка во время его повторения могут возникнуть неожиданные результаты. В этом конкретном случае это было бы нормально, но новичку следует опасаться этого.
Я предполагаю, что на экране одновременно отображается только один маркер, поскольку вы не упомянули список маркеров. Вы, вероятно, создаете пулю, ударяя по пробелу или чему-то еще, что я здесь не упомяну. Одна вещь, которую следует учитывать в вашей функции bullets() , это то, что вы выполняете перемещение, рисование и проверку на столкновение в одной и той же функции. Обратите внимание: всегда полезно сделать так, чтобы функция выполняла только одну функцию.
Итак, чтобы создать пулю, у вас должна быть логическая переменная create_bullet . Так:
Вы говорите, что хотите удалить его, а не просто рисовать поверх него. Однако способ, которым pygame генерирует «движущийся/подобный видео» экран, заключается в непрерывном рисовании. Например: игрок рисуется в (10, 10), а затем рисуется в (20, 10), поэтому кажется, что игрок переместился. Однако это делается очень быстро, поэтому вы не видите, как он «исчезает» и «появляется снова». Итак, вот что делает приведенный выше код.
Когда нажат пробел, он «создает» пулю, устанавливая ее значения x и y в текущую позицию игрока и задавая create_bullet = true. Затем на каждой итерации основного цикла, если create_bullet имеет значение true, он перемещает, а затем рисует маркер. Если пуля выйдет за пределы экрана или столкнется с противником, create_bullet = False, тогда она перестанет ее рисовать и на следующей итерации основного цикла пуля будет отрисована фоном и «исчезнет».
Pygame удалить объект
Мне нужна помощь в удалении объекта, и я имею в виду удаление, а не рисование или другие вещи. Мой код до сих пор:
Вот что делает мой игрок и враг:
Так что да, именно так я делаю свои пули, игрока и врагов. Пожалуйста, игнорируйте остальное, это необходимо, потому что в моем сообщении много кода.
Привет привет привет
Лучший способ решить вашу проблему — научиться использовать Sprite объекты в pygame . Вместе с Group объектами они уже могут делать то, что вы хотите, прямо из коробки.
Короче говоря, ваш «враг» должен быть экземпляром некоторого Sprite подкласса, и вы должны добавить его к экземпляру Group (а не создавать свой собственный enemy_list ). Когда вы хотите, чтобы враг умер, вы можете вызвать для него kill() метод, который удалит его из файла Group . Это служит для удаления его из игры, поскольку вы должны использовать методы Group объекта для обновления и отрисовки всех содержащихся в нем спрайтов (но не тех, которые были убиты).
Было бы полезно изучить Sprites и SpriteGroups для отслеживания сущностей в вашей игре. В них встроено множество функций, которые упрощают работу.
Вот демонстрация, которая группирует спрайты, удаляя те, которые сталкиваются с указателем мыши:
Нажатие кнопки мыши создает больше спрайтов, а нажатие клавиши пробела рандомизирует их положение.
Метод update() спрайта пули регулирует положение спрайта по его скорости, например, self.rect.x += SPEED и вам нужно будет вызывать .update() метод группы спрайтов пули в каждом игровом цикле.
Итак, у вас есть список вражеских позиций в enemy_list . Это хорошее начало. Я не вижу bullet_list , поэтому я буду предполагать только одну пулю за раз, расположенную в b_x , b_y .
Таким образом, основной цикл этой программы может выглядеть примерно так:
Где столкновение с противником и удаление списка может выглядеть примерно так, как показано ниже. (Я пытался максимально соответствовать внешнему виду вашего кода.)
Мы делаем итерацию по списку врагов, проверяя наличие коллизий. Как только попадание найдено, он сохраняет индекс того, какой враг был поражен, и останавливает цикл.
Следующим шагом будет удаление врага из списка. Я написал это в отдельном блоке, а не помещал перед break циклом. Это связано с тем, что при изменении списка во время его повторения могут возникнуть неожиданные результаты. В этом конкретном случае это было бы нормально, но новичку следует опасаться этого.
Я предполагаю, что на экране одновременно отображается только один маркер, поскольку вы не упомянули список маркеров. Вы, вероятно, создаете пулю, ударяя по пробелу или чему-то еще, что я здесь не упомяну. Одна вещь, которую следует учитывать в вашей bullets() функции, это то, что вы выполняете перемещение, рисование и проверку на столкновение в одной и той же функции. Обратите внимание: всегда полезно сделать так, чтобы функция выполняла только одну функцию.
Итак, чтобы создать пулю, у вас должна быть логическая create_bullet переменная. Так:
вы говорите, что хотите удалить его, а не просто рисовать поверх него. Однако способ, которым pygame генерирует «движущийся/видеоподобный» экран, заключается в непрерывном рисовании. Например: игрок рисуется в (10, 10), а затем рисуется в (20, 10), поэтому кажется, что игрок переместился. Однако это делается очень быстро, поэтому вы не видите, как он «исчезает» и «появляется снова». Итак, вот что делает приведенный выше код.
Когда нажата клавиша пробела, он «создает» пулю, устанавливая ее значения x и y в текущую позицию игрока и задавая create_bullet = true. Затем на каждой итерации основного цикла, если create_bullet имеет значение true, он перемещает, а затем рисует маркер. Если пуля выйдет за пределы экрана или столкнется с противником, create_bullet = False, тогда она перестанет ее рисовать и на следующей итерации основного цикла пуля будет перерисована фоном и «исчезнет».
How to completely remove/destroy a Sprite (Pygame) object from the game screen/memory?
![]()
Found out that .remove() and .kill( ) methods only remove a sprite object from goups of sprites. But what if a have only 1 sprite on the screen and it's not included in any gooup??
![]()
What are you trying to accomplish? The remove() and kill() methods are just for group management. If you have an image blitted to the screen and you want to get rid of it, you'll have to draw something else over it (like, draw the background over it again).
If you want the sprite out of memory you can just remove all references to it (using del or something) and the python garbage collector will take care of it. This doesn't affect stuff you've already blitted though.