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

#python #pygame #rectangles

#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()
 

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