Septiembre 26, 2017, 01:06:07 PM Ultima modificación: Septiembre 30, 2017, 03:27:03 PM por Naitsabes0
Básicamente busco que un personaje cambie su apariencia de sprite inicial cuando se queda quieto unos "X" para luego volver en otros "X" segundos a su sprite original, los detalles están abajo.

La animacion de pie, parado, quieto, normal o idle (creo que así le llamaban) como le colocan los que programan en ingles, es la apariencia que tiene el personaje cuando no esta haciendo nada, por ejemplo este es mi idle.



En muchos juegos hay personajes que cambian su sprite/modelo 3D (dependiendo si esta en 2/3 D) cuando se les deja "X" tiempo sin hacer nada, por dar un ejemplo.

En uno de 3D tenemos a link de ocarina of time bosteza y se pone a estirar las piernas.
https://www.youtube.com/watch?v=QGn2cgQYszY

En uno de 2D tenemos a Jim de earthworm jim que hace cosas raras, como todo en su mundo.
https://www.youtube.com/watch?v=46n6ZQx3Yco

Y yo tengo aquí estos 2 sprite


Podrias utilizar el evento "no key" para detectar cuando no se tocan los botones. Entonces ahi dentro llamas a una alarma que cambie al sprite de idle.

Luego para que vuelva a estar completamente quieto solo utilizar el evento "other/animation end".

Cita de: FridaFlowers en Septiembre 26, 2017, 05:30:56 PM
Podrias utilizar el evento "no key" para detectar cuando no se tocan los botones. Entonces ahi dentro llamas a una alarma que cambie al sprite de idle.

Luego para que vuelva a estar completamente quieto solo utilizar el evento "other/animation end".
Hay 3 eventos no key ¿cual debería ser?

tengo un codigo que es bastante grande pero que hace lo que nesecitas
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

Algo así:
[gml]
///Evento step
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else alarm[0] = -1; //Cancelar la alarma
[/gml]
[gml]
///Evento alarma
//cambiar animación
sprite_index = sIdle;
[/gml]
alaberga regué el café.

BA:STFW&RTFM

Cita de: NiuWeb en Septiembre 27, 2017, 03:21:31 AM
Algo así:
[gml]
///Evento step
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else alarm[0] = -1; //Cancelar la alarma
[/gml]
[gml]
///Evento alarma
//cambiar animación
sprite_index = sIdle;
[/gml]
No estaría mal si no fuera por que el personaje se queda de forma permanente con esa apariencia.



Así estaría el código.

STEP
[gml]
///Animacion de espera
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else alarm[0] = -1; //Cancelar la alarma
[/gml]

ALARMA 0
[gml]
///Cambiar animación
sprite_index = spr_Jugador_Esperando1;
[/gml]

Los problemas son estos.

1.- Como puedes ver el personaje se queda de forma permanente en su estado quieto a pesar de que se mueve, resulta raro que se mueva estando sentado, pero como ya mencione debe volver a su estado normal cuando se vuelva a mover.

2.- El código solo me permite tener un estado de quieto en vez de elegir 1 de los 2 al azar, aunque en un futuro puede llegar a ser como 5 o mas, por lo que debo armar una estructura que los elija al azar, creo que  :GMS: permite 16 elementos en esa función de azar como máximo.

3.- El código no permite que el jugador vuelva a su estado normal después de que pasen los "X" segundos de las animaciones de ocio, básicamente la animación de ocio es interrumpida/cancelada cuando el jugador se mueve o cuando pasan los "X" segundos anteriormente mencionados.

Mirando el lado positivo de esto, se cumplen al menos los primeros parámetros de lo que estoy buscando  :).

#6 Septiembre 27, 2017, 10:27:04 PM Ultima modificación: Septiembre 27, 2017, 10:29:02 PM por cristopher2545
puedes crear una variable nueva que tenga las animaciones por ejemplo depende de las animaciones es el limite del numero que tendras

create del player

animacion=0; //no hay animacion


step del player aqui le asignamos una animacion a cada valor numerico de la variable animacion asi cuando toque ese numero tendras la animacion que desees

if animacion=1
{
sprite_index="alguna animacion"
}else
if animacion=2
{
sprite_index="alguna animacion"
}else
if animacion=3
{
sprite_index="alguna animacion"
}


