在以下代码中,在任何给定时间点屏幕上不仅有一个圈。 我想解决这个问题,使其看起来只有一个圆圈,而不是留下任何鼠标光标所在的涂抹痕迹。
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)
答案 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.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类的documentation。