2013-04-09 141 views
0

我正在使用一個關於我正在開發的空間卷軸射擊精靈世代的例子。通過慢慢地瞭解它是如何工作的,我已經設法讓多個精靈橫穿屏幕。但是,有很多精靈都會生成。Pygame - 精靈限制實例

所以我遇到的麻煩是限制了精靈的初始數量,而不是代碼產生的多少。我想過使用if sprites.__len__ < 10: sprites.add(drone),但是當我嘗試過時,它不起作用。我的想法是,每次它循環時,它都會檢查組中的精靈數量,如果它小於10,則向該組添加一個精靈,直到它達到10爲止。這樣,如果它離開了屏幕或被破壞,然後它會繼續做檢查並保持不變。

這是球員類:

class Player(pygame.sprite.Sprite): 
    def __init__(self, *groups): 
     super(Player, self).__init__(*groups) 
     self.image = pygame.image.load('player.png') 
     self.rect = pygame.rect.Rect((screen_width, (random.randrange(0,screen_height))), self.image.get_size()) 
     self.dx = -10 
     self.pos = random.randrange(0,screen_height) 

    def update(self): 
     self.rect.centerx += self.dx 

     if self.rect.right < 0: 
      self.kill() 

,這是關於精靈的增加部分。

 sprites.update() 
     screen.fill((200, 200, 200)) 
     sprites.draw(screen) 


     drone = Player() 
     self.y = random.randrange(0,screen_height) 
     sprites.add(drone) 

     pygame.display.flip() 

這可能很明顯,但我仍然在學習,所以指導會很棒。

第二個問題 - 更多的思想確認。如果我不想讓精靈在屏幕底部畫一半。難道我基本上說,如果self.rect.bottom> SCREEN_HEIGHT,然後定位精靈@ SCREEN_HEIGHT

完整的源:http://pastebin.com/PLRVHtxz

編輯 - 我想我已經解決了,只是需要讓精靈運行更順暢。

while 1: 
      clock.tick(40) 
      numberAlien = 5 

      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        return 
       if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: 
        return 


       sprites.update() 
       screen.fill((200, 200, 200)) 
       sprites.draw(screen) 


       drone = Player() 
       if sprites.__len__() < numberAlien: 
        self.y = random.randrange(0,screen_height) 
        sprites.add(drone) 

       pygame.display.flip() 
+0

那麼你在問什麼? – 2013-04-09 21:30:54

+0

對不起,基本上,我如何獲得一定數量的精靈順利地穿過屏幕。 – 2013-04-09 23:18:13

+0

這可能會有所幫助,但不是一個完整的解決方案:'if not_in_bounds(sprite):sprite.die()'自動刪除你不再需要的東西。 – ninMonkey 2013-04-10 16:36:54

回答

0

你可以繼承SpriteGroup,加上精靈總數的新領域,並檢查add方法,看看是否可以添加它。 您不應該用__檢查任何變量。

至於運動,我相信,由於clock.tick(40),你看不到平穩的運動。 它等待40ms,直到它恢復運行。你可以將tick降低到10,並調整你爲精靈改變的dx,或者嘗試一種更通用的方法。

對clock.tick()的調用返回自上次調用以來的ms數量。這將是你的時間三角洲。然後您可以擁有全局SPEED。要移動的像素數量將從SPEED * delta計算得出。

+1

可能更好的子類[sprite.Group()](http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.Group) – ninMonkey 2013-04-10 16:37:36

+0

你是對的,相應地改變了我的答案 – 2013-04-10 19:04:55