是什么导致属性问题?

时间:2018-02-11 11:20:22

标签: attributes pygame

该属性有什么问题?

class player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.movex = 0
        self.movey = 0
        self.frame = 0
        self.images = []
        for i in range(1, 5):
            img = pygame.image.load(os.path.join('Assets','Arts','xeonsheet','xeonsheet_' + str(i) + '.png')).convert()
            self.images.append(img)
            self.image = self.images[0]
            self.rect = self.images.get_rect()

    def control(self, x, y):  #Control player movement

        self.movex += x
        self.movey += y

    def update(self):    #Update sprite position

        self.rect.x = self.rect.x + self.movex
        self.rect.y = self.rect.y + self.movey

        # moving left
        if self.movex < 0:
            self.frame += 1
            if self.frame > 3 * ani:
                self.frame = 0


        # moving right
        if self.movex > 0:
            self.frame += 1
            if self.frame > 3 * ani:
                self.frame = 0


player = player()
player.rect.x = 0
player.rect.y = 0
player_list = pygame.sprite.Group()
player_list.add(player)
ani = 4
steps = 10

错误:

Traceback (most recent call last):
  File "C:/Users/Acer/PycharmProjects/Dreamwind-Chronicles/main.py", line 148, in <module>
    player = player()
  File "C:/Users/Acer/PycharmProjects/Dreamwind-Chronicles/main.py", line 122, in __init__
    self.rect = self.images.get_rect()
AttributeError: 'list' object has no attribute 'get_rect'

1 个答案:

答案 0 :(得分:0)

您似乎试图从Rect列表中创建self.images对象。这里的问题是self.images列表而不是pygame.image,因此它没有get_rect()方法。您应该做的是从该列表中的 图像之一获取Rect

另一个问题是您在for循环中运行此代码,因此每个图像的矩形都会被正在进行的图像覆盖。

您的代码应如下所示:

class player(pygame.sprite.Sprite):
def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.movex = 0
    self.movey = 0
    self.frame = 0
    self.images = []
    for i in range(1, 5):
        img = pygame.image.load(os.path.join('Assets','Arts','xeonsheet','xeonsheet_' + str(i) + '.png')).convert()
        self.images.append(img)
        self.image = self.images[0]

    self.rect = self.image.get_rect() #The part that was changed

def control(self, x, y):  #Control player movement

    self.movex += x
    self.movey += y

def update(self):    #Update sprite position

    self.rect.x = self.rect.x + self.movex
    self.rect.y = self.rect.y + self.movey

    # moving left
    if self.movex < 0:
        self.frame += 1
        if self.frame > 3 * ani:
            self.frame = 0


    # moving right
    if self.movex > 0:
        self.frame += 1
        if self.frame > 3 * ani:
            self.frame = 0

但是,这假设self.images列表中的每个图像大小相同。如果它们的大小不同,则播放器的Rect将仅缩放到第一张图像。要更改此设置,您可以更新更新方法中的self.rect。但是,我不打算扩展它,因为它不是问题的真正部分。