Al detener tiempo, como eliminar actor

Hola, como están! Feliz Año Nuevo para todos! Los mejores deseos para éste año que comienza.

Mi problema es el siguiente, tengo varias escenas, y se me complica utilizar actores y variables de otras escenas o de clases individuales.

Puntualmente lo que he hecho es un juego donde un personaje toma objetos que caen desde arriba, todo esto en la escena principal llamada EscenaJuego. Y cuando el tiempo llega a cero, necesito que estos elementos dejen de generarse, y éste es mi problema, no logro detener/eliminar a los actores que caen desde arriba.

Les muestro la parte de código:

class Pares(pilasengine.actores.Actor):

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

      #... resto de métodos

   class Impares(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.aprender(pilas.habilidades.PuedeExplotarConHumo)
        self._elegir_imagen()
        
        #.... resto de métodos 

class EscenaJuego(pilasengine.escenas.Escena):

    def iniciar(self):
        self.pilas.fondos.Fondo("palabras/fondo.png")
        self.pilas.actores.Vampiro()
        self.pilas.actores.Impares()
        self.pilas.actores.Pares()
        self.pilas.actores.Sonido()
        self._crear_boton_volver()
        self.puntaje = pilas.actores.Puntaje(280, 225, color="amarillo")
        actor_texto = self.pilas.actores.Actor()
        actor_texto.imagen = "palabras/textos/tiempo1.png"
        actor_texto.escala = 1.2
        actor_texto.x = -80
        actor_texto.y = 225
        actor_texto.x = [280, -80, -20], 0.5
        texto_puntaje = self.pilas.actores.Actor()
        texto_puntaje.imagen = "palabras/textos/puntaje.png"
        texto_puntaje.escala = 1.2
        texto_puntaje.x = 50
        texto_puntaje.y = 225
        texto_puntaje.x = [280, 80, 200], 0.5


        self.contador = pilas.actores.Texto("")
        self.contador.y = 225
        self.contador.x = 30
        self.contador.color = "amarillo"
        self.actualizar_tiempo()
        self.actualizar_puntaje()
        self.reproducir_sonido_fondo()


        pilas.tareas.siempre(5, self.crear_palabra_impar)
        pilas.colisiones.agregar('Vampiro', 'Impares', self.eliminar_palabra_impar)
		
        pilas.tareas.siempre(3, self.crear_palabra_par)
        pilas.colisiones.agregar('Vampiro', 'Pares', self.eliminar_palabra_par)

        pilas.tareas.siempre(1, self.descontar_tiempo)


    # Esta funcion se ejecutara 1 vez por segundo
    def descontar_tiempo(self):
        global tiempo
        tiempo = tiempo - 1

    #  reducimos el contador.
        if tiempo >= 0:
            self.contador.texto = str(tiempo) # tiempo es un numero, asi que lo tenemos que convertir a texto con str.


    # Si tiempo es cero.
        if tiempo == 0:
       
        # Aquí es donde he intentado agregar funciones eliminar, pero no anda o me da error.
        # Pares.eliminar()  o  self.crear_palabra_par.eliminar()
        # Impares.eliminar() o  self.crear_palabra_impar.eliminar()       

            global sonido_fondo
            self.detener_sonido()
            actor_tiempo = self.pilas.actores.Actor()
            actor_tiempo.imagen = "palabras/textos/tiempo_juego.png"
            actor_tiempo.y = -500
            actor_tiempo.escala = 4
            actor_tiempo.escala = [0.90], 1.5
            actor_tiempo.y = [0], 1
            #cuando tiempo llega a cero, luego de 5 seg nos envía a EscenaTerminar
            pilas.tareas.una_vez(5, self.pilas.escenas.EscenaTerminar)  

    def actualizar_tiempo(self):
        global tiempo
        tiempo = 10


    def actualizar_puntaje(self):
        global cantidad_aciertos, cantidad_errados, cantidad_puntos_total
        cantidad_aciertos = 0
        cantidad_errados = 0
        cantidad_puntos_total = 0

    def reproducir_sonido_fondo(self):
        global sonido_fondo
        sonido_fondo = pilas.sonidos.cargar('palabras/audio/AskRufus.wav')
        sonido_fondo.reproducir(repetir=True)

    def detener_sonido(self):
        global sonido_fondo
        sonido_fondo.detener()


    def crear_palabra_par(self):
        self.pilas.actores.Pares()

    def eliminar_palabra_par(self, Vampiro, Pares):
        global cantidad_aciertos, cantidad_puntos_total     #accedemos a la variable global
        Pares.eliminar()
        self.puntaje.aumentar(10)
        cantidad_aciertos += 1
        cantidad_puntos_total +=10

    def crear_palabra_impar(self):
        self.pilas.actores.Impares()

    def eliminar_palabra_impar(self, Vampiro, Impares):
        global cantidad_errados, cantidad_puntos_total     #accedemos a la variable global
        Impares.eliminar()
        sonido_de_explosion = pilas.sonidos.cargar('sonidos/explosion.wav')
        sonido_de_explosion.reproducir()
        pilas.camara.vibrar()
        self.puntaje.reducir(5)
        cantidad_errados += 1
        cantidad_puntos_total -= 5

    def _crear_boton_volver(self):
        pilas.actores.BotonVolver()

Cuando el tiempo llega a cero, necesito que dejen de caer objetos porque si el personaje sigue colisionando con esos objetos el puntaje se sigue modificando. Y he dejado a propósito un tiempo en la escena, una vez que el tiempo llega a cero muetra unos mensajes y a los 5 segundos pasa a otra escena.

Hola @Fabian_Montecino, ¡Feliz año nuevo!

No llegué a probar tu código, pero me imagino que en tu código vas a tener dos formas de controlar eso.

Alternativa 1: deteniendo la tarea

Lo más sencillo es “detener” la tarea de creación de actores. Fijate que en el manual hay un ejemplo super sencillo de esto: Manejo de tiempo con tareas - pilas-engine

Básicamente tendrías que guardar el identificador de la tarea, y luego llamar a “terminar” para que dejen de crearse.

En tu código, podrías cambiar:

pilas.tareas.siempre(3, self.crear_palabra_par)

por:

self.tarea_crear_pares = pilas.tareas.siempre(3, self.crear_palabra_par)

y ahora que tienes la variable tarea_crear_pares, podrías detener la creación así:

self.tarea_crear_pares.terminar()

Eso sí, tendrías que hacer lo mismo con la otra tarea también, que genera las palabas impares.

Alternativa 2: usando una variable de control

Otra forma de evitar que se generen constantemente los objetos es tener una variable de control, que indique si se tienen que generar objetos o no.

Por ejemplo, al comenzar el juego podría ser:

juego_en_curso = True

y en la función desconectar_tiempo (que maneja el fin de la escena), podrías llevar esa variable a false:

    # Esta funcion se ejecutara 1 vez por segundo
    def descontar_tiempo(self):
        global tiempo
        global juego_en_curso     ### ESTO ES NUEVO
        tiempo = tiempo - 1

        if tiempo == 0:
            juego_en_curso = False           ### ESTO ES NUEVO

Ahora bien, con esa variable lo único que faltaría es usarla para controlar cuando crear elementos y cuando no, pienso que las

    def crear_palabra_par(self):
        global juego_en_curso

        if juego_en_curso:
            self.pilas.actores.Pares()

    def crear_palabra_impar(self):
        global juego_en_curso

        if juego_en_curso:
            self.pilas.actores.Impares()

Se que parece mucho código, pero me parece que también puede ser una buena forma de encararlo.

Abrazo !!!

Muchas gracias Hugo!! Me parece interesante el uso de variables de control.
En éstos momento implementé la alternativa 1 que es más sencilla, pero en otro juego voy a tratar de usar variables de control.

Abrazo y gracias por la respuesta!!