もう一度ブリットする前に、円を明確に消去する必要があります。シーンの複雑さに応じて、さまざまな方法を試す必要がある場合があります。一般的に、私がしていることは、フレームごとに画面にブリットし、スプライト/他のサーフェスを新しい位置にブリットする「背景」サーフェスを用意することです (Pygame のブリットは非常に高速であるため、かなり大きな画面でも私は持っていません)これを行う速度の問題)。上記のコードでは、 surface.fill(COLOR)
where COLOR
is your background color を使用するだけで十分簡単です。例: 白の場合 (255,255,255):
# ...
screen = pygame.display.set_mode((640,400),0,32)
backgroundColor = (255,255,255)
# ...
while True:
# ...
screen.fill(backgroundColor)
screen.blit(circle,(pygame.mouse.get_pos()[0],100))
pygame.display.update()
pygame.time.delay(10)
あなたのコメントに答えて編集してください:これをよりオブジェクト指向の方法で行うことができます。
画面に関連付けられた背景の Surface が必要です (通常、これを行う Display または Map クラス (ゲームの種類によって異なります) があります)。次に、オブジェクトを のサブクラスにしpygame.sprite
ます。self.image
これには、および属性が必要self.rect
です (イメージはサーフェスであり、rect は場所を含む Pygame.rect です)。pygame.group
すべてのスプライトをオブジェクトに追加します。ここで、フレームごとdraw
にグループのメソッドを呼び出し、表示を更新した後 (つまり、pygame.display.update() を使用)、clear
グループのメソッドを呼び出します。screen
この方法では、宛先サーフェス (つまり、上) と背景イメージの両方を提供する必要があります。
たとえば、メイン ループは次のようになります。
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
circle.rect.center = (pygame.mouse.get_pos()[0],100)
circleGroup.draw(screen)
pygame.display.update()
circleGroup.clear(screen, backgroundSurface)
pygame.time.delay(10)
詳細については、Sprite および Group クラスに関するドキュメントを参照してください。