2017-07-18 80 views
0

這是我的代碼。如何創建步行動畫? (pygame,python)

jack_right_1 = pg.image.load(os.path.join(img_folder, "jack_right_1.png")).convert() 
jack_right_2 = pg.image.load(os.path.join(img_folder, "jack_right_2.png")).convert() 
jack_right_3 = pg.image.load(os.path.join(img_folder, "jack_right_3.png")).convert() 

player_images = [jack_right_1, jack_right_2, jack_right_3] 

class Player(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.image = player_images 
     self.rect = self.image.get_rect() 
     self.pos = vec(WIDTH - 650, HEIGHT - 700) 
     self.standing = False 
     self.vel = vec(0, 0) 
     self.acc = vec(0, 0) 

    def update(self): 
     self.acc = vec(0, PLAYER_GRAVITY) 
     keystate = pg.key.get_pressed() 
     if keystate[pg.K_LEFT]: 
      player.image = pg.image.load(player_images[counter]) 
      counter = (counter + 1) % len(player_images) 

由於某種原因,每當我嘗試運行它時,它都會說'list'對象沒有屬性'get_rect'。我知道你不能從列表中得到一個矩形,但是然後你如何製作一個圖像列表並獲得每個圖像的矩形?

回答

0

看起來你很接近!問題是player_images(因此self.image)實際上存儲列表Surface對象而不是個人Surface。如果你想存儲Rect對象的列表,你可以通過他們循環,像這樣:

class Player(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.images = player_images 
     self.rects = [] 
     for image in self.images: 
      self.rects.append(image.get_rect()) 

另外,如果你需要一個班輪這做同樣的事情,考慮一個列表理解來代替:

class Player(pg.sprite.Sprite): 
    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.images = player_images 
     self.rects = [image.get_rect() for image in self.images] 
+0

謝謝你的幫忙! –

0

pygame.sprite.Spriteimage屬性必須是單一曲面。僅將player_images的第一張圖像指定爲self.image。由於您致電self.rect = self.image.get_rect(),但您的self.image是一個沒有get_rect方法的列表,因此引發錯誤。

您還需要一個屬性來跟蹤當前圖像的索引(在以下示例中,我將其稱爲self.counter)。

現在要更新圖像,您將增加self.counter並使用模數len(player_images)來避免IndexErrors。然後,您使用self.counter索引更新self.imageself.image = player_images[self.counter]

class Player(pg.sprite.Sprite): 

    def __init__(self): 
     pg.sprite.Sprite.__init__(self) 
     self.counter = 0 # Index of the current image. 
     # Assign the first player image. 
     self.image = player_images[self.counter] 
     self.pos = vec(WIDTH - 650, HEIGHT - 700) 
     # Now get_rect works. Set the center or topleft to self.pos. 
     self.rect = self.image.get_rect(center=self.pos) 
     self.standing = False 
     self.vel = vec(0, 0) 
     self.acc = vec(0, 0) 

    def update(self): 
     self.acc = vec(0, PLAYER_GRAVITY) 
     keystate = pg.key.get_pressed() 
     if keystate[pg.K_LEFT]: 
      # Increment the counter. 
      self.counter = (self.counter + 1) % len(player_images) 
      # And finally change the image. 
      self.image = player_images[self.counter] 
+0

另外,請勿在所有時間都會調用的方法中加載圖像。像'jack_right1'一樣全局加載它們,然後在程序中重新使用它們。 ---'pg.key.get_pressed()'應該在你的主循環中被調用。然後,您可以將'keystate'列表傳遞給所有需要它的精靈。 – skrx

+0

謝謝你的幫助。我現在正在工作。但是,如何控制圖像切換的速度? –