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?
Preguntas y respuestas: qué es y cómo funciona - Leer antes de postear (http://www.comunidadgm.org/preguntas-y-respuestas/preguntas-y-respuestas-que-es-y-como-funciona-leer-antes-de-postear/)
Jangse, recuerda colocar el icono de la versión de GM que usas.
Cita de: Daz en Enero 19, 2014, 03:16:20 PM
Preguntas y respuestas: qué es y cómo funciona - Leer antes de postear (http://www.comunidadgm.org/preguntas-y-respuestas/preguntas-y-respuestas-que-es-y-como-funciona-leer-antes-de-postear/)
Jangse, recuerda colocar el icono de la versión de GM que usas.
Oops! Se me había olvidado. Ya esta...
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.
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
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.
(http://imagizer.imageshack.us/v2/800x600q90/713/fktp.png) (https://imageshack.com/i/jtfktpp)
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
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.
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 (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
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 !
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
Lo que puedo decir, según mi insípida experiencia, estos errores son de lógica, no del GM. Digo, hay un 0.01% de Probabilidad de que sea un bug del GM y un 99.99% de que sea un error en el código que has escrito.
Sube tu archivo de GM y seguro damos con la solución
Cita de: Jangse en Enero 31, 2014, 07:27:35 PM
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
Pero que Diablos?!?!!?! Oye, en definitiva el problema es codigo tuyo o.O, te molestaria subir el editable? Ya he visto mil de cosas que podrian funcionar O.o.... No te sientas obligado pero..... Creo que nunca lo acomodaras tu solo, subelo y lo pones en el tema o se lo das a alguien en quien confies :3 (Es el problema mas simple sin haber tenido resultados o.O)
EDIT:
Cita de: penumbra en Enero 31, 2014, 10:08:11 PM
Lo que puedo decir, según mi insípida experiencia, estos errores son de lógica, no del GM. Digo, hay un 0.01% de Probabilidad de que sea un bug del GM y un 99.99% de que sea un error en el código que has escrito.
Sube tu archivo de GM y seguro damos con la solución
No vi el comentario xDD, bueh, es lo que dije ;P
Comparto la opinion de los compañeros: debe haber un error en la logica de tu codigo, que en el GM se traduce en que Eventos pones las acciones.
Sube tal vez un editable sin sprites, ni backgrounds etc, solo lo necesario para que podamos ayudarte. Por que lo que tu deseas hacer en tu juego es posible.
Saludos !
Cita de: penumbra en Enero 31, 2014, 10:08:11 PM
Lo que puedo decir, según mi insípida experiencia, estos errores son de lógica, no del GM. Digo, hay un 0.01% de Probabilidad de que sea un bug del GM y un 99.99% de que sea un error en el código que has escrito.
Sube tu archivo de GM y seguro damos con la solución
Sí, no hay ningún problema. Si no lo he subido antes, no ha sido por miedo a que alguien copie el juego. De hecho, no deja de ser un borrador o prueba para ir aprendiendo las funciones y programación con GML. Y creo que hacer un juego de laberintos es idóneo para eso.
Es solamente el primer nivel y al pasarlo te enfrentas al boss o jefe de turno. El gráfico del jefe si lo he quitado por que me lo ha dibujado otra persona. En su lugar he puesto un gif de un sprite sheet. Cuando eliminas al jefe, no pasa nada por que no esta hecho el otro nivel.
Seguro que tendrá muchos fallos, al margen del que estoy comentando en este post. Pero el que mas me interesa ahora, es lo de lives y health.
También podéis comprobar que si os quedáis tres veces sin energía, el juego se acaba y en cambio marca una vida.
Y si os quedáis con cero vidas, puede ser que aún marque que tenéis energía. Que es lo que me da rabia.
Quiero, que cuando salga el show_message con game over, abajo marque 0 vidas 0 energía.
TECLADO:
Teclas cursor: Movimientos del personaje.
Barra espaciadora: Disparo.
Listo. Lo que hacías primero era que cuando la salud llegaba a cero, se reiniciaba a 100 y restabas una vida
if (health == 0) {
health = 100;
lives -= 1;
}
Luego revisabas si el número de vidas era cero, para poner la salud también en cero, terminarr el juego y mostrar mensaje
if (lives == 0) {
health = 0;
show_message('Game Over');
game_restart();
}
No sabía que esto pasaba, pero me da la impresión ( a menos que otra cosa pase y yo lo ignore) que en cuanto terminas el juego, el evento DRAW no lee ya el valor de la variable health, que sí cambia en STEP a cero. El evento DRAW se ejecuta después que STEP, pero yo moví el código de terminar el juego a DRAW y hacía lo mismo, seguía mostrando el valor de healt mayor a cero. Se me hace normal no saber esto ya que hasta ahora en mi proyecto nunca he usado las funciones que terminan/reinician el juego XD
Lo que hice fue editar un poco los IF que ajustan energía y vida. Y SOBRE TODO, mover el bloque que termina el juego ANTES del bloque que revisa vidas, para que si en STEP las vidas se acaban, dar oportunidad que se ejecute DRAW y esperar hasta el otro STEP para revisar que las vidas son cero y terminar el juego
Al principio de STEP
if (!health) and (!lives) //Si vidas y salud son cero
{
show_message('Game Over');
game_restart();
}
Al final de STEP
if (lives >= 1) //Si tienes al menos una vida...
{
if (health < 1) //... y se te acaba la salud
{
lives -= 1;
health = 100; //Quitar una vida y reiniciar la salud
}
}
else
health = 0; // Si ya no te quedan vidas, la salud se acaba
Antes tenías healt = 0 en el bloque que terminaba el juego, eso hacía que nunca cambiara la energía a cero en DRAW, por eso lo saqué y lo puse en el último IF-ELSE
penumbra, muchas gracias por tomarte la molestia de mirar el código. En parte funciona. Pero si te fijas, la energía nunca llega a cero. Me refiero cuando te tocan esas serpientes verdes. Se queda en 1 y ya no descuenta mas vidas. De todas formas, ahora me mirare bien tus correcciones y voy a ver si puedo solucionar eso :)
En el objeto Héroe, en la colisión contra las serpientes, agregué una condición extra al IF mientras trasteaba con tu código, quita esa condición extra y listo
if (invencible == false) and (obj_Control.health > 1)
lo cambias a
if (invencible == false)
se me había olvidado :-[ Lo acabo de probar y funciona, las serpientes me mataron por completo
Cita de: penumbra en Febrero 01, 2014, 08:48:04 PM
En el objeto Héroe, en la colisión contra las serpientes, agregué una condición extra al IF mientras trasteaba con tu código, quita esa condición extra y listo
if (invencible == false) and (obj_Control.health > 1)
lo cambias a
if (invencible == false)
se me había olvidado :-[ Lo acabo de probar y funciona, las serpientes me mataron por completo
¡¡¡ POR FIN !!! :D Ahora esto si funciona al 100%. Muchas gracias de nuevo por tu ayuda.
Yo pensaba que dentro del step se podría poner el código en el orden que quisiéramos. Pero veo que no. Ahora me estudiare bien el código para encontrar su lógica.
Tampoco conocía que esta expresión !health era lo mismo a poner health == 0.
Y un apunte mas...en este código tuyo pones al obj_Control delante de la variable. Pero no es necesario ¿Verdad? Por que son variables del propio GM ¿No?
if (obj_Control.lives >= 1)
{
if (obj_Control.health < 1)
{
obj_Control.lives -= 1;
obj_Control.health = 100;
}
}
else
obj_Control.health = 0;
Bueno, un saludo. Ya posteare el juego cuando lo tenga acabado. Aunque me queda un mundo para aprender...jejeje.
De nada, es bueno saber que ya funciona.
Cita de: Jangse en Febrero 01, 2014, 09:00:21 PM
Tampoco conocía que esta expresión !health era lo mismo a poner health == 0.
!algo es una de mis expresiones favoritas, pero para mi sorpresa...
He hecho pruebas en GM:S y ahora no me deja usar !health, sino que forzosamente tengo que usar (healt == 0). Escribo esto como aviso o por si a alguien sí le funciona me diga cómo. >:(
Y sí, todo afecta en STEP, todo está "vivo". Si cambias una variable y más adelante, en el mismo evento hay decisiones basadas en su valor, el cambio les afecta
Ampliando la respuesta de penumbra
El problema era que tu codigo siempre mostraba algun valor en la parte de ENERGIA cuando la caja de texto GAME OVER aparecia.
Error se daba en esta parte del codigo:
else
{
show_message("Game Over");
restart_game();
}
Osea "congelar" (freeze) el juego mientras que se muestre la caja de texto con el texto
"GAME OVER" hasta que se presione el boton OK de la caja de texto, cuando esto suceda( cklick en Ok) debe reiniciar el juego.
Entonces? ... Bueno que no estamos "dejando" que el GM muestre los valores que este paso le esta asignando a las variables health y lives, porque congelamos el juego y inmediatamente despues reiniciamos el juego.
El reiniciar el juego, evitaba que el evento DRAW (que va algo despues de ENDSTEP) dibuje en la pantalla el nuevo valor de health.
Por cierto me gusta mucho el efecto de "scalines" que aplicas al juego.
Saludos !
obj_Control.lives = 1;
Significa que a la variable lives del obj_Control se le va ha asignar el valor de 1
El punto indica a que objeto se va aplicar la funcion o en este caso la modificacion de la variable lives, osea el punto indica que lo que esta del lado derecho del punto se le va ha aplicar a lo que este del lado izquierdo.
Esto permite realizar cambios a variables, llamar funciones, comparar el valor de una variable etc. de un objeto dentro de otro. Es como un control remoto.
Es lo mismo que cuando usas Drag n Drop y de las tres opciones: self,other,object, seleccionaras object, luego sale un menu en el que debes escojer el objeto al que deseas que se le aplique la accion.
Se le conoce como operador selector de miembro/instancia
Cita de: vampy09 en Febrero 02, 2014, 03:08:31 AM
obj_Control.lives = 1;
Significa que a la variable lives del obj_Control se le va ha asignar el valor de 1
Bueno, yo a lo que me refiero es que sin poner delante de la variable lives el obj_control el código me funciona igual. Ya que tanto lives, health, score son tratadas por game maker como variables globales. Y en el step de nuestro personaje pongo así el código y me funciona perfectamente.
Cita de: vampy09
Osea "congelar" (freeze) el juego mientras que se muestre la caja de texto con el texto
"GAME OVER" hasta que se presione el boton OK de la caja de texto, cuando esto suceda( cklick en Ok) debe reiniciar el juego.
Sí, en post anteriores ya comenté que algo de esto podía suceder. Es decir, que no le diéramos tiempo al código para actualizar la variable.
Cita de: vampy09
El reiniciar el juego, evitaba que el evento DRAW (que va algo despues de ENDSTEP) dibuje en la pantalla el nuevo valor de health.
Esto es algo que debo aprender. Osea, ver la lógica de los Begin step, step y end step. Pero yo, en mi juego, no tengo definido ningún evento end step. Solo step a secas.
Cita de: vampy09Por cierto me gusta mucho el efecto de "scalines" que aplicas al juego.
Saludos !
Gracias. Me gustan los juegos con ese ambiente retro. Osea, que no se muestren con colores demasiado planos. Aunque no me gusta al 100% como queda. Ya trataré de mejorarlo. Ahora prefiero empaparme de código. El apartado gráfico lo encuentro mas sencillo.
Saludos!
Cita de: Jangse en Febrero 02, 2014, 12:25:36 PM
Cita de: vampy09 en Febrero 02, 2014, 03:08:31 AM
obj_Control.lives = 1;
Significa que a la variable lives del obj_Control se le va ha asignar el valor de 1
Bueno, yo a lo que me refiero es que sin poner delante de la variable lives el obj_control el código me funciona igual. Ya que tanto lives, health, score son tratadas por game maker como variables globales. Y en el step de nuestro personaje pongo así el código y me funciona perfectamente.
No es que no entiendas como se usa el "." sino que utilizarlo con varibles como health o lives o en tu codigo es redundante. Tienes toda la razon! Disculpa es que aveces no leo con cuidado. :-P
Con respecto al los graficos, siendo sincero para mi es la primera vez que en juego de GM que veo este efecto. Se y entiendo que tu juego esta en una etapa beta y mucho del juego puede llegar a cambiar, pero en humilde mi opinion, esta efecto aporta mucha personalidad a los graficos y logra la sensacion de un arcade retro.
Saludos
Man soy nuevo en game maker pero lo que yo aria seria al comienzo del juego crear una variable "Vidas" (ya que no conoso si GM biene con una variable predefinida para saber cuantas vidas tiene el pj) entonces cada vez que el personaje pierda una vida ademas tienes que agregar el evento de set var con el nombre vidas y -1 relativo, de esta forma se restara 1 vida a lo que ya tienes, ademas creas un objet que estara siempre en el juego con un test variable en el event step para comprobar si "Vidas" es igual a 0, si esto es haci pues agregas el codigo o action correspondiente para setear la energia a 0
Cita de: 7sixerCF en Febrero 02, 2014, 08:59:03 PM
Man soy nuevo en game maker pero lo que yo aria seria al comienzo del juego crear una variable "Vidas" (ya que no conoso si GM biene con una variable predefinida para saber cuantas vidas tiene el pj) entonces cada vez que el personaje pierda una vida ademas tienes que agregar el evento de set var con el nombre vidas y -1 relativo, de esta forma se restara 1 vida a lo que ya tienes, ademas creas un objet que estara siempre en el juego con un test variable en el event step para comprobar si "Vidas" es igual a 0, si esto es haci pues agregas el codigo o action correspondiente para setear la energia a 0
Gracias por el comentario. Pero gracias a la ayuda de los demás usuarios he podido solucionarlo. Y ahora prefiero dejarlo así. Saludos.