如何摆脱Pygame表面?

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)
1个回答

6

在再次blit之前,您需要特别清除圆圈。根据您的场景复杂程度,可能需要尝试不同的方法。通常我会有一个“背景”surface,每帧都会blit到屏幕上,然后blit精灵/其他surface到它们的新位置(在Pygame中进行blits非常快,即使在相当大的屏幕上,我也没有速度问题)。对于上面的代码,很简单,只需使用surface.fill(COLOR),其中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)

编辑回复您的评论:可以更加面向对象地完成这个任务。

您需要将背景表面与屏幕相关联(我通常会有一个显示器或地图类(取决于游戏类型)来完成此操作)。然后,将对象作为pygame.sprite的子类。这要求您拥有self.imageself.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类的文档以获取更多信息。


这种方法是可行且有效的,但是否有更面向对象的方法?我计划将其制作为类对象,所以想知道是否有另一种不使用screen.fill(bgColor)的方法。 - lotsofsloths

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接