Surface.fill() не очищает дисплей

Я хочу начать свой основной игровой цикл с surface.fill(WHITE), чтобы перекрасить экран в белый цвет, но все поверхности из последнего кадра по-прежнему отображаются.

Чтобы продемонстрировать, следующий пример наносит красную поверхность на зеленую поверхность. Блит создается триггером события каждую 1 секунду. Однако красная поверхность не исчезает, если она не активируется событием.

import pygame as pg
pg.init()

GREEN, WHITE, RED = (60, 120, 60), (255,255,255), (120, 60, 60)
screen = pg.display.set_mode((200, 200))

box = pg.Surface((150, 150))
box.fill(GREEN)

running = True
EVENT_SECOND_TIMER = pg.event.custom_type()
pg.time.set_timer(EVENT_SECOND_TIMER, 1000)

while running:
    screen.fill(WHITE)    
    for event in pg.event.get():
        # Draw circle every second
        if event.type == EVENT_SECOND_TIMER:
            surf = pg.Surface((50,50))
            surf.fill(RED)

            box.blit(surf, (50, 50))

   
    screen.blit(box, (25, 25))
    pg.display.update()

Добро пожаловать обратно в Stack Overflow. "и я был бы признателен за любую помощь." Большинство людей так бы и поступили, но сайт работает не так . Пожалуйста, сначала определите конкретную проблему, а затем задайте четкий, конкретный вопрос. Например, если есть сообщение об ошибке, то попытайтесь найти причину, найдите существующий ответ и, наконец, создайте минимально воспроизводимый пример, чтобы задать вопрос. Если код запускается, но делает что-то не так, то также объясните, что не так.

Karl Knechtel 01.01.2023 05:36

@KarlKnechtel, точка зрения принята. Я думал, что хотя бы перефразирую.

Owen Meyer 01.01.2023 06:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите рисовать что-то постоянно, вы должны рисовать это в цикле приложения. Если вы хотите видеть surf вместо box для изображения, вам нужно установить переменную состояния и отрисовать сцену в зависимости от состояния. Сбросьте переменную состояния после отрисовки сцены:

import pygame as pg
pg.init()

GREEN, WHITE, RED = (60, 120, 60), (255,255,255), (120, 60, 60)
screen = pg.display.set_mode((200, 200))
clock = pg.time.Clock()

box = pg.Surface((150, 150))
box.fill(GREEN)
surf = pg.Surface((50,50))
surf.fill(RED) 

EVENT_SECOND_TIMER = pg.event.custom_type()
pg.time.set_timer(EVENT_SECOND_TIMER, 1000)

running = True
while running: 
    clock.tick(60)

    draw_surf = False
    for event in pg.event.get():
        if event.type == pg.QUIT:
            running = False
        if event.type == EVENT_SECOND_TIMER:
            draw_surf = True 

    screen.fill(WHITE) 
    screen.blit(box, (25, 25))
    if draw_surf:
        screen.blit(surf, (50, 50))        
    pg.display.update() 

pg.quit() 

удивительно, спасибо. У меня сложилось впечатление, что я могу ударить поверхность поверх другой поверхности. Нужно ли отображать все поверхности напрямую, чтобы они обновлялись?

Owen Meyer 01.01.2023 23:48

Причина, по которой я спрашиваю, заключается в том, что я создаю поверхность для игрового фона, которая движется так, что дисплей (экран) просматривает только часть фона (аналогично игре с боковой прокруткой).

Owen Meyer 01.01.2023 23:54

Теперь я понимаю, что вы должны явно очищать хост-поверхность, если вы собираетесь переносить на нее, так как блит-поверхности оставались блит-поверхностями до тех пор, пока хост-поверхность не будет очищена. В моем случае я очистил дисплей и фон. Маркировка завершена. Я ценю ваше общение

Owen Meyer 02.01.2023 00:29

Другие вопросы по теме