3

在下面的代码中,在任何给定的时间点,屏幕上不只有一个圆圈。我想解决这个问题,使它看起来只有一个圆圈,而不是在鼠标光标所在的地方留下污迹。

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

您需要在再次使用 blit 之前专门擦除圆圈。根据场景的复杂程度,您可能需要尝试不同的方法。一般来说,我所做的是有一个“背景”表面,每帧都会对屏幕进行 blit,然后将精灵/其他表面 blit 到它们的新位置(Pygame 中的 blit 非常快,所以即使在相当大的屏幕上我也没有这样做的速度问题)。对于上面的代码,只需使用surface.fill(COLOR)whereCOLOR是您的背景颜色就足够简单了;例如,白色的 (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.imageself.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 回答