2013-03-19 58 views
0

我這個代碼使用迭代,我不斷收到錯誤。不知道爲什麼它正在做什麼。我是這種類型的編程的新手,並在我創建的遊戲中使用它。我對這個網站也不熟悉,請耐心等待。此代碼將顯示爆炸。由於它步驟通過爆炸一切都很好,直到到達最終的圖像,我得到這個錯誤:如何停止迭代

Traceback (most recent call last): 
    File "C:\Users\Steve\Desktop\Project April\Alien Metor Storm v1_4\AlienMetorStorm.py", line 560, in <module> 
    main() 
    File "C:\Users\Steve\Desktop\Project April\Alien Metor Storm v1_4\AlienMetorStorm.py", line 222, in main 
    ships.update() 
    File "C:\Python31\lib\site-packages\pygame\sprite.py", line 399, in update 
    for s in self.sprites(): s.update(*args) 
    File "C:\Users\Steve\Desktop\Project April\Alien Metor Storm v1_4\explosion.py", line 26, in update 
    self.image = next(self.image_iter) 
StopIteration 

下面是代碼:

import pygame 

class Explosion(pygame.sprite.Sprite): 
    def __init__(self,color,x,y): 
     pygame.sprite.Sprite.__init__(self) 
     self.frame = 0 
     self.width = 0 
     self.height = 0 
     self.x_change = 0 
     self.y_change = 0 
     self.images = [] 
     for i in range (0,25): 
      img = pygame.image.load('Explosion'+str(i)+'.png').convert() 
      img.set_colorkey([0,0,0]) 
      self.images.append(img) 
     self.image = self.images[0] 
     self.image_iter = iter(self.images) 
     self.rect = self.image.get_rect() 
     self.rect.left = x 
     self.rect.top = y 

    def update(self): 
     self.image = next(self.image_iter) 

這裏的任何幫助將非常不勝感激!

回答

4

StopIteration是迭代器耗盡時引發的異常。你可以捕捉它像任何其他異常:

def update(self): 
    try: 
     self.image = next(self.image_iter) 
    except StopIteration: 
     pass #move on, explosion is over ... 

另外,在next內置允許當迭代耗盡通過傳遞第二個參數你回到一些特別的東西:

def update(self): 
    self.image = next(self.image_iter,None) 
    if self.image is None: 
     pass #move on, explosion is over ... 
+1

如果動畫應該永遠重複,['itertools.cycle'(http://docs.python.org/2/library/itertools.html#itertools.cycle)會做到這一點。 – Cairnarvon 2013-03-19 02:10:44

+0

謝謝你mgilson !!!! – 2013-03-19 02:14:35

+2

不知道「next()」的第二個參數,加上一個! – SingleNegationElimination 2013-03-19 02:17:13

0

我不知道正是你想要update做的,但在這裏什麼是發電機的版本,你可以使用,所以你並不需要一個外部ITER

def update(self): 
    for image in self.images: 
     self.image = image 
     yield 

或如果你想永遠重複

def update(self): 
    while True: 
     for image in self.images: 
      self.image = image 
      yield