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
CodePudding user response:
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 #<---