en la alarma donde tienes este codigo

///Evento alarma
//cambiar animación
sprite_index = sIdle;

lo cambias por este
///Evento alarma
//cambiar animación
animacion=choose(,1,2,3,4) //depende de las animaciones que tengas sera los numeros que pongas

;

finalmente para acabar en el codigo donde manejas las alarmas añadimos un reset a la variable para que no se quede la animacion


///Animacion de espera
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else alarm[0] = -1; //Cancelar la alarma
animacion=0 //esto pone las animaciones a 0 eso quietre decir que volveras a tener tu set de animaciones activo
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

Cita de: cristopher2545 en Septiembre 27, 2017, 10:27:04 PM
puedes crear una variable nueva que tenga las animaciones por ejemplo depende de las animaciones es el limite del numero que tendras

create del player

animacion=0; //no hay animacion


step del player aqui le asignamos una animacion a cada valor numerico de la variable animacion asi cuando toque ese numero tendras la animacion que desees

if animacion=1
{
sprite_index="alguna animacion"
}else
if animacion=2
{
sprite_index="alguna animacion"
}else
if animacion=3
{
sprite_index="alguna animacion"
}


en la alarma donde tienes este codigo

///Evento alarma
//cambiar animación
sprite_index = sIdle;

lo cambias por este
///Evento alarma
//cambiar animación
animacion=choose(,1,2,3,4) //depende de las animaciones que tengas sera los numeros que pongas

;

finalmente para acabar en el codigo donde manejas las alarmas añadimos un reset a la variable para que no se quede la animacion


///Animacion de espera
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else alarm[0] = -1; //Cancelar la alarma
animacion=0 //esto pone las animaciones a 0 eso quietre decir que volveras a tener tu set de animaciones activo

Lo tengo de esta forma

CREATE

animacion=0; //no hay animacion


ALARMA 0

///Cambiar animación
animacion=choose(1,2,3,4) //depende de las animaciones que tengas sera los numeros que pongas


STEP

///Animacion de ocio
if animacion=1
{
sprite_index=spr_Jugador_Esperando1
}else
if animacion=2
{
sprite_index=spr_Jugador_Esperando1
}else
if animacion=3
{
sprite_index=spr_Jugador_Esperando2
}
if animacion=4
{
sprite_index=spr_Jugador_Esperando2
}
///Animacion de espera
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else alarm[0] = -1; //Cancelar la alarma
animacion=0 //esto pone las animaciones a 0 eso quietre decir que volveras a tener tu set de animaciones activo


Si lo pruebas por ti mismo te darás cuenta que el jugador cambia al azar entre las 4 opciones posible, por ese lado esta bien, pero el jugador no puede volver a su animación de caminar, es decir que todavía camina sentado o parpadeando (dado que estas son las 2 animaciones de ocio disponibles), por lo que tenemos todavía el mismo problema para que el jugador regrese a su estado normal, a nivel de código se podría decir que hay un avance, pero en términos visuales se podría decir que no hay ningún cambio aparente.

podrias tratar donde esta el código de animaciones de tu personaje poner


if animaciones=0
{

todo el codigo de aniamciones del personaje caminar correr saltar

}
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

Si leyeras el código en vez de sólo copiarlo a lo mejor serías capaz de solucionarlo por ti mismo. Volviendo al código que te di:
[gml]
///Evento step
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else//Aquí, esto es un else. ¿Sabes lo que es un else?
{
    //todo lo que está aquí se ejecuta al presionar alguna tecla.
    alarm[0] = -1;//Cancelar la alarma.
    sprite_index = sCaminando; //O cualquier cosa.
}
[/gml]
No es que el código "no te permita" añadir animaciones aleatorias, es que debes programar eso.

Sobre lo de finalizar la animación, eso olvidaste mencionarlo.
[gml]
///Evento animation end
if(sprite_index = sIdle) sprite_index = sCaminando;
/*
Antes de copiar este código, léetelo.
*/
[/gml]
alaberga regué el café.

BA:STFW&RTFM

