Por que nada é desenhado no PyGame?
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
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()