PyGameに何も描かれていないのはなぜですか?

Dec 03 2020

pygameを使用してPythonで新しいプロジェクトを開始しました。背景には、下半分を灰色で、上半分を黒で塗りつぶしたいと思います。以前にプロジェクトで長方形の描画を使用したことがありますが、何らかの理由で壊れているようです。何が間違っているのかわかりません。最も奇妙なことは、プログラムを実行するたびに結果が異なることです。黒い画面しかない場合もあれば、灰色の長方形が画面の一部を覆っている場合もありますが、画面の半分を覆っている場合はありません。

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

回答

Rabbid76 Dec 03 2020 at 01:33

表示を更新する必要があります。あなたは実際にSurfaceオブジェクトを描いています。PyGameディスプレイに関連付けられているサーフェスに描画した場合、これはディスプレイにすぐには表示されません。表示がpygame.display.update()またはで更新されると、変更が表示されますpygame.display.flip()。

参照pygame.display.flip():

これにより、ディスプレイ全体の内容が更新されます。

しながら、pygame.display.flip()ディスプレイ全体の内容が更新され、pygame.display.update()代わりに全領域のうち、更新された画面の一部だけを更新することができます。pygame.display.update()pygame.display.flip()ソフトウェアディスプレイ用に最適化されたバージョンですが、ハードウェアアクセラレーションディスプレイでは機能しません。

典型的なPyGameアプリケーションループは次のことを行う必要があります。

  • pygame.event.pump()またはのいずれかでイベントを処理しますpygame.event.get()。
  • 入力イベントと時間(それぞれフレーム)に応じて、ゲームの状態とオブジェクトの位置を更新します
  • ディスプレイ全体をクリアするか、背景を描画します
  • シーン全体を描画します(すべてのオブジェクトを描画します)
  • pygame.display.update()またはのいずれかで表示を更新しますpygame.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()

イベントとアプリケーションのループも参照してください