Agosto 13, 2017, 05:30:06 AM Ultima modificación: Agosto 16, 2017, 03:21:19 AM por 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

Esto va en Step:

//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:

if sprite_index = sprSoldado00_Muerte and Muerto[0] = true {
image_speed = 0;
image_index = 1.1;
Muerto[1] = true;
}

#2 Agosto 13, 2017, 10:03:08 AM Ultima modificación: Agosto 13, 2017, 10:10:45 AM por Zapdos43
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;
}

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.

#4 Agosto 14, 2017, 09:42:07 PM Ultima modificación: Agosto 15, 2017, 01:10:46 AM por TheWood
Cita de: TheWood en Agosto 13, 2017, 05:30:06 AM
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:
//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
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 ?

//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.

#6 Agosto 15, 2017, 12:48:57 AM Ultima modificación: Agosto 15, 2017, 01:11:26 AM por TheWood
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)

Ahora coloco todo el codigo del objeto, en verdad no puedo encontrar el porqué falla.

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;
}


Cita de: TheWood en Agosto 16, 2017, 12:30:44 AM
Ahora coloco todo el codigo del objeto, en verdad no puedo encontrar el porqué falla.

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