如何创建步行动画? (Pygame,python)

时间:2017-07-18 01:24:52

标签: python pygame

这是我的代码。

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'。我知道你不能从列表中获取矩形,但是如何制作图像列表并为每个图像获取矩形?

2 个答案:

答案 0 :(得分:1)

image的{​​{1}}属性必须是单个表面。仅将pygame.sprite.Sprite的第一张图片指定给player_images。由于您致电self.image,但您的self.rect = self.image.get_rect()是一个没有self.image方法的列表,因此会引发错误。

您还需要一个属性来跟踪当前图像的索引(在下面的示例中我将其称为get_rect。)

现在要更新图像,您需要增加self.counter并使用模self.counter来避免IndexErrors。然后,您使用len(player_images)索引更新self.counter self.image

self.image = player_images[self.counter]

答案 1 :(得分:0)

看起来你非常接近!问题是player_images(因此self.image)实际存储了Surface个对象的列表而非个人 {{1} }。如果要存储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())