Enero 19, 2014, 03:14:28 PM Ultima modificación: Enero 19, 2014, 03:28:59 PM por Jangse
Pues eso...

Tengo realizado el típico código para esto. Es decir, tenemos 3 vidas y 100% de energía. Dependiendo el tipo de enemigo, uno resta energía y otro nos quita una vida por colisión.

Cuando la energía llega a cero nos restan una vida. Hasta que tenemos cero vidas y cero energía. Entonces mi código funciona bien. Pero el problema es este:

- Se da el caso que colisionamos con el enemigo que nos resta una vida con solo tocarnos. Entonces, se muestra cero vidas y en muchos casos 100% de energía o menos. Y claro, me gustaría que al llegar a cero vidas nos mostrara como un contador que fuera descendiendo la energía de golpe y acabara el juego.

No tiene mucho sentido tener cero vidas y con la barra de energía a tope ¿No?

Tengo este código en event Step:

if  lives := 0 then
    begin
        health := 0;
        show_message('Game Over. Puntos: ' + string(score));
        game_restart();
    end;



En el event Draw, esta el código que muestra los valores de Vida, Energía, Puntos, etc...

draw_text(view_xview[0]+32,view_yview[0]+440,'Energia: ' + string(health));
draw_text(view_xview[0]+32,view_yview[0]+460,'Vidas: ' + string(lives));



Tampoco entiendo por que la función draw_text tiene como argumento final string ¿No debería ser una variable numérica?



Bueno, centrándome en el código, la solución la veo en cambiar un poquito lo que tienes en el Step, por algo como esto:

if lives<=1
{
if lives!=0 {lives=0};
if healt!=0 {healt-=1} else {healt=0; show_message('Fin de Juego. Puntos: '+string(score)); game_restart}
};


El código en Draw no le he visto mal, de cualquier modo, y en cuanto a la pregunta del por qué del 'string' en la función draw_text, si solo fuese una variable numérica, no podrías añadir fácilmente cosas como - 'Vidas: '+string(vidas) -, es decir, puedes añadir textos y operaciones de variables en lugar de sólo números.

Saludos.

Primero de todo gracias por el interés DEADOFALL. Pero no me ha funcionado el código.

Mira...en el evento step del personaje (aparte de los movimientos del mismo), tengo dos bloques de código:

if health = 0 {
    health = 100;
    lives -= 1;
    }


De inicio partimos con tres vidas (lives). Y energía (health) con 100 unidades. Cuando la energía llega a cero, nos restan una vida. Este código, entonces, funciona bien.

Pero lo que quería yo, es que al llegar a cero vidas el juego termine. Y si en ese momento, tenemos aún energía, que esta tome el valor de cero y se reinicie el juego. Entonces cree este código a continuación del otro:

if lives = 0 {
    health = 0;
    show_message('Game Over. Puntos: ' + string(score));
    game_restart();
    }


Y ahí tengo el problema...

Que la pantalla muestra (Por ejemplo):

Energía: 45
Vidas: 0

Y el juego se reinicia. Quiero que si tengo aún energía y cero vidas, que la energía se disminuya a cero. Y el juego comience.

El código en el step lo tengo así:

if health = 0 {
    health = 100;
    lives -= 1;
    }

   
if lives = 0 {
    health = 0; // ESTE VALOR DE CERO NUNCA SE LLEGA A MOSTRAR AUN CON CERO VIDAS. AHÍ ESTA EL PROBLEMA...
    show_message('Game Over. Puntos: ' + string(score));
    game_restart();
    }

Entiendo y es muy sencillo, el código que te he dado está y funciona bien, el problema es tu código que yo desconocía:

if health=0 {health = 100; lives -= 1};

Pues ese código nunca permite llegar a tener healt=0, así que, cámbialo por éste:

if healt=0 {if lives!=0 {lives-=1; healt=100}};

Este cambio en el código, añadido al código que ya te he cedido, debería funcionar.

Saludos.

#6 Enero 29, 2014, 03:32:57 AM Ultima modificación: Enero 29, 2014, 03:34:52 AM por vampy09
Ampliando un poco lo que DEADOFALL explicó, string() es una función que permite convertir valores numericos a texto, permitiendo de esta manera concatenar una variable del tipo entera ( ej: 56, 23, - 3) o real ( 6.78, -489.65 ) con texto.

Ejemplo :

salud = 100; // declaracion y asignacion variable entera

draw_string(x, y, "P1 Salud: " + string(salud));// texto mostrado en pantalla >>> P1 Salud: 100
The next best thing to knowing something,
is knowing where to find it.

Cita de: DEADOFALL en Enero 28, 2014, 11:37:56 PM
Entiendo y es muy sencillo, el código que te he dado está y funciona bien, el problema es tu código que yo desconocía:

if health=0 {health = 100; lives -= 1};

Pues ese código nunca permite llegar a tener healt=0, así que, cámbialo por éste:

if healt=0 {if lives!=0 {lives-=1; healt=100}};

Este cambio en el código, añadido al código que ya te he cedido, debería funcionar.

Saludos.

Me sabe mal dar tanto la lata con este tema. Pero hasta que no lo solucione no quiero seguir avanzando en el juego. Y eso que es un maze. De los mas sencillos y tal.

He probado tu código pero me pasa igual. Te pongo una captura de pantalla y puedes ver como con cero vidas, queda 88 de energía. Pero el juego se acaba. No me importa que quede 88 de energía. Pero de ser así, que el código lo ponga a cero.


