Pygame - 在一段时间后删除/杀掉Sprite,无需轮询
问题描述:
每当我拍摄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中可以有更好的选项吗?有什么建议吗?提前致谢。
答
就像动画一样!
我假设你有某种时间流逝和/或帧已经过去了。我从目前的IDE不在的时候和不信任我的即时pygame的,但包括在更新功能类似如下:
def update(...):
...
if (not alive) and wait_frames:
wait_frames -= 1
if (not alive) and (not wait_frames):
# remove
...
除非您的更新实现比怎么样的方式不同我一直使用它,这应该做的伎俩!
答
每个敌方精灵需要一个自己的计时器。如果子弹击中其中一个,则启动计时器,如果所需的时间已过,则检查更新方法,然后致电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()