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 AL FIN] ¿Cómo parar la animación de un sprite?  (Leído 713 veces)

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

Desconectado TheWood

Bueno en realidad eso ya lo sé, que es con image_speed = 0 y colocar la sub-imagen que quieres en el sprite con image_index = " valor ".

Pero no entiendo el por qué esto no ocurre.

Tengo un objeto que al estar cerca del player activa una variable, esta al estar activa hace que se cambié de sprite y se coloqué el sprite del enemigo muriendo( que es de 2 sub_images), en el evento "animation end" se detecta, si el sprite es del jugador muriendo y la variable esta activada, entonces debería congelar la imagen en el sub-image = 1 y parar la animación con image_speed = 0, y aveces la animación queda perfecta y otras solo se ve el ultimo frame, pero no el primero ¿Por qué sucede esto,sera que es muy rapido?

Todo el sistema para detectar al jugador y colocar la variable esta en el evento "Step".

También me gustaría saber sus trucos en esto de hacer animaciones.

De antemano muchas gracias y espero haberme explicado bien. XD
« última modificación: Agosto 16, 2017, 03:21:19 am por TheWood »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado TheWood

Respuesta #1 en: Agosto 13, 2017, 07:04:42 am
Esto va en Step:

Código: [Seleccionar]
//Muerte animation
if Muerto[0] = true {
 sprite_index = sprSoldado00_Muerte;
 if timer2 = 0 {image_speed = 0.2;}
}

if Muerto[1] = true {
 timer2++;
 image_speed = 0;
 if timer2 = 3 {image_alpha = 0;}
 if timer2 = 6 {image_alpha = 1;}
 if timer2 = 9 {image_alpha = 0;}
 if timer2 = 12 {image_alpha = 1;}
 if timer2 = 15 {image_alpha = 0;timer2 = -1;instance_destroy();}
}

Esto va en animation end:

Código: [Seleccionar]
if sprite_index = sprSoldado00_Muerte and Muerto[0] = true {
 image_speed = 0;
 image_index = 1.1;
 Muerto[1] = true;
}


Desconectado Zapdos43

Respuesta #2 en: Agosto 13, 2017, 10:03:08 am
El evento Animation End solo se activa cuando se termina toda la animación. Nunca se activa a mitad de la animación.

Podrías probar solo a poner una sola condición en Animation end:
if (sprite_index == sprSoldado00_Muerte)
 {
 image_speed = 0;
 image_index = 1;
 Muerto[1] = true;
}
« última modificación: Agosto 13, 2017, 10:10:45 am por Zapdos43 »

 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado TheWood

Respuesta #3 en: Agosto 13, 2017, 07:08:17 pm
Muchas gracias, parece que ahora sí funciona.

Qué raro que solo quitando otra condición empiece a funcionar como debería el 100% de las veces xd.


Desconectado TheWood

Respuesta #4 en: Agosto 14, 2017, 09:42:07 pm
Bueno en realidad eso ya lo sé, que es con image_speed = 0 y colocar la sub-imagen que quieres en el sprite con image_index = " valor ".

Pero no entiendo el por qué esto no ocurre.

Tengo un objeto que al estar cerca del player activa una variable, esta al estar activa hace que se cambié de sprite y se coloqué el sprite del enemigo muriendo( que es de 2 sub_images), en el evento "animation end" se detecta, si el sprite es del jugador muriendo y la variable esta activada, entonces debería congelar la imagen en el sub-image = 1 y parar la animación con image_speed = 0, y aveces la animación queda perfecta y otras solo se ve el ultimo frame, pero no el primero ¿Por qué sucede esto,sera que es muy rapido?

Todo el sistema para detectar al jugador y colocar la variable esta en el evento "Step".

También me gustaría saber sus trucos en esto de hacer animaciones.

De antemano muchas gracias y espero haberme explicado bien. XD

El problema aun persiste, de vez en cuando solamente hace la animación completa de la muerte y otras solo devuelve el ultimo frame de esta.

Step event:
Código: [Seleccionar]
//Detectar Al Player
if ((distance_to_object(objPlayer)<14.8)) and (!Muerto[0]) {
  Muerto[0] = true;
 }
 
//Disparar
if Muerto[0] = false {

 timer++;
 if timer = 1
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }

 if timer = 11
  {
   sprite_index = sprSoldado00_Stand;
   image_index = 0;
  }
 
 if timer = 21
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }
 
 if timer = room_speed*2 {timer = 0;}

 } else if Muerto[0] = true {timer = -1;with (a) {instance_destroy();} }
 
