Perché non viene disegnato nulla in PyGame?

Dec 03 2020

ho iniziato un nuovo progetto in python usando pygame e per lo sfondo voglio riempire la metà inferiore di grigio e la parte superiore di nero. ho usato il disegno rettangolo in progetti prima, ma per qualche motivo sembra essere rotto? non so cosa sto sbagliando. la cosa più strana è che il risultato è diverso ogni volta che eseguo il programma. a volte c'è solo uno schermo nero e talvolta un rettangolo grigio copre parte dello schermo, ma mai metà dello schermo.

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

Risposte

Rabbid76 Dec 03 2020 at 01:33

È necessario aggiornare il display. Stai effettivamente disegnando su un Surfaceoggetto. Se disegni sulla superficie associata al display di PyGame, questo non è immediatamente visibile nel display. Le modifiche diventano visibili quando il display viene aggiornato con pygame.display.update()o pygame.display.flip().

Vedi pygame.display.flip():

Questo aggiornerà il contenuto dell'intero display.

Mentre pygame.display.flip()aggiornerà il contenuto dell'intero display, pygame.display.update()consente di aggiornare solo una parte dello schermo da aggiornare, invece dell'intera area. pygame.display.update()è una versione ottimizzata di pygame.display.flip()per i display software, ma non funziona per i display con accelerazione hardware.

Il tipico ciclo dell'applicazione PyGame deve:

  • gestire gli eventi con pygame.event.pump()o pygame.event.get().
  • aggiornare gli stati di gioco e le posizioni degli oggetti in base agli eventi di input e al tempo (rispettivamente frame)
  • cancella l'intero display o disegna lo sfondo
  • disegna l'intera scena (disegna tutti gli oggetti)
  • aggiorna il display con pygame.display.update()opygame.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()

Vedi anche Evento e loop dell'applicazione