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
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!
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()
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
NOTA: Este post se abrió con una consulta sobre tareas, por favor para dudas diferentes abre post nuevo, gracias
muchas gracias igual eso de round me sirvio un monton