2017-08-11 113 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()