3

次のコードでは、任意の時点で画面上に円が1 つだけではありません。これを修正して、マウスカーソルがあった場所に汚れの跡を残すのではなく、円が1つしかないように見えるようにしたいと思います。

import pygame,sys
from pygame.locals import *
pygame.init()

screen = pygame.display.set_mode((640,400),0,32)

radius = 25
circle = pygame.Surface([radius*2]*2,SRCALPHA,32)
circle = circle.convert_alpha()
pygame.draw.circle(circle,(25,46,100),[radius]*2,radius)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    screen.blit(circle,(pygame.mouse.get_pos()[0],100))

    pygame.display.update()
    pygame.time.delay(10)
4

1 に答える 1

6

もう一度ブリットする前に、円を明確に消去する必要があります。シーンの複雑さに応じて、さまざまな方法を試す必要がある場合があります。一般的に、私がしていることは、フレームごとに画面にブリットし、スプライト/他のサーフェスを新しい位置にブリットする「背景」サーフェスを用意することです (Pygame のブリットは非常に高速であるため、かなり大きな画面でも私は持っていません)これを行う速度の問題)。上記のコードでは、 surface.fill(COLOR)where COLORis 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 クラスに関するドキュメントを参照してください。

于 2010-02-06T23:57:32.437 に答える