Tarea condicional

hola quisiera poder entender esta funcion de pilas-engine por que en la documentacin no esta bien explicada

Buenas, @Federico_Sironi!

Tienes razón al decir que esa tarea no está bien explicada… de hecho yo ni la conocía :smile:

Así que he estado haciendo unas pruebas para ver cómo funciona. Por lo que he podido ver, una tarea condicional se cumple MIENTRAS se cumple la condición de la función. Una vez deja de cumplirse la condición la tarea condicional se ELIMINA automaticamente. Mira este ejemplo:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()
mono.aprender('MoverseConElTeclado')

def mono_hablar():
    if mono.x >=0:
        mono.decir('Hola')
        return True
    else:
        return False

mi_tarea = pilas.tareas.condicional(3,mono_hablar)

pilas.ejecutar()

En este ejemplo, mientras el mono permanezca a la derecha de la pantalla irá diciendo “Hola” cada 3 segundos.

Una vez el mono pase a la izquierda de la pantalla la condición dejará de cumplirse y la tarea condicional terminará.

Es decir, que una vez hayamos pasado a la izquierda, aunque el mono vuelva a la derecha ya no dirá nada.

Si lo que quieres es una tarea “persistente” (es decir, que se ejecute y evalue constantemente dependiendo de una condición programada por ti) creo que sería mejor usar una tarea “siempre”:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Mono()
mono.aprender('MoverseConElTeclado')

def mono_hablar():
    if mono.x >=0:
        mono.decir('Hola')
    else:
        pass

mi_tarea = pilas.tareas.siempre(3,mono_hablar)

pilas.ejecutar()

En este segundo ejemplo, mientras el mono esté a la derecha irá diciendo “Hola”, y cuando pase a la izquierda no dirá nada. Al volver a la derecha en este caso SI volverá a decir “Hola”.

Entonces depende de tus necesidades el usar una forma u otra.

Y recuerda que llegado el momento puedes eliminar la tarea cuando no la necesites más:

mi_tarea.terminar()

Un saludo! :wink:

1 me gusta

no no podria usar la tarea siempre porque mi actor es un actor que dispara y si uso siempre cuando lo mato queda disparando

#inicio pilas
# coding: utf-8
import pilasengine
pilas = pilasengine.iniciar()

#defino la municion
class MiMunicion(pilasengine.actores.Actor):
def iniciar(self):
self.imagen = “aguiita.png”
self.aprender(self.pilas.habilidades.PuedeExplotar)
self.radio_de_colision = 3

#defino mi actor principal
class Soldado(pilasengine.actores.Actor):
def iniciar(self):
animacion = pilas.imagenes.cargar_animacion(“soldado.png”,5,4)
self.imagen = animacion
#aqui defino los sprints
animacion.definir_animacion(“derecha”,[0, 1, 2], 19)
animacion.definir_animacion(“izquierda”,[5, 6, 7], 19)
animacion.definir_animacion(“arriba”,[15, 16, 17], 19)
animacion.definir_animacion(“abajo”,[10, 11, 12], 19)
self.aprender(self.pilas.habilidades.PuedeExplotar)

    def actualizar(self):
        def Shot(grados):
            self.aprender("disparar",municion=MiMunicion , angulo_salida_disparo = grados, grupo_enemigos =soldadoenemigo, cuando_elimina_enemigo =soldadoenemigo.eliminar)

        #hago que dispare y que se mueva                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    	if self.pilas.control.arriba:
            self.imagen.cargar_animacion("arriba")
            self.imagen.avanzar()
            self.y += 2
            Shot(90) 
        if self.pilas.control.abajo:
            self.imagen.cargar_animacion("abajo")
            self.imagen.avanzar()
            self.y -= 2
            Shot(270) 
        if self.pilas.control.derecha:
            self.imagen.cargar_animacion("derecha")
            self.imagen.avanzar()
            self.x += 2
            Shot(0) 
        if self.pilas.control.izquierda:
            self.imagen.cargar_animacion("izquierda")
            self.imagen.avanzar()
            self.x -= 2
            Shot(180) 

#creo el enemigo

