【问题标题】:Class attribute error while creating python object创建python对象时出现类属性错误
【发布时间】:2022-11-13 17:02:43
【问题描述】:

我正在写一个小游戏。我想从同一个类创建两个对象并将它们组合成一个组。但是在创建第二个对象时,出现错误“AttributeError: 'Enemy' object has no attribute 'get_rect'”

这是与问题相关的代码

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = enemy
        self.rect = self.image.get_rect()
        self.rect.center = (200, 200)
        self.speedx = random.randint(1, 10)
        self.speedy = random.randint(1, 10)
        self.collis = 0
        self.enemy_health = 5
        self.enemy_rect = pygame.rect.Rect((self.rect.x + 35, self.rect.y + 20), (35, 15))
        self.skin = 0
        self.skin_index = 0
        self.skins = [enemy, enemy_1, enemy_2]
        self.left_skins = [pygame.transform.flip(self.skins[0], True, False),
                           pygame.transform.flip(self.skins[1], True, False),
                           pygame.transform.flip(self.skins[2], True, False)]
        self.move_enemy = 1

    def update(self, collis):

        self.enemy_rect = pygame.rect.Rect((self.rect.x + 35, self.rect.y + 20), (35, 15))
        if self.move_enemy == 1:
            if self.collis < 1:
                self.speedx = random.randint(1, 2)
                self.speedy = random.randint(1, 2)
                if player.player_x_pos > self.rect.x:
                    self.rect.x += self.speedx
                    self.skin += 1
                    if self.skin % 10 == 0:
                        self.skin_index += 1
                        if self.skin_index > 2:
                            self.skin_index = 0
                    self.image = self.skins[self.skin_index]

                if player.player_y_pos + 50 > self.rect.y:
                    self.rect.y += self.speedy
                    self.skin += 1
                    if self.skin % 10 == 0:
                        self.skin_index += 1
                        if self.skin_index > 2:
                            self.skin_index = 0
                    self.image = self.skins[self.skin_index]

                if player.player_x_pos < self.rect.x:
                    self.rect.x -= self.speedx
                    self.skin += 1
                    if self.skin % 10 == 0:
                        self.skin_index += 1
                        if self.skin_index > 2:
                            self.skin_index = 0
                    self.image = self.left_skins[self.skin_index]

                if player.player_y_pos + 50 < self.rect.y:
                    self.rect.y -= self.speedy
                    self.skin += 1
                    if self.skin % 10 == 0:
                        self.skin_index += 1
                        if self.skin_index > 2:
                            self.skin_index = 0
                    if player.player_x_pos < self.rect.x:
                        self.image = self.left_skins[self.skin_index]
                    else:
                        self.image = self.skins[self.skin_index]

            else:
                self.collis = 0
            # if self.enemy_health <= 0:
            #     del enemy
            print('Health:', self.enemy_health)
        if self.move_enemy == 2:
            if self.rect.y <= 550:
                self.rect.y += 2
            else:
                self.rect.y -= 2

enemy = Enemy()
enemy2 = Enemy()
enemy2.rect.center = (100, 100)
scene_1_sprites.add(enemy2)
scene_1_sprites.add(enemy)

但是该类具有必要的属性

我试图像这样创建第二个对象: 敌人2 = 敌人

但最终只有一个对象

【问题讨论】:

  • 欢迎来到堆栈溢出。 “但是类有必要的属性” 用你自己的话来说,你认为这是为什么?你认为这个价值来自哪里?您使它具有该属性的代码在哪里?
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: python class pygame attributes


【解决方案1】:

是的,Enemy当然没有get_rect方法。错误信息非常清楚。这里的问题是:

class Enemy(pygame.sprite.Sprite):
   def __init__(self):
       pygame.sprite.Sprite.__init__(self)
       self.image = enemy                      #<---
       self.rect = self.image.get_rect()        

这是因为 enemy 本身就是一个 Enemy 对象:

enemy = Enemy()

您很可能对pygame.Surface(图像)的对象实例和Enemy 的对象实例使用了相同的名称(enemy)。您不能对 2 个不同的事物(变量)使用相同的名称。因此,创建第一个 enemy" 将起作用,但所有后续的都将失败。

修改图片名称:

enemy = pygame.image.load(....)

enemy_image = pygame.image.load(....)
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = enemy_image              #<---

【讨论】:

    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2021-08-29
    相关资源
    最近更新 更多