Почему в PyGame вообще ничего не прорисовывается?

Dec 03 2020

Я начал новый проект на Python, используя pygame, и для фона я хочу, чтобы нижняя половина была заполнена серым, а верхняя - черным. Раньше я использовал прямоугольный рисунок в проектах, но почему-то кажется, что он не работает? я не знаю, что делаю не так. Самое странное, что каждый раз, когда я запускаю программу, результат меняется. иногда бывает только черный экран, а иногда серый прямоугольник покрывает часть экрана, но никогда не половину экрана.

import pygame, sys
from pygame.locals import *
pygame.init()

DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

Ответы

Rabbid76 Dec 03 2020 at 01:33

Вам нужно обновить отображение. Вы на самом деле рисуете Surfaceобъект. Если вы рисуете на поверхности, связанной с дисплеем PyGame, это не сразу видно на дисплее. Изменения становятся видимыми при обновлении дисплея с помощью pygame.display.update()или pygame.display.flip().

Смотрите pygame.display.flip():

Это обновит содержимое всего дисплея.

Пока pygame.display.flip()обновляет содержимое всего дисплея, pygame.display.update()позволяет обновлять только часть экрана, а не всю область. pygame.display.update()- оптимизированная версия pygame.display.flip()для программных дисплеев, но не работает для дисплеев с аппаратным ускорением.

Типичный цикл приложения PyGame должен:

  • обрабатывать события либо, pygame.event.pump()либо pygame.event.get().
  • обновлять игровые состояния и позиции объектов в зависимости от входных событий и времени (соответственно кадров)
  • очистить весь дисплей или нарисовать фон
  • нарисовать всю сцену (нарисовать все объекты)
  • обновите отображение либо, pygame.display.update()либоpygame.display.flip()
import pygame
from pygame.locals import *
pygame.init()

DISPLAY = pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
clock = pygame.time.Clock()

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

    # handle events
    for event in pygame.event.get():
        if event.type == QUIT:
            run = False

    # clear display
    DISPLAY.fill(0)

    # draw scene
    pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))

    # update display
    pygame.display.flip()

pygame.quit()
exit()

См. Также Цикл событий и приложений.