#python #timer #pygame
Вопрос:
Привет, я хочу задать вопрос, на который много раз отвечали на этом сайте, но я так и не нашел внятного ответа.Как удалить изображения в Pygame, если в окне игры уже есть фоновое изображение. В большинстве ответов говорится,что нужно использовать screen.fill(цвет), но это делает область черной.Это прекрасно работает,если фонового изображения нет, но с фоновым изображением это выглядит странно, когда только определенная область окрашена в черный цвет.Как я могу от этого избавиться?Есть ли альтернативный способ удалить изображение в данной конкретной ситуации.Кстати, я не добавляю здесь какой-либо конкретный код, потому что я много времени занимаюсь этой проблемой при создании игр.
Ответ №1:
Вы не можете удалить изображение. Вы должны перерисовать всю сцену (включая фон) в цикле приложения. Обратите внимание, что изображения-это всего лишь куча пикселей, нарисованных поверх фона. Фон «под» изображениями перезаписывается, и изображение теряется:
Основной цикл приложения должен:
- обрабатывайте события с помощью или
pygame.event.pump()
илиpygame.event.get()
. - обновляйте игровые состояния и положения объектов в зависимости от входных событий и времени (соответственно кадров).
- очистите весь дисплей или нарисуйте фон
- нарисуйте всю сцену (
blit
все объекты) - обновите дисплей
pygame.display.update()
с помощью илиpygame.display.flip()
Минимальное приложение-это
import pygame
pygame.init()
window = pygame.display.set_mode((500, 500))
clock = pygame.time.Clock()
# main application loop
run = True
while run:
clock.tick(60)
# event loop
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# update game states and move objects
# [...]
# clear the display
window.fill(0) # or `blit` the back ground image instead
# draw the scene - draw all the objects
# [...]
# update the display
pygame.display.flip()
Комментарии:
1. только небольшое дополнение: вам не нужно перерисовывать всю сцену каждый кадр. Вы можете просто перерисовать ту часть, где изображение было логически удалено. Pygame несколько упрощает это с
DirtySprite
LayeredDirty
помощью классов и. Но дело в том, что сегодня это обычно не стоит затраченных усилий. Накладные расходы на отслеживание того, какие части экрана изменились, обычно слишком высоки. ИМХО, 15 лет назад все было по-другому.