Objeto que no se comporta correctamente

Estoy usando Livewires y pygame, y uno de mis objetos en el juego que te da vidas extra se está confundiendo con un asteroide, y cuando los objetos de vidas extra chocan con el jugador, el objeto “Vidas extra no tiene atributo handle_caught” mensaje de error, así que por favor puedo tener alguna ayuda.

class Extralives(games.Sprite): global lives image = games.load_image('lives.png', transparent = True) speed = 2 def __init__(self,x,y = 10): """ Initialize a asteroid object. """ super(Extralives, self).__init__(image = Extralives.image, x = x, y = y, dy = Extralives.speed) def update(self): """ Check if bottom edge has reached screen bottom. """ if self.bottom>games.screen.height: self.destroy() self.add_extralives def add_extralives(self): lives+=1 

La clase de asteroides:

 class Asteroid(games.Sprite): global lives global score """ A asteroid which falls through space. """ image = games.load_image("asteroid_med.bmp") speed = 1.7 def __init__(self, x,image, y = 10): """ Initialize a asteroid object. """ super(Asteroid, self).__init__(image = image, x = x, y = y, dy = Asteroid.speed) def update(self): """ Check if bottom edge has reached screen bottom. """ if self.bottom>games.screen.height: self.destroy() score.value+=10 def handle_caught(self): if lives.value>0: lives.value-=1 self.destroy_asteroid() if lives.value <= 0: self.destroy_asteroid() self.end_game() def destroy_asteroid(self): self.destroy() 

parte de la clase de jugador que maneja las colisiones:

 def update(self): """ uses A and D keys to move the ship """ if games.keyboard.is_pressed(games.K_a): self.x-=4 if games.keyboard.is_pressed(games.K_d): self.x+=4 if self.left  games.screen.width: self.right = games.screen.width self.check_collison() def ship_destroy(self): self.destroy() def check_collison(self): """ Check if catch pizzas. """ global lives for asteroid in self.overlapping_sprites: asteroid.handle_caught() if lives.value <=0: self.ship_destroy() for extralives in self.overlapping_sprites: extralives.add_extralives() 

Aquí está tu problema:

 for asteroid in self.overlapping_sprites: asteroid.handle_caught() if lives.value <=0: self.ship_destroy() 

El hecho de que usted llame asteroid su variable de bucle no significa que mágicamente solo va a ser un asteroide. ¡No si tienes otros tipos de objetos con los que puedes chocar! overlapping_sprites es todos sprites superpuestos, no solo asteroides. En algún momento el asteroid es un objeto ExtraLives . Cuando intenta llamar a handle_caught() en él, esto obviamente falla porque ExtraLives no tiene un método handle_caught() .

La solución más sencilla aquí es cambiar el nombre de add_extralives a handle_caught en su clase ExtraLives . Después de todo, está haciendo lo mismo: manejar la situación en la que choca con (o "captura") el objeto, es solo un tipo diferente de objeto, por lo que el resultado debe ser diferente, que usted especifica al proporcionar un código diferente. Ser capaz de implementar tipos de comportamiento completamente diferentes al llamar a los mismos métodos (llamado "polymorphism") es el punto principal de la progtwigción orientada a objetos.

El siguiente bucle tiene un problema similar, ya que está llamando a add_extralives() en objetos que podrían no ser del tipo ExtraLives . Afortunadamente, puedes eliminar este código ya que ya estás manejando esta situación cambiando el nombre de add_extralives a handle_caught .

 for extralives in self.overlapping_sprites: extralives.add_extralives()