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

#python #pygame

Вопрос:

я начал новый проект на 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()
 

Комментарии:

1. Где вы обновляете дисплей? ( pygame.display.update() или pygame.display.flip() )

2. Используйте это : pygame.display.update()

Ответ №1:

Вам нужно обновить дисплей. Вы на самом деле рисуете на 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()
  • ограничьте количество кадров в секунду, чтобы ограничить загрузку процессора с помощью pygame.time.Clock.tick
 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:
    # 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()

    # limit frames per second
    clock.tick(60)

pygame.quit()
exit()
 

repl.it/@Rabbid76/PyGame-MinimalApplicationLoop Смотрите также Цикл событий и приложений

Комментарии:

1. @MinerBat, Похоже, это побочный эффект, связанный с тем, что вашей системе не хватает очистки и обновления дисплея. Для этого нет никакой логической причины. Внутреннее взаимодействие с системой также связано с обработкой событий. Видеть pygame.event.pump() .

Ответ №2:

просто измените свой код на:

 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))
pygame.display.flip() #Refreshing screen

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

это должно помочь