как заставить изображение/изображения исчезнуть в pygame?

#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 лет назад все было по-другому.