如何摆脱pygame表面?

lot*_*ths 3 python pygame geometry-surface

在以下代码中,在任何给定时间点屏幕上不只有一个圆圈.我想解决这个问题,使其看起来只有一个圆圈,而不是在鼠标光标所在的位置留下涂抹痕迹.

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)
Run Code Online (Sandbox Code Playgroud)

Dan*_*l G 6

在再次进行blit之前,您需要专门擦除圆圈.根据场景的复杂程度,您可能需要尝试不同的方法.一般来说,我所做的是有一个"背景"表面,每一帧对屏幕都是一个blit,然后在他们的新位置blit sprite /其他表面(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)
Run Code Online (Sandbox Code Playgroud)

编辑以回答您的评论:可以以更加面向对象的方式执行此操作.

你需要有一个与你的屏幕相关联的背景表面(我通常有一个显示或地图类(取决于游戏类型)这样做).然后,使您的对象成为子类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)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Sprite和Group类的文档.