2017-08-11 30 views
1

スプライトを撃つときはいつでも、スクリーンから除去できるようにしたいが、半分の時間(または他の任意の時間)を過ぎた後でなければならない。しかし、私はその期間が終了するのを待つために睡眠をポーリングしたくない。Pygame - ポーリングを行わずに一定時間後にスプライトを削除/削除する

私はこれまで来たところである:

# 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 

を私は上記のコードは理解したいと考えています。私はを挿入してしばらく待ってからスプライトを削除しない限り、これはうまくいきません。もちろん、これはオプションではありません。プログラム全体がその期間中フリーズするからです。私は多分このタイマーを処理するスレッドを作成することについて考えている? 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() 
関連する問題