如何摆脱pygame表面?

时间:2010-02-06 23:46:53

标签: 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)

1 个答案:

答案 0 :(得分: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)

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

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