Dlaczego w PyGame w ogóle nic nie jest rysowane?
Zacząłem nowy projekt w Pythonie używając pygame i jako tło chcę, aby dolna połowa była wypełniona szarością, a górna czarna. Używałem wcześniej rysowania prostokątnego w projektach, ale z jakiegoś powodu wydaje się, że jest uszkodzony? nie wiem, co robię źle. najdziwniejsze jest to, że wynik jest inny za każdym razem, gdy uruchamiam program. czasami jest tylko czarny ekran, a czasami szary prostokąt obejmuje część ekranu, ale nigdy połowę ekranu.
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()
Odpowiedzi
Musisz zaktualizować wyświetlacz. W rzeczywistości rysujesz na Surfaceobiekcie. Jeśli rysujesz na powierzchni skojarzonej z wyświetlaczem PyGame, nie jest to natychmiast widoczne na wyświetlaczu. Zmiany stają się widoczne po zaktualizowaniu wyświetlacza za pomocą jednego pygame.display.update()lub pygame.display.flip().
Zobacz pygame.display.flip():
Spowoduje to zaktualizowanie zawartości całego wyświetlacza.
Podczas gdy pygame.display.flip()
zaktualizuje zawartość całego wyświetlacza, pygame.display.update()
umożliwia aktualizację tylko części ekranu, zamiast całego obszaru. pygame.display.update()
to zoptymalizowana wersja pygame.display.flip()
dla wyświetlaczy programowych, ale nie działa dla wyświetlaczy z akceleracją sprzętową.
Typowa pętla aplikacji PyGame musi:
- obsłużyć zdarzenia za pomocą pygame.event.pump()lub pygame.event.get().
- zaktualizować stany gry i pozycje obiektów w zależności od zdarzeń wejściowych i czasu (odpowiednio klatki)
- wyczyść cały wyświetlacz lub narysuj tło
- narysuj całą scenę (narysuj wszystkie obiekty)
- zaktualizuj wyświetlacz za pomocą pygame.display.update()lubpygame.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()