Warum wird in PyGame überhaupt nichts gezeichnet?
Ich habe ein neues Projekt in Python mit Pygame gestartet und für den Hintergrund möchte ich, dass die untere Hälfte mit Grau und die obere mit Schwarz gefüllt ist. Ich habe in Projekten schon einmal Rect Drawing verwendet, aber aus irgendeinem Grund scheint es kaputt zu sein. Ich weiß nicht, was ich falsch mache. Das Seltsamste ist, dass das Ergebnis jedes Mal anders ist, wenn ich das Programm starte. Manchmal gibt es nur einen schwarzen Bildschirm und manchmal bedeckt ein graues Rechteck einen Teil des Bildschirms, aber niemals die Hälfte des Bildschirms.
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()
Antworten
Sie müssen die Anzeige aktualisieren. Sie zeichnen tatsächlich auf ein SurfaceObjekt. Wenn Sie auf der Oberfläche zeichnen, die der PyGame-Anzeige zugeordnet ist, ist dies in der Anzeige nicht sofort sichtbar. Die Änderungen werden sichtbar, wenn die Anzeige mit entweder pygame.display.update()oder aktualisiert wird pygame.display.flip().
Siehe pygame.display.flip():
Dadurch wird der Inhalt der gesamten Anzeige aktualisiert.
Während pygame.display.flip()
der Inhalt der gesamten Anzeige pygame.display.update()
aktualisiert wird , kann nur ein Teil des Bildschirms anstelle des gesamten Bereichs aktualisiert werden. pygame.display.update()
ist eine optimierte Version von pygame.display.flip()
für Software-Displays, funktioniert jedoch nicht für hardwarebeschleunigte Displays.
Die typische PyGame-Anwendungsschleife muss:
- Behandeln Sie die Ereignisse entweder pygame.event.pump()oder pygame.event.get().
- Aktualisieren Sie die Spielzustände und Positionen von Objekten in Abhängigkeit von den Eingabeereignissen und der Zeit (bzw. den Frames).
- Löschen Sie die gesamte Anzeige oder zeichnen Sie den Hintergrund
- Zeichne die gesamte Szene (zeichne alle Objekte)
- Aktualisieren Sie die Anzeige entweder pygame.display.update()oderpygame.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()