Perché non viene disegnato nulla in PyGame?
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
È 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()