Pygame delete object
I need help deleting an object, and I mean delete, not draw over or other things. My code so far:
Here is what makes my player and enemy:
4 Answers 4
The best way to solve your issue is to learn how to use Sprite objects in pygame. Together with Group objects, they can already do what you want, right out of the box.
In brief, your "enemy" should be an instance of some Sprite subclass, and you’d add it to an instance of Group (rather than building your own enemy_list ). When you want the enemy to die, you can call the kill() method on it, which will remove it from the Group . This serves to delete it from the game, since you should be using methods on the Group object to update and draw all the sprites it contains (but not ones that have been killed).
It would be beneficial to look into Sprites and SpriteGroups to track entities in your game. They have a bunch of functionality built in that will make things easier.
Here’s a demo I have that groups sprites, removing those that collide with the mouse pointer:
Clicking a mouse button creates more sprites and pressing the space bar randomises their position.
The update() method of a bullet sprite would adjust the sprite position by its speed, e.g. self.rect.x += SPEED and you would need to call the bullet sprite group .update() method every game loop.
Right, so you have a list of enemy positions in enemy_list . That’s a good start. I don’t see a bullet_list , so I will assume only a single bullet at a time, positioned at b_x , b_y .
So a main loop for this program might look something like:
Where the enemy collision, and list removal might look something like the below. (I’ve tried to match the look of your code as much as possible.)
We do an iteration through the enemy list, checking for a collision. Once a hit is found, it save the index of which enemy was hit, and stops the loop.
The next step is to delete the enemy from the list. I have written this in a separate block, rather than placing it before the break in the loop. This is because unexpected results can happen when you change a list as you’re iterating over it. In this particular case it would have been OK, but it’s something to be wary of as a beginner.
I’m assuming there’s only one bullet in screen at a time since you didn’t mention a bullet list. You probably create bullet by hitting space or something which I’ll leave out here. One thing to consider in you bullets() function is your doing moving, drawing and checking for collision in the same function. Note, it is always a good idea to make a function do only one thing.
So to create a bullet, you should have a Boolean create_bullet variable. So:
you say you want to delete it and not just draw over it. However the way pygame generates a ‘moving/ video-like’ screen is by continuously drawing over. E.g: player is drawn at (10, 10) and then is drawn at (20, 10) so it appears like player moved. However, this is done very fast so you don’t see him ‘disappear’ and ‘reappear’. So here’s what the above code does.
When spacebar is hit, it ‘creates’ the bullet by setting it’s x and y value to the current player position and sets create_bullet = true. Then, on each iteration of the main loop, if create_bullet is true, it moves then draws the bullet. If the bullet moves outside the screen or collides with enemy, create_bullet = False, so it will stop drawing it and on the next iteration of main loop, bullet will be drawn over by the background and would ‘disappear’.
Как удалить объект в pygame
![]()
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.
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.
PyGame — шпаргалка для использования
Pygame использует объекты Rect для хранения и манипулирования прямоугольными областями. Rect может быть создан из комбинации значений слева, сверху, ширины и высоты. Rect также могут быть созданы из объектов python, которые уже являются Rect или имеют атрибут с именем «rect».
Методы работы с Rect
| pygame.Rect.copy | Возвращает новый прямоугольник, имеющий ту же позицию и размер, что и оригинал. |
| pygame.Rect.move | Возвращает новый прямоугольник, перемещаемый данным смещением. Аргументы x и y могут быть любым целочисленным значением, положительным или отрицательным. |
| pygame.Rect.move_ip | То же, что и метод Rect.move (), но работает на месте. |
| pygame.Rect.inflate | увеличивать или уменьшать размер прямоугольника, на месте |
| pygame.Rect.inflate_ip | увеличивать или уменьшать размер прямоугольника, на месте |
| pygame.Rect.clamp | перемещает прямоугольник внутри другого |
| pygame.Rect.clamp_ip | перемещает прямоугольник внутри другого, на месте |
| pygame.Rect.clip | обрезает прямоугольник внутри другого |
| pygame.Rect.union | соединяет два прямоугольника в один |
| pygame.Rect.union_ip | соединяет два прямоугольника в один, на месте |
| pygame.Rect.unionall | объединение многих прямоугольников |
| pygame.Rect.unionall_ip | объединение многих прямоугольников, на месте |
| pygame.Rect.fit | изменить размер и переместить прямоугольник учмиывая соотношение сторон |
| pygame.Rect.normalize | корректировать отрицательные размеры |
| pygame.Rect.contains | проверить, находится ли один прямоугольник внутри другого |
| pygame.Rect.collidepoint | проверить, находится ли точка внутри прямоугольника |
| pygame.Rect.colliderect | тест, пересекаются ли два прямоугольника |
| pygame.Rect.collidelist | проверить, пересекается ли хоть один прямоугольник в списке |
| pygame.Rect.collidelistall | пересекаются ли все прямоугольники в списке |
| pygame.Rect.collidedict | проверить, если один прямоугольник в словаре пересекается |
| pygame.Rect.collidedictall | пересекаются ли все прямоугольники в словаре |
Обработка событий
Событие — это то, как Pygame сообщает о том, что что-то случилось за пределами кода программы. События создаются, например, при нажатии клавиш клавиатуры, мыши и размещаются в очереди, дожидаясь обработки.
Функция get в модуле pygame.event возвращает последнее событие, ожидающее в очереди и удаляет его из очереди.
Объект event
Модуль pygame.event для обработки очереди событий
| pygame.event.pump | Если вы не используете другие функции событий в своей игре, вы должны вызвать pygame.event.pump (), чтобы позволить pygame обрабатывать внутренние действия |
| pygame.event.get | получает события из очереди |
| pygame.event.poll | получить одно событие из очереди |
| pygame.event.wait | ждёт одиночного события из очереди |
| pygame.event.peek | проверить, ждут ли очереди события определённого типа |
| pygame.event.clear | удалить все события из очереди |
| pygame.event.event_name | возвращает имя для типа события. Строка находится в стиле WordCap |
| pygame.event.set_blocked | проверяет, какие события не разрешены в очереди |
| pygame.event.set_allowed | проверяет, какие события разрешены в очереди |
| pygame.event.get_blocked | проверить, заблокирован ли тип события из очереди |
| pygame.event.set_grab | проверяет совместное использование устройств ввода с другими приложениями |
| pygame.event.get_grab | проверить, работает ли программа на устройствах ввода данных |
| pygame.event.post | поместить новое событие в очередь |
| pygame.event.Event | создать новый объект события |
| pygame.event.EventType | Объект Python, представляющий событие SDL. Экземпляры пользовательских событий создаются с вызовом функции Event. Тип EventType не может быть напрямую вызван. Экземпляры EventType поддерживают назначение и удаление атрибутов. |
Pygame отслеживает все сообщения о событиях через очередь событий. Процедуры в этом модуле помогают управлять этой очередью событий. Входная очередь сильно зависит от модуля отображения (display) pygame. Если дисплей не был инициализирован и видеорежим не установлен, очередь событий не будет работать.
Существует множество способов доступа к очереди событий. Просто проверять существование событий, захватывать их непосредственно из стека.
Модуль pygame.mouse для работы с мышью
| pygame.mouse.get_pressed | получить состояние кнопок мыши |
| pygame.mouse.get_pos | получить позицию курсора мыши |
| pygame.mouse.get_rel | получить количество движений мыши |
| pygame.mouse.set_pos | установить позицию курсора мыши |
| pygame.mouse.set_visible | скрыть или показать курсор мыши |
| pygame.mouse.get_focused | проверяет, принимает ли дисплей ввод мыши |
| pygame.mouse.set_cursor | установить изображение для курсора мыши |
| pygame.mouse.get_cursor | получить изображение для курсора мыши |
Функции мыши можно использовать для получения текущего состояния устройства мышь. Эти функции также могут изменять курсор мыши.
Когда режим отображения (display) установлен, очередь событий начнет принимать события мыши. Кнопки мыши генерируют события pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP , когда они нажимаются и отпускаются. Эти события содержат атрибут кнопки, указывающий, какая кнопка была нажата. Колесо мыши будет генерировать pygame.MOUSEBUTTONDOWN и pygame.MOUSEBUTTONUP события при прокрутке.
Когда колесо повернуто вверх, кнопка будет установлена на 4, вниз -5. Всякий раз, когда мышь перемещается, генерируется событие pygame.MOUSEMOTION . Движение мыши разбито на небольшие и точные события движения. По мере перемещения мыши многие события движения будут помещены в очередь. События движения мыши, которые неправильно очищены от очереди событий, являются основной причиной того, что очередь событий заполняется.
Пример. Нарисовать курсор под текущей позицией мыши.
Определить какая кнопка была нажата на мышке можно используя значение event.button:
Координаты курсора при нажатии кнопки мыши находятся в event.pos .
Пример. Перемещать картинку курсором мыши.
Клавиатура
Модуль pygame.key
Этот модуль содержит функции для работы с клавиатурой.Очередь событий получает события pygame.KEYDOWN и pygame.KEYUP при нажатии и отпускании клавиш клавиатуры.
Оба события имеют ключевой атрибут, который представляет собой целочисленный идентификатор, представляющий каждую клавишу на клавиатуре.Событие pygame.KEYDOWN имеет дополнительные атрибуты: unicode и scancode. unicode представляет собой одну символьную строку, которая соответствует введённому символу. Scancode представляет собой код для конкретной платформы.
Получить код клавиши:
Существует много клавиатурных констант, они используются для представления клавиш на клавиатуре. Ниже приведен список всех клавиатурных констант:
| KeyASCII | ASCII | CommonName |
|---|---|---|
| K_BACKSPACE | \b | backspace |
| K_TAB | \t | tab |
| K_CLEAR | clear | |
| K_RETURN | \r | return |
| K_PAUSE | pause | |
| K_ESCAPE | ^[ | escape |
| K_SPACE | space | |
| K_EXCLAIM | ! | exclaim |
| K_QUOTEDBL | « | quotedbl |
| K_HASH | # | hash |
| K_DOLLAR | $ | dollar |
| K_AMPERSAND | & | ampersand |
| K_QUOTE | quote | |
| K_LEFTPAREN | ( | leftparenthesis |
| K_RIGHTPAREN | ) | rightparenthesis |
| K_ASTERISK | * | asterisk |
| K_PLUS | + | plussign |
| K_COMMA | , | comma |
| K_MINUS | — | minussign |
| K_PERIOD | . | period |
| K_SLASH | / | forwardslash |
| K_0 | 0 | 0 |
| K_1 | 1 | 1 |
| K_2 | 2 | 2 |
| K_3 | 3 | 3 |
| K_4 | 4 | 4 |
| K_5 | 5 | 5 |
| K_6 | 6 | 6 |
| K_7 | 7 | 7 |
| K_8 | 8 | 8 |
| K_9 | 9 | 9 |
| K_COLON | : | colon |
| K_SEMICOLON | ; | semicolon |
| K_LESS | less-thansign | |
| K_EQUALS | = | equalssign |
| K_GREATER | > | greater-thansign |
| K_QUESTION | ? | questionmark |
| K_AT | @ | at |
| K_LEFTBRACKET | [ | leftbracket |
| K_BACKSLASH | \ | backslash |
| K_RIGHTBRACKET | ] | rightbracket |
| K_CARET | ^ | caret |
| K_UNDERSCORE | _ | underscore |
| K_BACKQUOTE | ` | grave |
| K_a | a | a |
| K_b | b | b |
| K_c | c | c |
| K_d | d | d |
| K_e | e | e |
| K_f | f | f |
| K_g | g | g |
| K_h | h | h |
| K_i | i | i |
| K_j | j | j |
| K_k | k | k |
| K_l | l | l |
| K_m | m | m |
| K_n | n | n |
| K_o | o | o |
| K_p | p | p |
| K_q | q | q |
| K_r | r | r |
| K_s | s | s |
| K_t | t | t |
| K_u | u | u |
| K_v | v | v |
| K_w | w | w |
| K_x | x | x |
| K_y | y | y |
| K_z | z | z |
| K_DELETE | delete | |
| K_KP0 | keypad0 | |
| K_KP1 | keypad1 | |
| K_KP2 | keypad2 | |
| K_KP3 | keypad3 | |
| K_KP4 | keypad4 | |
| K_KP5 | keypad5 | |
| K_KP6 | keypad6 | |
| K_KP7 | keypad7 | |
| K_KP8 | keypad8 | |
| K_KP9 | keypad9 | |
| K_KP_PERIOD | . | keypadperiod |
| K_KP_DIVIDE | / | keypaddivide |
| K_KP_MULTIPLY | * | keypadmultiply |
| K_KP_MINUS | — | keypadminus |
| K_KP_PLUS | + | keypadplus |
| K_KP_ENTER | \r | keypadenter |
| K_KP_EQUALS | = | keypadequals |
| K_UP | uparrow | |
| K_DOWN | downarrow | |
| K_RIGHT | rightarrow | |
| K_LEFT | leftarrow | |
| K_INSERT | insert | |
| K_HOME | home | |
| K_END | end | |
| K_PAGEUP | pageup | |
| K_PAGEDOWN | pagedown | |
| K_F1 | F1 | |
| K_F2 | F2 | |
| K_F3 | F3 | |
| K_F4 | F4 | |
| K_F5 | F5 | |
| K_F6 | F6 | |
| K_F7 | F7 | |
| K_F8 | F8 | |
| K_F9 | F9 | |
| K_F10 | F10 | |
| K_F11 | F11 | |
| K_F12 | F12 | |
| K_F13 | F13 | |
| K_F14 | F14 | |
| K_F15 | F15 | |
| K_NUMLOCK | numlock | |
| K_CAPSLOCK | capslock | |
| K_SCROLLOCK | scrollock | |
| K_RSHIFT | rightshift | |
| K_LSHIFT | leftshift | |
| K_RCTRL | rightcontrol | |
| K_LCTRL | leftcontrol | |
| K_RALT | rightalt | |
| K_LALT | leftalt | |
| K_RMETA | rightmeta | |
| K_LMETA | leftmeta | |
| K_LSUPER | leftWindowskey | |
| K_RSUPER | rightWindowskey | |
| K_MODE | modeshift | |
| K_HELP | help | |
| K_PRINT | printscreen | |
| K_SYSREQ | sysrq | |
| K_BREAK | break | |
| K_MENU | menu | |
| K_POWER | power | |
| K_EURO | Euro |
Направленное движение с помощью клавиш
Можно перемещать изображение на экране с клавиатуры, назначая клавиши для перемещений: вверх, вниз, влево, вправо.
Создать картинку, например:
Проверить очередь событий:
Проверить, является ли полученное событие нажатием на клавиши со стрелками:
Если — да, то получмить код нажатой клавиши и сформировать новые координаты для картинки:
И нарисовать картинку в новом месте:
Объект Surface
pygame.Surface — объект pygame для представления изображений
Наложение поверхностей, прозрачность.
Управление временем
Модуль pygame.time содержит объект Clock, который можно использовать для отслеживания
времени. Чтобы создать объект типа: время, вызывается конструктор pygame.time.Clock:
clock = pygame.time.Clock()
Когда создан объект clock, можно вызвать его функцию tick один раз за кадр,
которая возвращает время, прошедшее со времени предыдущего вызова в миллисекундах:
time_passed = clock.tick ()
Функция tick может использовать необязательный параметр для установления максимальной частоты кадров. Этот параметр нужен, если игра запущена на рабочем компьютере и необходимо контролировать, чтобы она не использовала всю его вычислительная мощность на 100%:
# Игра будет работать со скоростью не более 30 кадров в секунду
time_passed = clock.tick (30)
Звуки
Для управления звуком используется модуль pygame.mixer . Он отвечает за любые действия со звуками.
Загружаем звуковой файл в формате *.wav
sound = pygame.mixer.Sound(«sound.wav»)
(загружаем до игрового цикла, т.к. это очень долгая операция)
Столкновения (collisions)
При написании игр часто возникает необходимость проверять взаимное расположение объектов на экране, отслеживать моменты их столкновений, пересечений.