Cita de: NiuWeb en Septiembre 28, 2017, 01:37:12 AM
Si leyeras el código en vez de sólo copiarlo a lo mejor serías capaz de solucionarlo por ti mismo. Volviendo al código que te di:
[gml]
///Evento step
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else//Aquí, esto es un else. ¿Sabes lo que es un else?
{
    //todo lo que está aquí se ejecuta al presionar alguna tecla.
    alarm[0] = -1;//Cancelar la alarma.
    sprite_index = sCaminando; //O cualquier cosa.
}
[/gml]
No es que el código "no te permita" añadir animaciones aleatorias, es que debes programar eso.

Sobre lo de finalizar la animación, eso olvidaste mencionarlo.
[gml]
///Evento animation end
if(sprite_index = sIdle) sprite_index = sCaminando;
/*
Antes de copiar este código, léetelo.
*/
[/gml]

Bueno las cosas las tendría armadas de este modo.

obj_Jugador

CREATE : Empezaría con la animación spr_Jugador que es el aspecto que tiene de caminar.
[gml]
animacion=0; //no hay animacion
[/gml]

ALARMA 0: Aquí limito 4 animaciones al azar.
[gml]
animacion=choose(1,2,3,4) //depende de las animaciones que tengas sera los números que pongas
[/gml]

STEP: Aquí are que elija una de las 4 animaciones de ocio, abajo de ella tendría la animación de espera que cambia en 5 segundos en caso que no apreté un botón, y si apretó un botón de movimiento, la animación volvería a la de caminar por que se cumple la condición.
[gml]
if animacion=1
{
sprite_index=spr_Jugador_Esperando1
}else
if animacion=2
{
sprite_index=spr_Jugador_Esperando1
}else
if animacion=3
{
sprite_index=spr_Jugador_Esperando2
}
if animacion=4
{
sprite_index=spr_Jugador_Esperando2
}
///Animacion de espera
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else//Aquí, esto es un else. ¿Sabes lo que es un else?
{
    //todo lo que está aquí se ejecuta al presionar alguna tecla.
    alarm[0] = -1;//Cancelar la alarma.
    sprite_index = spr_Jugador; //O cualquier cosa.
}
[/gml]

ANIMACION END: Se supone que debería volver al estado de caminar cuando pasa el  tiempo de ocio?
[gml]
if(sprite_index = spr_Jugador_Esperando1) sprite_index = spr_Jugador;
[/gml]

Bueno hes lo que he estado analizando leyendo el código en orden, lo bueno es que el jugador cambia su estado ocio cuando esta en movimiento, producto de lo que esta colocado en STEP por lo que he podido analizar, pero hay estos 2 problemas.

1.-Si el jugador deja de moverse pasara al instante a una animación de ocio ignorando los 5 segundos de espera, es como si la alarma funcionara solo 1 vez cuando el tiempo haya trascurrido.

2.-Tal vez el evento ANIMACION END debería encargarse de regresarlo a su estado obj_Jugador, es decir el que tiene aspecto de caminando, pero al parecer su funcionamiento no se ejecuta, ya que el jugador solo cambia de una animación de ocio a otra animación de ocio, y nunca volverá a su estado caminando por defecto del tiempo de 5 segundos.

¿Acaso me estoy perdiendo algo importante en lo que expongo en este análisis? tal vez la razón sea como la que me dijo recientemente sobre que faltan códigos complementarios a los que tengo para que las cosas funcionen como se tiene planeado?  :-\

#11 Septiembre 29, 2017, 12:34:45 AM Ultima modificación: Septiembre 29, 2017, 12:36:16 AM por cristopher2545
en vez de usar alarmas podrías usar una variable que controle el tiempo por ejemplo elimina las alarmas que manejen el movimiento y las remplazas por una variable

create del player

tiempo=0 //el tiempo no se mueve


Step del player en donde tienes este codigo
///Evento step
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else//Aquí, esto es un else. ¿Sabes lo que es un else?
{
    //todo lo que está aquí se ejecuta al presionar alguna tecla.
    alarm[0] = -1;//Cancelar la alarma.
    sprite_index = sCaminando; //O cualquier cosa.
}


lo cambias por este otro


///Evento step
if(keyboard_check(vk_nokey))
{
    tiempo+=1 //suma un punto a la variable mientras no te muevas
}
else
{
tiempo=0 //si te mueves o siempre que te muevas reseteas la variable a 0
animacion=0
}

//añadimos un valor limite a la variable tiempo por ejemplo 90 steps