//Cambiar el xscale
if (!Sellado) {
 if instance_exists(objPlayer) and Muerto[0] = false  {
  if objPlayer.x<x {xscale = -1;}
  if objPlayer.x>x {xscale =  1 ; } 
 
 }
}
if Muerto[1] = true {image_xscale = xscale*-1;}

image_xscale = xscale;
//Muerte animation
if Muerto[0] = true {
 sprite_index = sprSoldado00_Muerte;
 if timer2 = 0 {image_speed = 0.2;}
}

if Muerto[1] = true {
 timer2++;
 image_speed = 0;
 if timer2 = 3 {image_alpha = 0;}
 if timer2 = 6 {image_alpha = 1;}
 if timer2 = 9 {image_alpha = 0;}
 if timer2 = 12 {image_alpha = 1;}
 if timer2 = 15 {image_alpha = 0;timer2 = -1;instance_destroy();}
}

Animation End
Código: [Seleccionar]
if (sprite_index == sprSoldado00_Muerte)
 {
 image_speed = 0;
 image_index = 1;
 Muerto[1] = true;
}
Ahora inserte el codigo completo de mi enemigo ¿Sera culpa de la forma de detectar si el player esta cerca ?
« última modificación: Agosto 15, 2017, 01:10:46 am por TheWood »

 


Desconectado Zapdos43

Respuesta #5 en: Agosto 14, 2017, 10:24:24 pm
Código: [Seleccionar]
//Detectar Al Player
if (distance_to_object(objPlayer)<14.8) and (!Muerto[0]) {
  Muerto[0] = true;
 }
 
//Disparar
if Muerto[0] == false {

 timer++;
 if timer == 1
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }

 if timer == 11
  {
   sprite_index = sprSoldado00_Stand;
   image_index = 0;
  }
 
 if timer == 21
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }
 
 if timer == room_speed*2 {timer = 0;}

 } else if Muerto[0] == true {timer = -1;with (a) {instance_destroy();} }
 
//Cambiar el xscale
if (!Sellado) {
 if instance_exists(objPlayer) and Muerto[0] == false  {
  if objPlayer.x<x {xscale = -1;}
  if objPlayer.x>x {xscale =  1 ; } 
 
 }
}
if Muerto[1] == true {image_xscale = xscale*-1;}

image_xscale = xscale;
//Muerte animation
if Muerto[0] == true {
 sprite_index = sprSoldado00_Muerte;
 if timer2 == 0 {image_speed = 0.2;}
}

if Muerto[1] == true {
 timer2++;
 image_speed = 0;
 if timer2 == 3 {image_alpha = 0;}
 if timer2 == 6 {image_alpha = 1;}
 if timer2 == 9 {image_alpha = 0;}
 if timer2 == 12 {image_alpha = 1;}
 if timer2 == 15 {image_alpha = 0;timer2 = -1;instance_destroy();}
}

En las expresiones de "if" he puesto"==". Este símbolo "==" sirve para hacer comparaciones. Es como decir si una variable es exactamente igual a un valor. Un solo "=" es para asignar valores. Espero se solucione el problema.

 
Los siguientes usuarios dieron las gracias a este tema: Yuzo


Desconectado TheWood

Respuesta #6 en: Agosto 15, 2017, 12:48:57 am
Eso de los "==" no lo sabía  :o, pero aún así de vez en cuando hace la animación de muerte y otras veces no  :'(

(No entiendo porque me adjunta imagenes al azar esta cosa xD)
« última modificación: Agosto 15, 2017, 01:11:26 am por TheWood »

 


Desconectado TheWood

Respuesta #7 en: Agosto 16, 2017, 12:30:44 am
Ahora coloco todo el codigo del objeto, en verdad no puedo encontrar el porqué falla.

Código: [Seleccionar]
Information about object: objSoldado00
Sprite: sprSoldado00_Stand
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent:
Children:
Mask: sprSoldado00_Mask

No Physics Object
Create Event:

execute code:

timer = 0;
timer2 = 0;
a = -1;

Muerto[0] = false;
Muerto[1] = false;
i = 0;

xscale = image_xscale;

Sellado = false;

Step Event:

execute code:

//Disparar
if (!Muerto[0]) {

 timer++;
 if timer == 1
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }

 if timer == 11
  {
   sprite_index = sprSoldado00_Stand;
   image_index = 0;
  }
 
 if timer == 21
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }
 
 if timer == room_speed*2 {timer = 0;}

 } else if Muerto[0] == true {with (a) {instance_destroy();};timer = -1; }
 
//Cambiar el xscale
if (!Sellado) and (!Muerto[0]) and (!Muerto[1]) {
 if instance_exists(objPlayer)   {
  if (objPlayer.x<x) {xscale = -1; }
  if (objPlayer.x>x) {xscale =  1; }   
 }
}
//Detectar Al Player
if ((distance_to_object(objPlayer)<14.8)) and (!Muerto[0])  {
  Muerto[0] = true;
}
//Muerte animation
if Muerto[0] {
 sprite_index = sprSoldado00_Muerte;
 image_speed = 0.2;
 image_xscale = xscale*-1;
}



if Muerto[1] {
 timer2++;
 image_speed = 0;
 if timer2 == 3 {image_alpha = 0;}
 if timer2 == 6 {image_alpha = 1;}
 if timer2 == 9 {image_alpha = 0;}
 if timer2 == 12 {image_alpha = 1;}
 if timer2 == 15 {image_alpha = 0;timer2 = -1;instance_destroy();}
}


image_xscale = xscale;



Collision Event with object objPlayer:

execute code:

if (!Muerto[0]) {with (objPlayer) {scrKillPlayer();} }

Other Event: Animation End:

execute code:

if (sprite_index == sprSoldado00_Muerte) {
 image_speed = 0;
 image_index = 1;
 Muerto[1] = true;
}



Desconectado TheWood

Respuesta #8 en: Agosto 16, 2017, 03:20:52 am
Ahora coloco todo el codigo del objeto, en verdad no puedo encontrar el porqué falla.

Código: [Seleccionar]
Information about object: objSoldado00
Sprite: sprSoldado00_Stand
Solid: false
Visible: true
Depth: 0
Persistent: false
Parent:
Children:
Mask: sprSoldado00_Mask

No Physics Object
Create Event:

execute code:

timer = 0;
timer2 = 0;
a = -1;

Muerto[0] = false;
Muerto[1] = false;
i = 0;

xscale = image_xscale;

Sellado = false;

Step Event:

execute code:

//Disparar
if (!Muerto[0]) {

 timer++;
 if timer == 1
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }

 if timer == 11
  {
   sprite_index = sprSoldado00_Stand;
   image_index = 0;
  }
 
 if timer == 21
  {
   a = instance_create(x,y-15,objSoldado00_Bala);
   a.hspeed = 4*image_xscale;
   sprite_index = sprSoldado00_Disparando;
   image_speed = 0.5;
  }
 
 if timer == room_speed*2 {timer = 0;}

 } else if Muerto[0] == true {with (a) {instance_destroy();};timer = -1; }
 
//Cambiar el xscale
if (!Sellado) and (!Muerto[0]) and (!Muerto[1]) {
 if instance_exists(objPlayer)   {
  if (objPlayer.x<x) {xscale = -1; }
  if (objPlayer.x>x) {xscale =  1; }   
 }
}
//Detectar Al Player
if ((distance_to_object(objPlayer)<14.8)) and (!Muerto[0])  {
  Muerto[0] = true;
}
//Muerte animation
if Muerto[0] {
 sprite_index = sprSoldado00_Muerte;
 image_speed = 0.2;
 image_xscale = xscale*-1;
}



if Muerto[1] {
 timer2++;
 image_speed = 0;
 if timer2 == 3 {image_alpha = 0;}
 if timer2 == 6 {image_alpha = 1;}
 if timer2 == 9 {image_alpha = 0;}
 if timer2 == 12 {image_alpha = 1;}
 if timer2 == 15 {image_alpha = 0;timer2 = -1;instance_destroy();}
}


image_xscale = xscale;



Collision Event with object objPlayer:

execute code:

if (!Muerto[0]) {with (objPlayer) {scrKillPlayer();} }

Other Event: Animation End:

execute code:

if (sprite_index == sprSoldado00_Muerte) {
 image_speed = 0;
 image_index = 1;
 Muerto[1] = true;
}


Mis ganas de matarme aumentaron x1000, yo buscando errores en el código y el error estaba en el sprite que, según mis observaciones, era de una duración de 2 frames solamente y Game maker no lo suficientemente rápido para poder interpretar.

Cada día hay motivos para suicidarse, pero también cada día se aprende algo nuevo  XD

 
Los siguientes usuarios dieron las gracias a este tema: Yuzo