这是我的代码。
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 :(得分: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())