Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: [Solucionado] Que un objeto reaccione a una variable global con retardo  (Leído 321 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pejota

Buenas a todos!

Estoy haciendo un juego de lucha, y tengo el código que veréis a continuación para realizar las barras de vida:

draw_sprite_ext (spr_vida, 0,30, 95,25,1,image_angle,c_black,1);
draw_sprite_ext (spr_vida2, 0,30, 95,-global.vida,1,image_angle,c_white,1);

Hay una barra blanca, que determina la vida que le queda a los personajes, y es la que va descendiendo en base a "global.vida"
y debajo tengo una negra, que no se modifica, a modo de marco para esta barra de vida, para que siempre se pueda ver cuanto era la vida máxima.

Ahora quiero poner una barra roja entre estas dos, que al igual que la blanca, descienda en base a "global.vida" pero con un segundo de retardo, así provocaré el efecto que tienen muchos juegos de lucha, el cual cuando un golpe impacta, durante un poco de tiempo puedes comprobar cuanta cantidad de vida quitó ese golpe, porque queda un rastro rojo temporal marcando la vida que tenía antes el que recibió el golpe, y la que le queda ahora.

Resumo por si he liado a alguien con tanta explicación:

Tengo este código para dibujar una barra de vida:
draw_sprite_ext (spr_vida2, 0,30, 95,-global.vida,1,image_angle,c_white,1);

y quiero dibujar otra en rojo, que haga lo mismo, pero tarde un segundo en actualizar los cambios de "global.vida"

Gracias por adelantado,
Un saludo
« última modificación: Julio 19, 2018, 06:58:54 pm por Pejota »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado BssString

Respuesta #1 en: Julio 19, 2018, 04:07:59 pm
Hola Pejota
No entiendo tu draw event ni porqué usas -global.vida como valor en la xscale... Pero bueno, te diré la lógica que pensé y tu ves si te sirve, si la aplicas y cómo la dibujas.
Puedes crear una queue en el evento Create del personaje que guarde la vida que él tenía 1 seg atrás.
Código: [Seleccionar]
queue = ds_queue_create()
repeat (room_speed) ds_queue_enqueue(queue,global.vida)
En el STEP EVENT vas añadiendo tu vida actual a esta cola.
Código: [Seleccionar]
ds_queue_dequeue(queue)
ds_queue_enqueue(queue,global.vida)
Finalmente, en el evento draw añades una línea más que dibuje la vida que tenías 1 segundo atrás.
Código: [Seleccionar]
draw_sprite_ext (spr_vida, 0,30, 95,25,1,image_angle,c_black,1);
draw_sprite_ext (spr_vida2, 0,30, 95,-ds_queue_head(queue),1,image_angle,c_red,1); //esta línea dibujará el primer valor de la cola y le hará un color blend a c_red.
draw_sprite_ext (spr_vida2, 0,30, 95,-global.vida,1,image_angle,c_white,1);

Entonces cuando recibas por ejemplo, dos golpes seguido, tu vida bajará normalmente, pero se quedará el sprite dibujado en rojo entre medio indicando la vida que tenías 1 segundo atrás y al cabo de 1 segundo se reducirá hasta llegar a tu vida actual.

No olvides eliminar la cola con ds_queue_destroy una vez que ya no sea necesaria.
Código: [Seleccionar]
if ds_exists(queue,ds_type_queue) ds_queue_destroy(queue)
Saludos

 
Los siguientes usuarios dieron las gracias a este tema: Pejota


Desconectado Pejota

Respuesta #2 en: Julio 19, 2018, 06:16:23 pm
Hola Pejota
No entiendo tu draw event ni porqué usas -global.vida como valor en la xscale... Pero bueno, te diré la lógica que pensé y tu ves si te sirve, si la aplicas y cómo la dibujas.
Puedes crear una queue en el evento Create del personaje que guarde la vida que él tenía 1 seg atrás.
Código: [Seleccionar]
queue = ds_queue_create()
repeat (room_speed) ds_queue_enqueue(queue,global.vida)
En el STEP EVENT vas añadiendo tu vida actual a esta cola.
Código: [Seleccionar]
ds_queue_dequeue(queue)
ds_queue_enqueue(queue,global.vida)
Finalmente, en el evento draw añades una línea más que dibuje la vida que tenías 1 segundo atrás.
Código: [Seleccionar]
draw_sprite_ext (spr_vida, 0,30, 95,25,1,image_angle,c_black,1);
draw_sprite_ext (spr_vida2, 0,30, 95,-ds_queue_head(queue),1,image_angle,c_red,1); //esta línea dibujará el primer valor de la cola y le hará un color blend a c_red.
draw_sprite_ext (spr_vida2, 0,30, 95,-global.vida,1,image_angle,c_white,1);

Entonces cuando recibas por ejemplo, dos golpes seguido, tu vida bajará normalmente, pero se quedará el sprite dibujado en rojo entre medio indicando la vida que tenías 1 segundo atrás y al cabo de 1 segundo se reducirá hasta llegar a tu vida actual.

No olvides eliminar la cola con ds_queue_destroy una vez que ya no sea necesaria.
Código: [Seleccionar]
if ds_exists(queue,ds_type_queue) ds_queue_destroy(queue)
Saludos

Perdón por no ser más espefícico. Las barras de vida las controlo con objetos dedicados a ello: obj_vidaP1 y obj_vidaP2, en Create tienen:

global.vida = 25; 

global.vida2 = -25;

Correspondientemente, para que la barra de la izquierda se vaya reduciendo hacia la izquierda, y la de la derecha hacia la derecha como en cualquier juego de lucha

y en el evento Draw de estos objetos, tengo lo que ya dije arriba.

Igualmente utilicé lo que me dijiste en estos objetos y funcionó! Mil gracias!... Bueno, funcionó en el obj_vidaP1, en el obj_vidaP2 no. Quizás porque funciona en número negativos? No sé que ocurre. Tal como está salta un error, y si en el evento Create pongo:
queue = ds_queue_create()
repeat (-room_speed) ds_queue_enqueue(queue,global.vida)

añadiéndole "-" al room_speed, deja de dar error, pero la barra roja se actualiza casi a la vez que la de vida. Estoy probando a trastear el código para solucionarlo, pero no lo consigo.
« última modificación: Julio 19, 2018, 06:39:46 pm por Pejota »

 


Desconectado BssString

Respuesta #3 en: Julio 19, 2018, 06:30:34 pm
Hola Pejota.

Ahora entiendo mejor tu código, perdón...
En ese caso te sugiero duplicar todo el código para una segunda DS QUEUE.
Ej:
Código: [Seleccionar]
queue1 = ds_queue_create()
queue2 = ds_queue_create()

Crear una segunda ds_queue que guarde la vida del segundo jugador (global.vida2), duplicas el código del Create para que te llene ambas queue, duplicas el step para que se aplique también en la segunda barra de vida y duplicas el código en draw para que se dibuje la segunda barra de vida y duplicas el código de limpieza para que se eliminen las dos DS.

Como dato, no debería afectar que el número sea negativo o positivo, ya que copia el dato tal cual como lo tienes en la variable global.vida, lo importante es que dspués lo dibujes con el signo bien.

Nos comentas si funciona

Saludos

 
Los siguientes usuarios dieron las gracias a este tema: Pejota


Desconectado Pejota

Respuesta #4 en: Julio 19, 2018, 06:58:25 pm
Hola Pejota.

Ahora entiendo mejor tu código, perdón...
En ese caso te sugiero duplicar todo el código para una segunda DS QUEUE.
Ej:
Código: [Seleccionar]
queue1 = ds_queue_create()
queue2 = ds_queue_create()

Crear una segunda ds_queue que guarde la vida del segundo jugador (global.vida2), duplicas el código del Create para que te llene ambas queue, duplicas el step para que se aplique también en la segunda barra de vida y duplicas el código en draw para que se dibuje la segunda barra de vida y duplicas el código de limpieza para que se eliminen las dos DS.

Como dato, no debería afectar que el número sea negativo o positivo, ya que copia el dato tal cual como lo tienes en la variable global.vida, lo importante es que dspués lo dibujes con el signo bien.

Nos comentas si funciona

Saludos

¡¡Solucionado!!
El error lo estaba dando una tontería...
Ya había probado a hacer lo que me pusiste de "queue2", pero nada funcionaba. Al final, harto de que me diese error comprobé que todo estuviera en obj_vida2 como en obj_vida1, y había una pequeña diferente... En Create tengo el código dividido en dos hojas de código, la que tiene la variable "global.vida", y la que tiene la nueva variable para la queue que me proporcionaste, y en el obj_vida2 tenía la variable de la queue antes que la variable "global.vida2", y eso generaba el error.  XD

Muchas gracias por todo, quedó genial  :)