2017-07-18 83 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

谢谢你的帮助。我现在正在工作。但是,如何控制图像切换的速度? –