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

avatar
MinerBat
2 декабря 2020 в 18:26
529
2
4

Я начал новый проект на питоне, используя 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
2 декабря 2020 в 18:28
0

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

Dusart Victor
2 декабря 2020 в 18:29
0

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

Ответы (2)

avatar
Rabbid76
2 декабря 2020 в 18:33
3

Вам необходимо обновить дисплей. На самом деле вы рисуете объект 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 Смотрите также Событие и применение цикла

Rabbid76
2 декабря 2020 в 19:51
0

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

avatar
SomeOne
28 августа 2021 в 16:31
0

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

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

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