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.
(https://i.gyazo.com/6af5dcbfa8d06cf2126d89d1d9f5eca6.gif)
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
(https://i.gyazo.com/bc358b4eca65341b95ebe7fa6e4e55b7.gif)
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
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]
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.
(https://i.gyazo.com/a68e92d9efa9e3f64844b8dd78c3d098.gif)
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 :).
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
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
}
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]
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? :-\
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"
{
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? :-\
A ver si te funciona este ejemplo .
https://gyazo.com/6b18535d742513c03a69bad324ab994b.gif
Saludos
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. :)
me imagino no borraste la variable "animacion" verdad? en fin solo un consejo no copies todo el codigo entero y te quedes asi ve el codigo desarmalo ve la logica y despues lo copias y lo pegas asi no sabras que estas haciendo cuando tomas un codigo ajeno y tratas de meterlo en tu proyecto. te dejo ele ditable que teniene el mismo codigo añadiendo algunas coas que falte agregar
Cita de: cristopher2545 en Septiembre 30, 2017, 06:01:55 AM
me imagino no borraste la variable "animacion" verdad? en fin solo un consejo no copies todo el codigo entero y te quedes asi ve el codigo desarmalo ve la logica y despues lo copias y lo pegas asi no sabras que estas haciendo cuando tomas un codigo ajeno y tratas de meterlo en tu proyecto. te dejo ele ditable que teniene el mismo codigo añadiendo algunas coas que falte agregar
Respecto al comentario.
No borre código para no arrepentirme de algún error que pueda cometer, simplemente le di "/*" a todo lo que estaba abajo para que estuviera comentado, de esa forma no me arriesgaba a perder un código que tal vez pueda ser útil, mientras que a su vez me permite tenerlo inactivo para que no interfiera con los nuevos código modificados recientes, por otra parte, por supuesto que voy haciendo lectura de lo que copio pego, a cada evento le voy asignando el código donde debe estar, ademas de que llevo los nombres de spr, obj y variables a mi idioma español para facilitarme la programación al momento de buscar errores, incluso has podido notar que le añado comentarios a muchas lineas de código en la parte derecha, incluso al mismo titulo le pongo sub-títulos, gracias a estas señales puedo saber donde buscar a pesar de que pasen semanas sin tocar el código.
Respecto a la descarga.
Cumple con el objetivo de darle animaciones de ocio al personaje cuando se queda sin tiempo, el darle otro tiempo y animaciones sera un asunto que modificare a mi gusto, por lo que puedo dar por concluido este problema.