Oye..... En realidad no veo el problema o.O, veamos por ejemplo, este codigo que estaba unos mensajes atras

if healt=0 {if lives!=0 {lives-=1; healt=100}};

Despues viene, este?
show_message('Game Over. Puntos: ' + string(score));

Por que no quitas la energia?
Energia=0

Oseaaa...

if healt=0
{if lives!=0
{lives-=1; healt=100 Energia=0
show_message('Game Over. Puntos: ' + string(score));}
}

Yo lo veo perfecto o.O

#9 Enero 29, 2014, 09:02:09 PM Ultima modificación: Enero 29, 2014, 09:04:02 PM por penumbra
Cita de: TLT96 en Enero 29, 2014, 08:45:26 PM
Yo lo veo perfecto o.O

:-\ No.

Esto NO ES una comparación.
if healt = 0        // Esto es una asignación, una asignación no debería usarse como condición aquí

ESTO SÍ ES una comparación.
if healt == 0        // Esto es una comparacion, el valor de healt no se altera, sólo se compara

No ví con detenimiento el código, sólo me llamó la atención cómo estás manejando los IF. Es muy probable que estos errores son los que estén provocando las fallas

En el primer caso, la variable healt (creo que se te refieres a "health") recibe el valor de cero, después el if evalúa la expresión, y como se encuentra con que es falsa (cero), el bloque if en realidad no se ejecuta.

Creo que GM en los IFs le es igual que utilices el signo = o ==, ya que en ambos caso realiza la comparación. Es decir, un IF no asigna, solo compara.

Cita de: TLT96 en Enero 29, 2014, 08:45:26 PM
Oye..... En realidad no veo el problema o.O, veamos por ejemplo, este codigo que estaba unos mensajes atras

if healt=0 {if lives!=0 {lives-=1; healt=100}};

Despues viene, este?
show_message('Game Over. Puntos: ' + string(score));

Por que no quitas la energia?
Energia=0

Oseaaa...

if healt=0
{if lives!=0
{lives-=1; healt=100 Energia=0
show_message('Game Over. Puntos: ' + string(score));}
}

Yo lo veo perfecto o.O

Tu código no marcha. Ya que se da el caso que nos quedamos a cero de energía y con dos vidas y el juego se reinicia.

Créeme que estoy probando todos los códigos y no va ninguno. Tengo la duda si el código que pone el resultado en el HUD puede ser un problema:

draw_text(view_xview[0]+32,view_yview[0]+440,'Energia: ' + string(health));

Ya que convierte la variable health en string. No sé si hay algún método para reflejar el valor de health en valor entero y no string. Pero la función draw_text no me lo permite.

#12 Enero 29, 2014, 09:31:32 PM Ultima modificación: Enero 29, 2014, 10:17:50 PM por penumbra
Cita de: Jangse en Enero 29, 2014, 09:09:09 PM
Creo que GM en los IFs le es igual que utilices el signo = o ==, ya que en ambos caso realiza la comparación. Es decir, un IF no asigna, solo compara.

El IF no compara ni asigna, el IF se limita a evaluar una expresión (ver si es falsa o verdadera).

http://gmc.yoyogames.com/index.php?showtopic=424410#entry3079434  si ves el tema "Checking Variable Comparisons" verás que también se hace la distinción entre = y ==

EDIT: Y bueno, es cierto lo que comentaste, game maker es bastante relajado en ese aspecto y al parecer deja usar = y == de igual manera en las comparaciones  XD

#13 Enero 30, 2014, 12:39:04 AM Ultima modificación: Enero 30, 2014, 05:08:22 AM por vampy09
Prueba este codigo:

*Este codigo va en objeto que utilisas como controlador, ademas que el objeto debe ser "persistente".

Create Event
health = 100;
lives = 3;
// estas dos variables son globales ( aun cuando no llevan global. al inicio del nombre ) vienen "preconstruidas" dentro del GM, y al ser globales, cualquier objeto puede modificar su valor.

Step event
if ( health < 0 )
    {  health = 0; //evita que se muestren numeros negativos en el HUD
     }

if ( health = 0 )
    { lives -= 1;
       if ( lives = 0 )
          { show_message("Game Over. Puntos: " + string(score));
             game_end();   //o puedes usar game_restart();
          }
      else
          { health = 100;
            room_restart();
          }
   }


*Este codigo va en el objeto que utilisas como jugador

Collision Event
obj_enemigo_01     health - 100;    //obj_enemigo_01 es el objeto que utilisas como enemigo                                        //que resta una vida de un solo golpe

obj_enemigo_02   health - n    //colision para los enemigos que restan un poco de energia,                                                                                                                                       
//n representa la cantidad de energia que tu desees



Saludos !
The next best thing to knowing something,
is knowing where to find it.

Nada. Voy probando todos los códigos pero ninguno hace lo que busco. Y creo, que se puede deber que el GM no refresca la variable con el nuevo dato que le damos. O que pasa tan rápido que no llega a actualizarla. De hecho, ya comente, que el debugger de GM no actualiza el health a cero cuando la vida llega a cero también.

Es tan sencillo que al mostrar cero vidas, la energía muestre también cero. Osea, si muestra cero vidas y tenemos, por ejemplo 63% de energía, que el juego antes de reiniciar, nos muestre cero vidas y cero energía. Y luego reinicie. Y no haga como hasta ahora, que muestra en pantalla cero vidas y 63% de energía y reinicia. Y lo he probado todo. Creo que hasta me a aumentado la cabeza de tanto pensar... >:( :D