El jugador tiene vida mostrada en imágenes, 12 para ser exacto.
(https://i.gyazo.com/e3db7c5e883f6ec5206c2ca07273be00.gif)
Aqui todo bien hasta darme cuenta que mi codigo crea imagenes cada vez el valor cambia.
DRAW_GUI
if global. vida = 12
{
draw_sprite(spr_HUD_Vida_Red_Heart,0,72,16)
}
if global. vida = 11
{
draw_sprite(spr_HUD_Vida_Red_Heart,1,72,16)
}
if global. vida = 10
{
draw_sprite(spr_HUD_Vida_Red_Heart,2,72,16)
}
if global. vida = 9
{
draw_sprite(spr_HUD_Vida_Red_Heart,3,72,16)
}
if global. vida = 8
{
draw_sprite(spr_HUD_Vida_Red_Heart,4,72,16)
}
if global. vida = 7
{
draw_sprite(spr_HUD_Vida_Red_Heart,5,72,16)
}
if global. vida = 6
{
draw_sprite(spr_HUD_Vida_Red_Heart,6,72,16)
}
if global. vida = 5
{
draw_sprite(spr_HUD_Vida_Red_Heart,7,72,16)
}
if global. vida = 4
{
draw_sprite(spr_HUD_Vida_Red_Heart,8,72,16)
}
if global. vida = 3
{
draw_sprite(spr_HUD_Vida_Red_Heart,9,72,16)
}
if global. vida = 2
{
draw_sprite(spr_HUD_Vida_Red_Heart,10,72,16)
}
if global. vida = 1
{
draw_sprite(spr_HUD_Vida_Red_Heart,11,72,16)
}
/*if global. vida >= 0
{
global.perdido = 0
}*/
if global. vida <= 0
{
global. vida_npc = 0
effect_create_above (ef_explosion,x,y,0,c_purple);
audio_play_sound (snd_Risa_Malvada,50,false);
instance_deactivate_object(obj_Bola_Orbital_Triple);
instance_deactivate_object(obj_Bola_Orbital_Estrella);
instance_deactivate_object(obj_Escudo_Protector);
instance_deactivate_object(obj_Rayo_Esfera);
instance_deactivate_object(obj_Tiempo);
instance_deactivate_object(obj_Modo_Contra_Reloj);
instance_deactivate_object(obj_NPC_Espectador_amigo);
instance_deactivate_object(obj_NPC_Cazador_amigo);
instance_deactivate_object(obj_NPC_Caminante_amigo);
instance_deactivate_object(obj_NPC_Caminante_Amigo_Plataforma);
instance_deactivate_object(obj_NPC_Merodeador_amigo);
instance_deactivate_object(obj_NPC_Centinela_amigo);
instance_deactivate_object(obj_NPC_Infernal_amigo);
instance_destroy()
}
Como se han podido dar cuenta uso muchos draw_sprite().
if global. vida = "X"
{
draw_sprite(spr_HUD_Vida_Red_Heart,0,72,16)
}
Pero el problema es que nunca los destruyo, y como se crean en las mismas coordenadas que sus antecesores, da la sensación que hay una sola imagen cuando en realidad hay 1 imagen por cada vez que el valor sea alterado, a largo plazo el jugador habrá colisionado con 1000 objetos dañinos y tendrá como 1000 imágenes por daño en vez de 1, por lo tanto.
¿Que debo hacerle al código para que los corazones de vida se mantengan en una sola imagen?
NOTA: No quiero creear números o barras de vida, ya que esto no es un RPG o un juego donde uno sea inevitablemente golpeado, es un plataformas simple donde hay que evitar enemigos.
Para empezar tu código no hace múltiples objetos, puedes usarlo cuantas veces quieras y no tendrás ningún problema de miles de instancias, la función draw_sprite dibuja un sprite en la pantalla durante el step o frame actual y nada más, como el evento draw gui se ejecuta todos los steps o frames entonces tus sprites son dibujados cada frame.
Ahora de que tu método no es nada optimo no lo es, lo natural sería tener sprite de un solo corazón partido en cuatro y re-dibujarlo cuantas veces sea necesario para llenar la vida, pero bueno para hacer tú codigo un poco más optimo sin cambiar nada solo tienes que ponerlo así:
[gml]
draw_sprite(spr_HUD_Vida_Red_Heart, 12-global.vida,72,16)
if global.vida <= 0
{
global.vida_npc = 0
effect_create_above (ef_explosion,x,y,0,c_purple);
audio_play_sound (snd_Risa_Malvada,50,false);
instance_deactivate_object(obj_Bola_Orbital_Triple);
instance_deactivate_object(obj_Bola_Orbital_Estrella);
instance_deactivate_object(obj_Escudo_Protector);
instance_deactivate_object(obj_Rayo_Esfera);
instance_deactivate_object(obj_Tiempo);
instance_deactivate_object(obj_Modo_Contra_Reloj);
instance_deactivate_object(obj_NPC_Espectador_amigo);
instance_deactivate_object(obj_NPC_Cazador_amigo);
instance_deactivate_object(obj_NPC_Caminante_amigo);
instance_deactivate_object(obj_NPC_Caminante_Amigo_Plataforma);
instance_deactivate_object(obj_NPC_Merodeador_amigo);
instance_deactivate_object(obj_NPC_Centinela_amigo);
instance_deactivate_object(obj_NPC_Infernal_amigo);
instance_destroy()
}
[/gml]
Cita de: brunoxzx en Diciembre 14, 2017, 12:45:46 AM
Para empezar tu código no hace múltiples objetos, puedes usarlo cuantas veces quieras y no tendrás ningún problema de miles de instancias, la función draw_sprite dibuja un sprite en la pantalla durante el step o frame actual y nada más, como el evento draw gui se ejecuta todos los steps o frames entonces tus sprites son dibujados cada frame.
Ahora de que tu método no es nada optimo no lo es, lo natural sería tener sprite de un solo corazón partido en cuatro y re-dibujarlo cuantas veces sea necesario para llenar la vida, pero bueno para hacer tú codigo un poco más optimo sin cambiar nada solo tienes que ponerlo así:
[gml]
draw_sprite(spr_HUD_Vida_Red_Heart, 12-global.vida,72,16)
if global.vida <= 0
{
global.vida_npc = 0
effect_create_above (ef_explosion,x,y,0,c_purple);
audio_play_sound (snd_Risa_Malvada,50,false);
instance_deactivate_object(obj_Bola_Orbital_Triple);
instance_deactivate_object(obj_Bola_Orbital_Estrella);
instance_deactivate_object(obj_Escudo_Protector);
instance_deactivate_object(obj_Rayo_Esfera);
instance_deactivate_object(obj_Tiempo);
instance_deactivate_object(obj_Modo_Contra_Reloj);
instance_deactivate_object(obj_NPC_Espectador_amigo);
instance_deactivate_object(obj_NPC_Cazador_amigo);
instance_deactivate_object(obj_NPC_Caminante_amigo);
instance_deactivate_object(obj_NPC_Caminante_Amigo_Plataforma);
instance_deactivate_object(obj_NPC_Merodeador_amigo);
instance_deactivate_object(obj_NPC_Centinela_amigo);
instance_deactivate_object(obj_NPC_Infernal_amigo);
instance_destroy()
}
[/gml]
Creo que alguien se merece un agradecimiento ;).
Supongo que no estaba asiendo mal las cosas después de todo, el motivo por el cual asumí que había muchos objetos en la misma posición, fue que al cambiarle las coordenadas, este creaba la vida actual del jugador en sus respectivas coordenadas, pero como aquí todos tenían la misma coordenada, le di a uno otras coordenada, fue hay que me di cuenta que podían haber 12 dibujos en lugar de 1 actual, ya que faltaría la función "instance_destroy", si quieres les cambias las coordenadas y te darás cuenta que mi código no funciona bien.
por otro lado ¿debo asumir que tu código me permite tener una sola imagen en pantalla de la vida actual? no sera que se esconden detrás del sprite ?
No sé a que te refieras, pero en definitiva ni tú código crea una instancia por cada vez que dibuja la vida, ni tampoco lo hace el mio. Como dije antes draw_sprite no crea instancias y no se debe usar instance_destroy despues de usar draw_sprite.
Cita de: brunoxzx en Diciembre 14, 2017, 08:03:24 AM
No sé a que te refieras, pero en definitiva ni tú código crea una instancia por cada vez que dibuja la vida, ni tampoco lo hace el mio. Como dije antes draw_sprite no crea instancias y no se debe usar instance_destroy despues de usar draw_sprite.
Me refería a que cuando algo se creo con draw_sprite(), no se destruye a menos que uno programe que se destruya bajo ciertas condiciones, por ejemplo, al iniciar el juego, se crea el sprite de la vida del jugador al máximo, cuando sufra daño se crea un sprite encima del ultimo sprite, cuando el jugador se recupere, crea otro sprite encima del ultimo, y de esta forma se irán acumulando mas sprite de la vida del jugador, por lo tanto mi código estaba mal, y no se si el suyo también crea un sprite uno tras otro encima del anterior cuando el valor de la vida cambia.
La función draw_sprite() no crea ni destruye nada, simplemente dibuja un sprite durante un step; toda la pantalla se limpia y actualiza al siguiente de forma automática. Como ya dijo [user]brunoxzx[/user], no se acumula nada, los sprites no son instancias.
Cita de: NiuWeb en Diciembre 14, 2017, 12:15:27 PM
La función draw_sprite() no crea ni destruye nada, simplemente dibuja un sprite durante un step; toda la pantalla se limpia y actualiza al siguiente de forma automática. Como ya dijo [user]brunoxzx[/user], no se acumula nada, los sprites no son instancias.
¿Entonces estaba haciendo bien las cosas desde un principio? ???
En ese aspecto sí.