Hola, buenas, damas, caballeros... Resulta que estaba programando una versión de Assasins Creed Unity Pay 2 Win para móviles en 2D cuando me topé con un problema que ninguno de mis estudiantes de ingeniería informática subcontratados pudo resolver (Esta parte es en broma).

Bueno, el lío es el siguiente, yo tengo un Bucle for en el evento draw, el cual se supone que debería dibujar la cantidad de vidas, dividiendo los valores en corazones y medios corazones, los cuales deberían estar animados. Los corazones están animados, efectivamente. Pero la cuestión es que la barra no se actualiza cuando cambia la vida del personaje, salvo en las siguientes ocasiones:
Cuando la vida es menor a cero. O cuando tengo puesta la pausa. Ambas condiciones están declaradas antes del propio Bucle for, y ya estuve trasteando varias opciones, pero por más que lo intento no encuentro el fallo.

Les dejo aquí el código para que lo comprueben ustedes mismos a ver en qué falla. (Y... Sí, es el código de MontyDrake)

               if global.PauseBool = 0 //prioridad, cuando la pausa esté activa, la GUI cambia completamente.                      {if object_exists (obj_player_father) && (obj_player_father.Energy>0)
{for (i= 0; i<obj_player_father.MaxEnergy div 2; i++)
{if (i<obj_player_father.MaxEnergy div 2)
{draw_sprite (spr_energy_hard, -1, drawl+i*34, drawt)}
else if (obj_player_father.Energy mod 2 !=0) && (!doneBool)
{draw_sprite (spr_energy_soft, -1, drawl+i*34, drawt) doneBool=true}}}}

Y si colocas que se actualice cuando la vida sea menor al maximo? Envés de cuando sea menor que cero

Cita de: MasterMaker en Octubre 19, 2017, 03:31:20 AM
Y si colocas que se actualice cuando la vida sea menor al maximo? Envés de cuando sea menor que cero

Omisión mia. Hay dos condicionales que no puse. El objeto jugador padre debe existir y su vida debe ser mayor a cero (por éso no se dibuja nada cuando la vida es menor que cero) pero el bucle for debería aplicar a todos los valores intermedios, cosa que por alguna razón no hace.

Deberías poner un dibujo para que podamos entender mejor cómo quieres dibujar los corazones.

Ordené el código para que sea un poco más fácil de leer y cambié algunas cosas.
En los ifs es mejor usar == para estar seguros de que se hace una comparación y no una asignación.
Creo que sería mejor comprobar primero que el objetos existe y después comparar la variable Energy usando dos ifs.
Mejor usa una variable local para guardar el valor de obj_player_father.MaxEnergy div 2, así no se realiza la operación en cada ciclo.
El primer if que está dentro del ciclo for siempre se va a cumplir porque tiene la misma condición que el ciclo for. La parte else if nunca se va a ejecutar.
[gml]
if (global.PauseBool == 0) //prioridad, cuando la pausa esté activa la GUI cambia completamente
if object_exists (obj_player_father)
if (obj_player_father.Energy > 0)
{
  m = obj_player_father.MaxEnergy div 2;
  for (i=0; i<m; i++)
  {
    if (i < m)
    {
      draw_sprite (spr_energy_hard, -1, drawl+i*34, drawt)
    }
    else if (obj_player_father.Energy mod 2 !=0) && (!doneBool)
    {
      draw_sprite (spr_energy_soft, -1, drawl+i*34, drawt);
      doneBool = true;
    }
  }
}
[/gml]