class SoldadoEnemigo(pilasengine.actores.Actor):
    def iniciar(self):
        animacion = pilas.imagenes.cargar_animacion("soldado2.png",5,4)
        self.imagen = animacion
        animacion.definir_animacion("derecha",[0, 1, 2], 19)
        animacion.definir_animacion("izquierda",[5, 6, 7], 19)
        animacion.definir_animacion("arriba",[15, 16, 17], 19)
        animacion.definir_animacion("abajo",[10, 11, 12], 19)
        self.vida = 10
        self.aprender(self.pilas.habilidades.PuedeExplotar)
        #tarea
        self.tarea_disparar= pilas.tareas.siempre(2, self.realizar_disparo)
           
    def actualizar(self):
        #con esto se mueve automaticamente y suigue al personaje
        if self.y > soldado.y : 
            self.imagen.cargar_animacion("abajo")
            self.imagen.avanzar()
            self.y -= 1
        if self.y < soldado.y : 
            self.imagen.cargar_animacion("arriba")
            self.imagen.avanzar()
            self.y += 1
        if self.y == soldado.y:
            if self.x > soldado.x : 
                self.imagen.cargar_animacion("izquierda")
                self.imagen.avanzar()
                self.x -= 1
            if self.x < soldado.x : 
                self.imagen.cargar_animacion("derecha")
                self.imagen.avanzar()
                self.x += 1
         

        #funcion para realizar la tarea

    def realizar_disparo(self):
        if self.x == soldado.x :
            if self.y >soldado.y :
                self.aprender("disparar", control=None, municion= MiMunicion, angulo_salida_disparo =270, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar) 
                self.disparar()
                return True               
            if self.y <soldado.y :
                self.aprender("disparar", control=None, municion=MiMunicion, angulo_salida_disparo =90, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar) 
                self.disparar()
                return True                
        if self.y == soldado.y :
            if self.x >soldado.x :
                self.aprender("disparar", control=None, municion= MiMunicion, angulo_salida_disparo =180, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar)
                self.disparar()
                return True                 
            if self.x <soldado.x :
                self.aprender("disparar", control=None, municion=MiMunicion, angulo_salida_disparo =0, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar)     
                self.disparar()
                return True
        
     


















soldadoenemigo = SoldadoEnemigo(pilas)
soldado = Soldado(pilas)
soldado.crear_figura_de_colision_rectangular(0,-5,14,52)
soldadoenemigo.crear_figura_de_colision_rectangular(0,-5,14,52)

Para eso está esa función…

Cuando tu actor muere es tan fácil como esto:

def cuando_muere_mi_actor():
    mi_actor.eliminar()
    mi_tarea.terminar()
1 me gusta

podrias revisar el codigo que te e mnadado arriva

La ‘y’ del soldado y la del enemigo dificilmente van a poder ser iguales, ya que se definen en decimales muy largos. Por tanto es mejor redondearlos:

def actualizar(self):
        #con esto se mueve automaticamente y suigue al personaje
        if self.y > soldado.y : 
            #self.imagen.cargar_animacion("abajo")
            #self.imagen.avanzar()
            self.y -= 1
        elif self.y < soldado.y : 
            #self.imagen.cargar_animacion("arriba")
            #self.imagen.avanzar()
            self.y += 1
        if round(self.y) == round(soldado.y):
            if self.x > soldado.x : 
                #self.imagen.cargar_animacion("izquierda")
                #self.imagen.avanzar()
                self.x -= 1
            elif self.x < soldado.x : 
                #self.imagen.cargar_animacion("derecha")
                #self.imagen.avanzar()
                self.x += 1
         

    #funcion para realizar la tarea

    def realizar_disparo(self):
        if round(self.x) == round(soldado.x) :
            if self.y >soldado.y :
                self.aprender("disparar", control=None, municion= MiMunicion, angulo_salida_disparo =270, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar) 
                self.disparar()
                return True               
            elif self.y <soldado.y :
                self.aprender("disparar", control=None, municion=MiMunicion, angulo_salida_disparo =90, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar) 
                self.disparar()
                return True                
        if round(self.y) == round(soldado.y):
            if self.x >soldado.x :
                self.aprender("disparar", control=None, municion= MiMunicion, angulo_salida_disparo =180, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar)
                self.disparar()
                return True                 
            elif self.x <soldado.x :
                self.aprender("disparar", control=None, municion=MiMunicion, angulo_salida_disparo =0, grupo_enemigos =soldado, cuando_elimina_enemigo =  soldado.eliminar)     
                self.disparar()
                return True

Creo que deberías considerar la posibilidad de poner tu juego en una escena propia, para poder delegarle a la escena algunas cosas como esta. Por ejemplo una colisión entre el proyectil y el soldado.

Otra cosa que veo es que obligas a aprender “disparar” simultaneamente con la ‘x’ y la ‘y’, cada una con su ángulo… Prueba de momento a que dispare sólo en horizontal o sólo en vertical, por que ahora mismo tu actor se “hace un lío” con el ángulo de disparo :smile:

NOTA: Este post se abrió con una consulta sobre tareas, por favor para dudas diferentes abre post nuevo, gracias :wink:

muchas gracias igual eso de round me sirvio un monton :relaxed: :stuck_out_tongue_closed_eyes: