Problemas con Clases y Escenas

Hola, como están? Tuve un problema al incorporar escenas y menú a un juego. El juego es simple, un personaje debe atrapar diferentes palabras que caen desde arriba. Y ahí es donde me apareció el inconveniente. Las imágenes que caen están en una lista y usando un método random, éste las va eligiendo, se cargan y se van creando una cada 3 segundos, y colisionan con el personaje cada vez que las atrapa. (Ésto funcionaba hasta que agregué menú y escenas).

El código es el siguiente:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

class EscenaMenu(pilasengine.escenas.Escena):

    def iniciar(self):
        self.pilas.fondos.Fondo("palabras/indicador.png")
        self.pilas.actores.Menu(
        [
            ('Iniciar Juego', self.iniciar_juego),
            ('Salir', self.salir_del_juego),
        ])

    def iniciar_juego(self):
        self.pilas.escenas.EscenaJuego()

    def salir_del_juego(self):
        print("Tengo que salir...")
        pilas.terminar()

class Personaje(pilasengine.actores.Actor):
    def iniciar(self):
        self.imagen = pilas.imagenes.cargar_animacion("palabras/personaje.png", 2)
        self.y = -150
        self.escala = 0.7
        self.radio_de_colision = 30
        .
		#resto de metodos

class Palabra(pilasengine.actores.Actor):

    def iniciar(self):
        self.velocidad = self.pilas.azar(1, 2)
        self.y = 300
        self.x = self.pilas.azar(-300, 300)
        self.escala = 0.25
        self.radio_de_colision = 35
        self._elegir_imagen_y_sonido()

    def actualizar(self):
        self.y -= self.velocidad

    def eliminar(self):
        self._reproducir_sonido()
        # Se invoca la destruccion del actor.
        pilasengine.actores.Actor.eliminar(self)

    def _reproducir_sonido(self):
        self.sonido.reproducir()

    def _elegir_imagen_y_sonido(self):
        imagenes = ['palabras/abuela2.png', 'palabras/andador1.png', 'palabras/atuela1.png', 'palabras/cafetera4.png', 'palabras/camiseta5.png']
        sonidos = ['sonidos/a1.wav', 'sonidos/explosion.wav', 'sonidos/explosion.wav', 'sonidos/explosion.wav', 'sonidos/e1.wav']
      
        cantidad = len(imagenes)
        indice = self.pilas.azar(0, cantidad - 1)
        # cargamos la imagen y el sonido al azar
        self.imagen = imagenes[indice]
        self.sonido = self.pilas.sonidos.cargar(sonidos[indice])
		
    def eliminar_palabra(Personaje, Palabra):
        Palabra.eliminar()

        # Definimos las colisiones, pero usando 'etiquetas'
        pilas.colisiones.agregar('Personaje', 'Palabra', eliminar_palabra)

    # Gener una imagen (letra) cada 3 segundos
    def crear_palabra():
        pilas.actores.Palabra()

        pilas.tareas.siempre(3, crear_palabra)

class EscenaJuego(pilasengine.escenas.Escena):

    def iniciar(self):
        self.pilas.fondos.Fondo("palabras/fondo.png")
        self.pilas.actores.Personaje()
        self.pilas.actores.Palabra()
        self.pilas.actores.Sonido()
        self.puntaje = pilas.actores.Puntaje(280, 200, color="blanco")

# Vinculamos las escenas
pilas.escenas.vincular(EscenaMenu)
pilas.escenas.vincular(EscenaJuego)

# Vinculamos los actores Personalizados
pilas.actores.vincular(Personaje)
pilas.actores.vincular(Palabra)
pilas.escenas.EscenaMenu()

pilas.ejecutar()
 

Uno de los problemas, es que ya no me genera mas el actor “palabra” que son las imágenes random que caen desde arriba. Y solo crea una imagen y ni si quiera hay colisión.
Si alguien puede ver el error o decirme que puedo modificar, les agradezco.

Saludos!!

Hola @Fabian_Montecino, por lo que veo el problema estaría en el método crear_palabra de tu clase Palabra, tendrías que eliminarlo y en todo caso agregarlo dentro de la clase EscenaJuego así:

class EscenaJuego(pilasengine.escenas.Escena):

    def iniciar(self):
        self.pilas.fondos.Fondo("palabras/fondo.png")
        self.pilas.actores.Personaje()
        self.pilas.actores.Sonido()
        self.puntaje = pilas.actores.Puntaje(280, 200, color="blanco")
        
        pilas.tareas.siempre(3, self.crear_una_palabra)
        
    def crear_una_palabra(self):
        self.pilas.actores.Palabra()

Hola @hugoruscitti, muchas gracias por la respuesta, lo modifiqué y anduvo bien! A pesar de que lo había intentado hacer de esa manera pero no lo estaba haciendo así.

Ahora siguiendo con el mismo ejemplo, hay un método que es “eliminar_palabra”, donde se encuentra la colisión entre el actor “personaje” y el actor “palabra”, e intenté definirla en la clase “EscenaJuego” y me sale error, no se si es por los parámetros que le paso al método, o está mal definida.

El código sería éste:

class EscenaJuego(pilasengine.escenas.Escena):

    def iniciar(self):
        self.pilas.fondos.Fondo("palabras/fondo.png")
        self.pilas.actores.Personaje()
        self.pilas.actores.Palabra()
        self.pilas.actores.Sonido()
        self.puntaje = pilas.actores.Puntaje(280, 200, color="blanco")

        pilas.tareas.siempre(3, self.crear_palabra)
        pilas.colisiones.agregar('Personaje', 'Palabra', eliminar_palabra)

    def crear_palabra(self):
        self.pilas.actores.Palabra()

    def eliminar_palabra(Personaje, Palabra):
        Palabra.eliminar()

Hola @Fabian_Montecino, a simple vista me parece que hay que corregir dos cosas:

En la función pilas.colisiones.agregar, eliminar_palabra es un método de la clase, así que tendrías que referenciarla como self.eliminar_palabra y agregar self como primer parámetro:

class EscenaJuego(pilasengine.escenas.Escena):

    def iniciar(self):
        # código anterior ...
        self.pilas.colisiones.agregar('Personaje', 'Palabra', self.eliminar_palabra)

    def eliminar_palabra(self, personaje, palabra):
        palabra.eliminar()

Omití varias lineas de código, pero creo que con ese cambio va a funcionar bien.

Graaaaciaaaaaasss @hugoruscitti!! Que genio, funcionó de diez!!

Abrazo!!