2010-02-06 112 views
3

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

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) 

回答

6

您需要在您再次粘贴之前特别擦除该圆。根据你的场景有多复杂,你可能需要尝试不同的方法。一般来说,我所做的是有一个“背景”表面,每一帧画面都会对屏幕产生影响,然后在新的位置对精灵/其他表面进行blit处理(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) 

编辑在回答您的评论:这是可能做到这一点更面向对象的方式。

你需要有一个与你的屏幕相关联的背景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) 

参见雪碧和组班documentation以获取更多信息。

+0

此方法的工作原理是有效的,但有没有更多的面向对象的方法?我打算让这个类对象,所以我想知道是否有另一种方式,不使用screen.fill(bgColor)。 – lotsofsloths 2010-02-07 00:13:22