Ayuda con la barra de energia

Muy buenas a todos!!!.. Necesito ayuda quiero que cuando la barra de energia este en cero un personaje se elimine algo parecido a este codigo:

> import pilasengine

> pilas = pilasengine.iniciar()

> mono = pilas.actores.Shaolin()

> mono.x = -100

> enemigo = pilas.actores.Banana(x = 100 , y = 0)
> energia  =pilas.actores.Energia(x = 200,y= 100)
> energia.progreso = 100 

> def cuando_toca(mono,enemigo):
>     energia.progreso = [energia.progreso - 50]  
> pilas.colisiones.agregar(mono,enemigo,cuando_toca)

> obtener_resultado = energia.progreso 
> if obtener_resultado == 0:
>     mono.eliminar()




> pilas.ejecutar()

el problema es que al final cuando la energía es cero la condicion no se cumple…:sweat_smile: tal vez sea un error de novato :sweat_smile: pero… necesito su ayuda

Buenas, @Lening_Guaman!

Antes que nada, te aconsejo leer este post, en él se explica como mostrar correctamente tu código en un post:

El indexar correctamente el código nos ayuda a dar mejores respuestas!

Dicho esto, me parece que el error está en que el if no se comprueba nunca. Para eso debería estar dentro de una función que fuera llamada, o en la def actualizar() (que se comprueba automaticamente 60 veces por segundo).

Pero lo más fácil va a ser sin duda incluir ese if de comprobación de la energía DENTRO de la def de la colisión. De esa manera cada vez que haya una colisión se restará la energia, y se comprobará su valor.

def cuando_toca(mono,enemigo):
    energia.progreso -=  50
    
   if energia.progreso <= 0:
       mono.eliminar()
    
pilas.colisiones.agregar(mono,enemigo,cuando_toca)

Un saludo! :wink:

EDITO:
He estado haciendo pruebas, y me he dado cuenta de que tu barra de energia no se resta de golpe, sinó que lo hace con una animación:

Entonces lo que pasa es que cuando entra al if, el valor de la barra aún no es 0. De esta forma, el personaje no muere hasta la tercera colisión, cuando la barra de energía es menor que 0 y se cumple el if.

Para esto hay dos soluciones posibles (seguro que hay más, pero no se me ocurren):

1.- Agregar una tarea que añada un retardo de 1 segundo para la comprobación del valor de la energía.

def comprobar():
    obtener_resultado = energia.progreso
    pilas.avisar(str(obtener_resultado))
    if obtener_resultado <1:
        #obtener_resultado <= 0 da problemas
        mono.eliminar()

def cuando_toca(mono,enemigo):
    energia.progreso = [energia.progreso - 50]
    pilas.tareas.agregar(1, comprobar)
              
pilas.colisiones.agregar(mono,enemigo,cuando_toca)

2.- Que el valor a comprobar no sea 0, sinó menos que la vida que se le resta:

def cuando_toca(mono,enemigo):
    energia.progreso = [energia.progreso - 50]
    obtener_resultado = energia.progreso 
    if obtener_resultado <= 50:
    #curiosamente <50 da comportamiento anómalo
        mono.eliminar()  
pilas.colisiones.agregar(mono,enemigo,cuando_toca)

Personalmente, si la energía a restar es muy grande (como en el ejemplo, que es de 50) yo usaría el retardo, para que el actor no se elimine antes de que la barra llegue a 0. Si lo que se le resta es poco (5, ó 10) yo usaría el segundo ya que carga menos la ejecución.

Y pensando ya en un futuro, en el que el actor se enfrentará a diferentes enemigos cada uno con una fuerza diferente, no estaria mal añadir un atributo “fuerza” a cada enemigo para hacer las comprobaciones automaticamente:

import pilasengine

pilas = pilasengine.iniciar()

mono = pilas.actores.Shaolin()

mono.x = -100

enemigo = pilas.actores.Banana()
enemigo.x = 100
enemigo2 = pilas.actores.Banana()
enemigo2.x = -200
energia = pilas.actores.Energia(x = 200,y= 100)
energia.progreso = 100

enemigo.fuerza = 50
enemigo2.fuerza = 10

def cuando_toca(mono,enemigo):
    energia.progreso = [energia.progreso - enemigo.fuerza]
    print(str(energia.progreso))
    if energia.progreso <= enemigo.fuerza:
            mono.eliminar()
            
pilas.colisiones.agregar(mono,enemigo,cuando_toca)
pilas.colisiones.agregar(mono,enemigo2,cuando_toca)
    
pilas.ejecutar()

Si tienes tiempo y paciencia podrías revisar este juego mío donde los actores tienen cada uno su propia “vida” y “fuerza” y su propia barra de energía.

Muchas Gracias por tu ayuda @jordinur :blush: … Un abrazo :smiley: