Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: LuigiGost en Junio 22, 2017, 03:23:53 AM

Título: Ayuda con animación del sprite al saltar
Publicado por: LuigiGost en Junio 22, 2017, 03:23:53 AM
Hola amigos, por favor ayúdenme con este maldito problema  :'(

Resulta que para cambiar el sprite al saltar, escribo el siguiente código en el evento STEP:

if sprite_index = spr_pj_walk_r
{
sprite_index = spr_pj_jump_r
}

Hasta ahí, todo bien. Cambia el sprite y todo...
Mi problema, es que al reproducirse el sprite, éste toma a su antojo la subimagen. A veces empieza en la subimagen 1, o en la 2, o en la 0...
Intenté con:

sprite_index = spr_pj_jump_r
image_index = 0
image_speed = 0.7

pero al poner la subimagen en 0, no tiene animación.

Leí también, que para darle animación, habría que ponerla en "-1", pero tampoco tiene animación...
En qué estoy fallando? Me he dado cuenta que no solo pasa con el sprite de saltar, también con el de caminar (que también pongo el código en step).
Agradecería mucho si me pudieran ayudar y orientar.
De antemano, Muchas gracias!! ;D
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: Ashe de Freljord en Junio 22, 2017, 04:09:13 AM
Lo que sucede es que el evento step se reproduce constantemente. Entonces si coloca
image_index = 0;

en el evento step, constantemente se quedará en la imagen 0, lo cual equivaldría a no realizar la animación.

Título: Re:Ayuda con animación del sprite al saltar
Publicado por: LuigiGost en Junio 22, 2017, 04:10:33 AM
Cita de: Ashe de Freljord en Junio 22, 2017, 04:09:13 AM
Lo que sucede es que el evento step se reproduce constantemente. Entonces si coloca
image_index = 0;

en el evento step, constantemente se quedará en la imagen 0, lo cual equivaldría a no realizar la animación.

Perfecto, lo entiendo... pero entonces; ¿Cómo hago para poder iniciar la animación desde la subimagen "0"? eso es lo que me tiene desesperado :'( jajaja xd
Gracias por tu pronta respuesta
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: Ashe de Freljord en Junio 22, 2017, 04:17:45 AM
deberia funcionar tranquilamente con esto:

if sprite_index = spr_pj_walk_r
{
sprite_index = spr_pj_jump_r
image_index = 0
image_speed = 0.7
}

porque debería dejarse de cumplir la condicion y no volvería a ejecutarse.
Sino tendrías que usar una variable para ver si está saltando o no
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: LuigiGost en Junio 22, 2017, 04:24:10 AM
Cita de: Ashe de Freljord en Junio 22, 2017, 04:17:45 AM
deberia funcionar tranquilamente con esto:

if sprite_index = spr_pj_walk_r
{
sprite_index = spr_pj_jump_r
image_index = 0
image_speed = 0.7
}

porque debería dejarse de cumplir la condicion y no volvería a ejecutarse.
Sino tendrías que usar una variable para ver si está saltando o no

No hay caso... no me resulta. También creí que debería funcionar como tú lo planteas pero no... Esto lo tendría que poner en Step, cierto? Es ahí donde lo pongo y no pasa nada... Qué rollo.
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: SarTaeL en Junio 22, 2017, 05:20:18 AM
Es tarde y donde vivo hace mucho calor, así que la primera respuesta que me viene a la cabeza tal vez sea una mierda y no te sirva. No obstante...

No termino de creer que sea conveniente ese tipo de código en el Step Event precisamente por lo que te dicen, se ejecuta room_speed veces por segundo. Además lo que le estás diciendo es literalmente
COMPROBAR 30 VECES POR SEGUNDO ESTO:

si tengo el sprite de caminar hacia la derecha {
    me lo cambias por el de saltar hacia la derecha;
}


Dicho eso y si realmente es necesario que tengas lo que tienes donde lo tienes, yo crearía una variable para asegurar que hasta que no acabe la animación de salto, el sprite sea el que quieres:

Create Event:
estamos_saltando = false;

Step Event:
if sprite_index = spr_pj_walk_r && estamos saltando == false{ //si estamos caminado a derechas y NO estamos saltando.
   estamos_saltando = true; //porque estamos saltando
   sprite_index = spr_pj_jump_r;
   image_index = 0;
   image_speed = (la que ajustes tú)
}


Animation End Event:
if sprite_index == spr_pj_jump_r {
   estamos_saltando = false; //ya no estamos saltando/ya no queremos seguir teniendo la animación de salto.
}


De esta manera nos aseguramos de que el Step Event no nos joda cambiando el sprite, la subimage o la velocidad hasta que hayamos acabado de saltar. En principio debería funcionar. Asegúrate primero que no cometí ninguna errata tonta, lo pruebas y a ver si hay suerte.
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: kostra en Junio 22, 2017, 02:52:17 PM
el código que te pasan es lógico,
es probable que puedas tener algúna confrontación con alguna mask de algún sprite? es decir, que sí se cumpla el código que te dieron, pero por ahí hay código que al tocar el suelo vuelva a cambiar al sprite de caminar, entonces, cuando salta, cambia bien el sprite pero la mask colisiona automáticamente con el suelo así que automáticamente vuelve a cambiarse el sprite?

Especulo mucho :B
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: LuigiGost en Junio 23, 2017, 01:11:49 AM
Cita de: SarTaeL en Junio 22, 2017, 05:20:18 AM
Es tarde y donde vivo hace mucho calor, así que la primera respuesta que me viene a la cabeza tal vez sea una mierda y no te sirva. No obstante...

No termino de creer que sea conveniente ese tipo de código en el Step Event precisamente por lo que te dicen, se ejecuta room_speed veces por segundo. Además lo que le estás diciendo es literalmente
COMPROBAR 30 VECES POR SEGUNDO ESTO:

si tengo el sprite de caminar hacia la derecha {
    me lo cambias por el de saltar hacia la derecha;
}


Dicho eso y si realmente es necesario que tengas lo que tienes donde lo tienes, yo crearía una variable para asegurar que hasta que no acabe la animación de salto, el sprite sea el que quieres:

Create Event:
estamos_saltando = false;

Step Event:
if sprite_index = spr_pj_walk_r && estamos saltando == false{ //si estamos caminado a derechas y NO estamos saltando.
   estamos_saltando = true; //porque estamos saltando
   sprite_index = spr_pj_jump_r;
   image_index = 0;
   image_speed = (la que ajustes tú)
}


Animation End Event:
if sprite_index == spr_pj_jump_r {
   estamos_saltando = false; //ya no estamos saltando/ya no queremos seguir teniendo la animación de salto.
}


De esta manera nos aseguramos de que el Step Event no nos joda cambiando el sprite, la subimage o la velocidad hasta que hayamos acabado de saltar. En principio debería funcionar. Asegúrate primero que no cometí ninguna errata tonta, lo pruebas y a ver si hay suerte.

Muchas gracias!! Lo probaré ahora mismo y aviso qué tal me fue :P
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: LuigiGost en Junio 23, 2017, 01:46:12 AM
Sinceramente, no sé qué es lo que pasa... Intenté con los códigos que me diste y no pasa nada...
De qué otra forma podría cambiar el sprite para que tenga la animación correcta? Es decir, que empiece desde la subimagen "0"? De verdad esto me está poniendo cada vez más idiota :'( jajaja.
Si pudiera ponerlo en otra parte que no fuera en Step el cambio de sprite, dónde podría ser? Ayuda plsssssssss :'( :'(
Título: Re:Ayuda con animación del sprite al saltar
Publicado por: SarTaeL en Junio 23, 2017, 02:48:20 AM
Me acabas de explotar la puta cabeza. No va en ningún sentido? Ni cambia ni hace nada habiendo copiado todo en su sitio correspondiente?¿?

Voy a escribir todo esto con 31º siendo las 2:40, intentaré ser coherente y claro.

Tal y como nos presentaste el código, la subimage "aleatoria" que decías que tomaba al cambiar de sprite, en realidad es la que corresponde con la que tenga tu sprite de correr en el momento de hacerlo. O sea, si le dices que cambie de un sprite a otro, lo hace, pero manteniendo el orden de image_index y el image_speed que ya tenía spr_pj_walk_r. Así ya queda explicado el por qué de la "aleatoriedad".

El manejo de sprites se puede hacer desde mil sitios y de mil formas distintas. Y ojo, no está mal per se usar el Step Event para eso. Lo que está mal (en mi muy humilde opinión) es hacerlo de la manera que nos presentas. En mi caso uso una state machine, máquina de estados. Me permite tener mejor control sobre todos los movimientos necesarios del personaje que controlo. Y en el estado principal que en mi caso es scr_move_state es donde tengo otro script llamado scr_sprite_control(). Desde este último controlo todo lo relativo (salvo la mask) a sprites de mi personaje. Todo. transiciones de uno a otro, velocidad, rango de inicio de subimages, etc.

Te dejo unos pedacitos del scr_sprite_control() y te explico qué ves en ellos.
Para el salto.
if (yprevious != y) { //si estamos SALTANDO, ya que en GM la coordenada Y mide altura. traducido es "si nuestra posiciónYanterior NO ES IGUAL que la actual, entonces:
      sprite_index = spr_jump;
      image_speed = 0;
}

Para correr.
      if ((hspd !=0) & (x!=xprevious) { //Si nos estamos MOVIENDO, puesto que hspd la uso para controlar mi coordenada X que es horizontal, y ADEMÁS nuestra posición X no es la misma que antes (es otra, recuerda que nos movemos.) entonces:
         sprite_index = spr_walk;
         image_speed = spr_spd;
         } else { //en caso contrario
           sprite_index = spr_stand; //volvemos al sprite de estarse quieto
         }



Ahora bien, yo controlo mi X e Y mediante variables propias (hspd y vspd respectivamente) pero no sabemos qué sistema utilizas tú para moverte, si es parecido o con las funciones incluidas hspeed, vspeed, speed. Tampoco sabemos qué activa tu salto, ni si estás utilizando código,  drag&drop (los iconitos) o cualquier otro dato relacionado con el movimiento. Contra más datos nos aportes mejor ayuda te podremos prestar!



Pd. El statement del movimiento horizontal puede parecer redundante (hspd !=0) & (x!=xprevious) pero he tenido que borrar condicionantes para que no quedara demasiado larga.