if tiempo >90
{
animacion=choose(1,2,3,4)
if animacion!=0
{
tiempo=0 // si la animación no es la normal ponemos el relog a 0 hasta que el player se vuelva a mover
}
}


y finalmente añadimos un trozo de codigo que ara que el player cambie a la animacion de caminar

if animacion=0
{
sprite_index="animacion de caminar"
{
Programame! como a una de tus árcades chinas

GET BEHIND ME DOCTOR!

Cita de: cristopher2545 en Septiembre 29, 2017, 12:34:45 AM
en vez de usar alarmas podrías usar una variable que controle el tiempo por ejemplo elimina las alarmas que manejen el movimiento y las remplazas por una variable

create del player

tiempo=0 //el tiempo no se mueve


Step del player en donde tienes este codigo
///Evento step
if(keyboard_check(vk_nokey))
{
    if(!alarm[0]) alarm[0] = room_speed * 5; //Segundos que tarde en poner la animación
}
else//Aquí, esto es un else. ¿Sabes lo que es un else?
{
    //todo lo que está aquí se ejecuta al presionar alguna tecla.
    alarm[0] = -1;//Cancelar la alarma.
    sprite_index = sCaminando; //O cualquier cosa.
}


lo cambias por este otro


///Evento step
if(keyboard_check(vk_nokey))
{
    tiempo+=1 //suma un punto a la variable mientras no te muevas
}
else
{
tiempo=0 //si te mueves o siempre que te muevas reseteas la variable a 0
animacion=0
}

//añadimos un valor limite a la variable tiempo por ejemplo 90 steps

if tiempo >90
{
animacion=choose(1,2,3,4)
if animacion!=0
{
tiempo=0 // si la animación no es la normal ponemos el relog a 0 hasta que el player se vuelva a mover
}
}


y finalmente añadimos un trozo de codigo que ara que el player cambie a la animacion de caminar

if animacion=0
{
sprite_index="animacion de caminar"
{

Tiene este error.

FATAL ERROR in
action number 3
of  Step Event0
for object obj_Jugador:

Variable obj_Jugador.animacion(100006, -2147483648) not set before reading it.
at gml_Object_obj_Jugador_StepNormalEvent_3 (line 1) - if animacion=1

El evento ANIMATION END estaría eliminado en tu ejemplo por lo que veo, a pesar de que me de fallos cambie a este código según tus especificaciones, creo que cambiar toda su estructura fue una mala idea, por que ahora tengo un código muy distinto al original.

Esto seria el código nuevo.

CREATE:

tiempo=0 //el tiempo no se mueve


ALARMA 0

///Cambiar animación
if animacion=0
{
sprite_index=spr_Jugador
}


STEP:

///Animacion de ocio
if animacion=1
{
sprite_index=spr_Jugador_Esperando1
}else
if animacion=2
{
sprite_index=spr_Jugador_Esperando1
}else
if animacion=3
{
sprite_index=spr_Jugador_Esperando2
}
if animacion=4
{
sprite_index=spr_Jugador_Esperando2
}
if(keyboard_check(vk_nokey))
{
    tiempo+=1 //suma un punto a la variable mientras no te muevas
}
else
{
tiempo=0 //si te mueves o siempre que te muevas reseteas la variable a 0
animacion=0
}

//añadimos un valor limite a la variable tiempo por ejemplo 90 steps

if tiempo >90
{
animacion=choose(1,2,3,4)
if animacion!=0
{
tiempo=0 // si la animación no es la normal ponemos el relog a 0 hasta que el player se vuelva a mover
}
}


¿A probado si su código funciona sin errores? o es una corazonada de que debería funcionar?  :-\


Cita de: eams1986 en Septiembre 29, 2017, 03:58:08 PM
A ver si te funciona este ejemplo .

https://gyazo.com/6b18535d742513c03a69bad324ab994b.gif

Saludos

El ejemplo si funciona, no voy a negar que esta muy cerca de lo que busco, pero al analizar el código, veo que se limita mucho en cantidad de animaciones que puede tener, ademas de que usa muchos eventos, al menos mas de los que son necesarios en un principio, lo que lo vuelve mas engorroso cuando tenga que juntarse con los otros eventos que tiene el jugador, sin embargo se agradece la ayuda aunque no aporte una mejora en el ultimo avance.  :)