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

如何创建行走动画?(Pygame,python),python,pygame,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")

这是我的密码

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”属性。我知道你不能从列表中得到一个rect,但是你如何制作一个图像列表并为每个图像得到rect呢

看来你们很接近了!问题是,player_图像和self.image实际上存储了一个曲面对象列表,而不是单个曲面。如果要存储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())
P>可选的,如果你需要一个同样的事情,考虑列表理解:
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]
pygame.sprite.sprite的图像属性必须是单个曲面。仅将玩家图像的第一个图像指定给self.image。由于调用self.rect=self.image.get\rect,但self.image是一个没有get\rect方法的列表,因此引发了错误

您还需要一个属性来跟踪当前图像的索引,在下面的示例中,我称之为self.counter

现在要更新映像,请增加self.counter并使用模lenplayer_映像以避免索引器。然后使用self.counter索引更新self.image self.image=player\u images[self.counter]


另外,不要在总是被调用的方法中加载图像。像jack_right1一样全局加载它们,然后在程序中重用它们。-pg.key.get_pressed可能应该在主循环中调用。然后您可以将keystate列表传递给所有需要它的精灵。谢谢您的帮助。我现在可以用了。但是,如何控制图像切换的速度?要控制动画速度,您可以使用类似的计时器,并在时间结束时增加图像索引。谢谢您的帮助!
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]