Pourquoi rien n'est dessiné du tout dans PyGame?

Dec 03 2020

J'ai commencé un nouveau projet en python en utilisant pygame et pour l'arrière-plan, je veux que la moitié inférieure soit remplie de gris et la partie supérieure noire. J'ai déjà utilisé le dessin rectangle dans des projets, mais pour une raison quelconque, il semble être cassé? je ne sais pas ce que je fais de mal. la chose la plus étrange est que le résultat est différent chaque fois que je lance le programme. parfois il n'y a qu'un écran noir et parfois un rectangle gris recouvre une partie de l'écran, mais jamais la moitié de l'écran.

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

Réponses

Rabbid76 Dec 03 2020 at 01:33

Vous devez mettre à jour l'affichage. Vous dessinez en fait sur un Surfaceobjet. Si vous dessinez sur la surface associée à l'affichage PyGame, cela n'est pas immédiatement visible dans l'affichage. Les modifications deviennent visibles, lorsque l'affichage est mis à jour avec pygame.display.update()ou pygame.display.flip().

Voir pygame.display.flip():

Cela mettra à jour le contenu de tout l'affichage.

Tandis que pygame.display.flip()mettra à jour le contenu de l'affichage entier, pygame.display.update()permet de mettre à jour seulement une partie de l'écran à mis à jour, au lieu de la zone entière. pygame.display.update()est une version optimisée de pygame.display.flip()pour les écrans logiciels, mais ne fonctionne pas pour les écrans à accélération matérielle.

La boucle d'application typique de PyGame doit:

  • gérer les événements soit pygame.event.pump()ou pygame.event.get().
  • mettre à jour les états du jeu et les positions des objets en fonction des événements d'entrée et de l'heure (respectivement des cadres)
  • effacer tout l'affichage ou dessiner l'arrière-plan
  • dessiner toute la scène (dessiner tous les objets)
  • mettre à jour l'affichage soit pygame.display.update()soitpygame.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()

Voir aussi Boucle d'événement et d'application