Class attribute error while creating python object

Question:

I am writing a small game. I want to create two objects from the same class and combine them into a group. But when creating the second object, an error occurs "AttributeError: ‘Enemy’ object has no attribute ‘get_rect’"

Here is the code related to the problem

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)

But the class has the necessary attribute

I tried to create the second object like this:
enemy2 = enemy

But in the end there was only one object

Asked By: Lambert

||

Answers:

Yes, of course an Enemy does not have a get_rect method. The error message is very clear. The problem here is:

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

This is because the enemy is itself an Enemy object:

enemy = Enemy()

Most likely you have used the same name (enemy) for the object instance of the pygame.Surface (image) and the object instance of the Enemy. You cannot use the same name for 2 different things (variables). So creating the first enemy" will work, but all subsequent ones will fail.

Change the name of the image:

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              #<---
Answered By: Rabbid76
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.