Por que nada é desenhado no PyGame?

Dec 03 2020

Comecei um novo projeto em python usando pygame e, para o fundo, quero a metade inferior preenchida com cinza e a superior com preto. Eu usei o desenho retângulo em projetos antes, mas por algum motivo ele parece estar quebrado? não sei o que estou fazendo de errado. o mais estranho é que o resultado é diferente a cada vez que executo o programa. às vezes há apenas uma tela preta e às vezes um retângulo cinza cobre parte da tela, mas nunca metade dela.

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

Respostas

Rabbid76 Dec 03 2020 at 01:33

Você precisa atualizar o display. Você está realmente desenhando em um Surfaceobjeto. Se você desenhar na superfície associada à exibição do PyGame, isso não ficará imediatamente visível na exibição. As alterações tornam-se visíveis quando a exibição é atualizada com pygame.display.update()ou pygame.display.flip().

Veja pygame.display.flip():

Isso atualizará o conteúdo de todo o display.

Enquanto pygame.display.flip()atualiza o conteúdo de todo o display, pygame.display.update()permite atualizar apenas uma parte da tela a ser atualizada, ao invés de toda a área. pygame.display.update()é uma versão otimizada do pygame.display.flip()para monitores de software, mas não funciona para monitores com aceleração de hardware.

O loop de aplicativo PyGame típico deve:

  • manipular os eventos por pygame.event.pump()ou pygame.event.get().
  • atualizar os estados do jogo e as posições dos objetos dependentes dos eventos de entrada e do tempo (respectivamente frames)
  • limpar toda a tela ou desenhar o fundo
  • desenhe a cena inteira (desenhe todos os objetos)
  • atualize a exibição por pygame.display.update()oupygame.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()

Veja também Evento e loop de aplicação