¿Por qué no se dibuja nada en PyGame?
Comencé un nuevo proyecto en python usando pygame y para el fondo quiero que la mitad inferior esté llena de gris y la parte superior negra. He usado dibujo rect en proyectos antes, pero por alguna razón parece estar roto. No sé qué estoy haciendo mal. lo más extraño es que el resultado es diferente cada vez que ejecuto el programa. a veces solo hay una pantalla negra y a veces un rectángulo gris cubre parte de la pantalla, pero nunca la mitad de la pantalla.
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()
Respuestas
Necesita actualizar la pantalla. En realidad, estás dibujando sobre un Surfaceobjeto. Si dibuja en la superficie asociada a la pantalla de PyGame, esto no es inmediatamente visible en la pantalla. Los cambios se vuelven visibles cuando la pantalla se actualiza con pygame.display.update()o pygame.display.flip().
Ver pygame.display.flip():
Esto actualizará el contenido de toda la pantalla.
Si bien pygame.display.flip()
actualizará el contenido de toda la pantalla, pygame.display.update()
permite actualizar solo una parte de la pantalla para actualizar, en lugar de toda el área. pygame.display.update()
es una versión optimizada de pygame.display.flip()
para pantallas de software, pero no funciona para pantallas aceleradas por hardware.
El bucle típico de la aplicación PyGame tiene que:
- manejar los eventos mediante pygame.event.pump()o pygame.event.get().
- actualizar los estados del juego y las posiciones de los objetos dependiendo de los eventos de entrada y el tiempo (respectivamente fotogramas)
- borrar toda la pantalla o dibujar el fondo
- dibuja toda la escena (dibuja todos los objetos)
- actualizar la pantalla mediante 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()