2017-08-11 91 views
1

每当我拍摄sprite时,我都希望能够将它从屏幕上移除,但只能在半秒后(或其他任意时间段)移除。但我不想调查睡眠等待这段时间结束。Pygame - 在一段时间后删除/杀掉Sprite,无需轮询

这是我来迄今:

# detect collision here - all good 
collisions = pygame.sprite.groupcollide(bullets, badGuys, True, False) 
for baddies in collisions.values(): 
    for bad in baddies: 
     # do stuff 
     baddiesToRemove.appendleft(bad) 
     # since a collision occured set timer for that specific bad guy: 
     startTime = pygame.time.get_ticks() 

# now after 500 milliseconds have passed, sth like that: 
milis = pygame.time.get_ticks() - startTime # result in milliseconds 
if (milis > 500): 
    badGuyToRemove = baddiesToRemove.pop() 
    badGuyToRemove.kill() # i want to delete the sprite 

我希望上面的代码是可以理解的。简而言之,这将无法工作,除非我在中间插入sleep()以等待一段时间,然后删除精灵。当然,这不是一个选项,因为整个程序会冻结那段时间。我曾想过创建一个线程来处理这个计时器? pygame/python中可以有更好的选项吗?有什么建议吗?提前致谢。

回答

0

就像动画一样!

我假设你有某种时间流逝和/或帧已经过去了。我从目前的IDE不在的时候和不信任我的即时pygame的,但包括在更新功能类似如下:

def update(...): 
    ... 
    if (not alive) and wait_frames: 
    wait_frames -= 1 
    if (not alive) and (not wait_frames): 
    # remove 
    ... 

除非您的更新实现比怎么样的方式不同我一直使用它,这应该做的伎俩!

0

每个敌方精灵需要一个自己的计时器。如果子弹击中其中一个,则启动计时器,如果所需的时间已过,则检查更新方法,然后致电self.kill()。 (在本例中按任意键启动敌人计时器。)

import sys 
import pygame as pg 


class Enemy(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((50, 30)) 
     self.image.fill(pg.Color('sienna1')) 
     self.rect = self.image.get_rect(center=pos) 
     self.time = None 

    def update(self): 
     if self.time is not None: # If the timer has been started... 
      # and 500 ms have elapsed, kill the sprite. 
      if pg.time.get_ticks() - self.time >= 500: 
       self.kill() 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 
    all_sprites = pg.sprite.Group() 
    enemy = Enemy((320, 240), all_sprites) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.KEYDOWN: 
       # Start the timer by setting it to the current time. 
       enemy.time = pg.time.get_ticks() 

     all_sprites.update() 
     screen.fill((30, 30, 30)) 
     all_sprites.draw(screen) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
    sys.exit()