Hola a todos soy nuevo en este foro, y probablemente me veais escribiendo por aqui a menudo ya que estoy inmerso en un proyecto en game maker Studio.

Se trata de un juego del estilo Ghouls N Ghosts. Quiero que cuando se pulse la tecla "Z" el personaje haga una animación de lanzamiento de una lanza, y mientras que esta animación esta en curso el personaje no pueda moverse. Mi problema es que cuando pulso "Z" solo aparece el primer frame de la animación (como un parpadeo) y el personaje no se queda quieto.

Os dejo el código para ver qué hay que corregir:

Key_Spear = keyboard_check_pressed(ord("Z"));

//Spear:
if (Key_Spear)
{
  if (grounded)
  {
    if (!sprite_index = spr_hero_spear)  image_index = 0;
    sprite_index = spr_hero_spear;
    instance_create(111,76,obj_spear);
    hsp = 0; 
   
  }
}


El problema probablemente esta en image_speed

reasigna image_speed para que corra mas lenta y puedas ver la animacion, algo asi...

Key_Spear = keyboard_check_pressed(ord("Z"));

//Spear:
if (Key_Spear)
{
  if (grounded)
  {
    if (!sprite_index = spr_hero_spear)  image_index = 0;
    sprite_index = spr_hero_spear;
    image_speed = 0.5 // prueba y selecciona la velocidad de animacion
    instance_create(111,76,obj_spear);
    hsp = 0; 
   
  }
}
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

Gracias por tu respuesta, pero haciendo eso que me dices la animación de ataque sigue con el mismo problema (solo aparece un frame) y utilizando el image_speed tan solo afecta a la animacion de andar cuando se desplaza.

Ya se lo que pasa, el sprite cambia demasiado rapido, tienes dos opciones o usar alarma o user el evento Animation End

Con el evento Animation End seria asi:


if sprite_index == spr_hero_spear
{
     sprite_index = spr_hero_move // ._.
}


Eh de suponer que ese codigo que nos muestras se esta ejecutando en un step por eso al detectar la tecla se cambia el sprite, pero apenas la sueltas se reasigna el sprite anterior, evitando que puedas ver la animacion completa del sprite spr_hero_spear. Que mas haces en ese step event?  :)
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

El problema es que

pones image_index = 0;

Esa linea de reprodice la primera imagen del sprite

Debe ser image_index = -1;

encambio si pones -1 te reproduce todo el sprite.

Saludos

`•.¸¸.•´´¯`••._.•(Algunos se divierten jugando,)•.¸¸.•´´¯`••._.•
`•.¸¸.•´´¯`••._.•(yo me divierto creando juegos.)•.¸¸.•´´¯`••._.•

Cita de: noshy en Octubre 03, 2013, 04:52:22 PM
El problema es que

pones image_index = 0;

Esa linea de reprodice la primera imagen del sprite

Debe ser image_index = -1;

encambio si pones -1 te reproduce todo el sprite.

Saludos

el image_speed controla la animacion, amenos que tenga un draw event sin draw_self() y con image_speed cero, entonces seria el caso.
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

Poniendo image_index = -1 no pasa nada diferente.

El código del Animation End tampoco ha sido la solución pero no se si lo estoy usando correctamente.

Estoy trabajando TODO el código en el step, puede ser que a causa de eso se de este error?

Os lo pongo aqui todo el código del personaje:

CREATE
vsp = 0;
hsp = 0;
grav = 4;
grounded = 0;
frict = 3;



STEP
//Imputs:
Key_Left    =   keyboard_check_direct(vk_left);
Key_Right   =   keyboard_check_direct(vk_right);
Key_Jump    =   keyboard_check_pressed(ord("X"));
Key_Gradual_Jump = keyboard_check_released(ord("X"));
Key_Spear = keyboard_check_pressed(ord("Z"));


//Move left and right
if (Key_Left)
{
    hsp = -20;
    image_xscale = -1;
}

if (Key_Right)
{
    hsp = 20;
    image_xscale = 1;
}


//Neutral input = 0 movement
if (Key_Right && Key_Left)
{
    hsp = 0;
}



//Grip (friction)
hsp = max((abs(hsp) - frict),0) * sign(hsp);



//Jumping
if (Key_Jump)
{
    if (grounded) vsp = -46;
}

vsp += grav;
   

//Gradual Jump
if (Key_Gradual_Jump)
{
if (vsp < 0)
{
   vsp = vsp/2
}
}


//Horizontal Collision
if place_meeting(x+hsp,y,par_wall)
{
    while (!place_meeting(x+sign(hsp),y,par_wall)) x+=sign(hsp);
    hsp = 0;
}
x += hsp;


//Vertical Collision
if place_meeting(x,y+vsp,par_wall)
{
    while (!place_meeting(x,y+sign(vsp),par_wall)) y+=sign(vsp);
    if (sign(vsp) == 1) grounded = 1;
    vsp = 0;
   
}
else
{
    grounded = 0;
}


//Commit to movement

y += vsp;



////////////////////////////////////////////////

//Walk Sprites
if (grounded)
{
   if (hsp == 0 )
   {
      sprite_index = spr_hero_idle_right;
   }
   else
   {
      if (!sprite_index = spr_hero_right) image_index = 0;
      sprite_index = spr_hero_right;
   }
}

else    //Jump Sprites:
{
   if (vsp<0)
   {
      sprite_index = spr_hero_jump;
   }
   else
   {
      sprite_index = spr_hero_fall1;
      if (vsp>12)
      {
         sprite_index = spr_hero_fall2;
      }
   }
}


////////////////////////////////////////
//Shoot:


//Spear:
if (Key_Spear)
{
  if (grounded)
  {
    if (!sprite_index = spr_hero_spear)  image_index = -1;
    sprite_index = spr_hero_spear;
    instance_create(x+104,y+10,obj_spear);
    hsp = 0;
  }
}

#7 Octubre 03, 2013, 08:50:34 PM Ultima modificación: Octubre 03, 2013, 09:13:37 PM por klys
Tal cual te lo dijeron tambien en el foro angloparlante, el problema esta en el step, especificamente donde cambias los sprites, si ya usas ese sistema para cambiar los sprites, deberias seguir usando el mismo sistema haciendole ciertos ajustes para acoplar el nuevo sprite.


En Create Event agregamos una variable mas (la puedes llamar como sea)

spear = 0;


En Step event acoplamos la variable spear y el cambio de sprite. Ademas de agregar el uso de la variable al usar la tecla correspondiente.

//Walk Sprites
if (grounded)
{
   if (hsp == 0 ) and (spear == 0)
   {
      sprite_index = spr_hero_idle_right;
   }
   else if (spear == 0)
   {
      if (!sprite_index = spr_hero_right) image_index = 0;
      sprite_index = spr_hero_right;
   }
    else
    {
            if (sprite_index != spr_hero_spear) sprite_index = spr_hero_spear;
     }
}

else   //Jump Sprites:
{
   if (vsp<0)
   {
      sprite_index = spr_hero_jump;
   }
   else
   {
      sprite_index = spr_hero_fall1;
      if (vsp>12)
      {
         sprite_index = spr_hero_fall2;
      }
   }
}

//Spear:
if (Key_Spear)
{
  if (grounded)
  {
    spear = 1;
    instance_create(x+104,y+10,obj_spear);
    hsp = 0;
  }
}




Ademas en el evento Animation End:

Para que vuelva a los sprites normales al terminar de realizar la animacion.


if spear == 1 and sprite_index == spr_hero_spear
{
     spear = 0;
}


No lo eh probado, pero deberia funcionar.

-------------- editado

La condicion del Animation End deberia quedar asi:


if spear == 1 and sprite_index == spr_hero_spear


Probado!  :)
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

Gracias Klys, veo que me has visto tambien por otros foros jaja
He probado el código que me has pasado y aunque no funciona del todo bien, es un avance. Con tu código solo hace la animación cuando está despazándose, si el personaje está quieto no hace la animación. De igual manera el personaje no se queda anclado en el suelo durante el recorrido de la animación como quiero que haga. Para esto último creo que tendré que usar una alarma.

Si, con el mismo usuario por los foros oficiales de game maker  XD

Juraria que lo probe e incluso parado dispara el rayo, a lo mejor te lo pase mal, me toca revisar  :-[
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

ah! acabo de ver la actualización de tu anterior post, desde cambias la condicios de código en Animation End. Ahora parece que sí funciona. He utilizado image_speed para que la animación del lanzamiento sea muy rapida y luego la he restaurado a 1 en el evento Animation End también.
Tan solo he encontrado un molesto bug y es que si caes mientras oprimes "Z" (el botón de disparo) el sprite se mantiene en la imagen de la caida del salto en lugar de hacer la animación de andar por el suelo.


Me estás ayudando mucho Klys, si algún dia termino este juego, si lo deseas tu nombre podría estar en los créditos.

Ese "si lo llegas a terminar" resuena en mi como un pasado que me hace recordar todos esos proyectos que mas para terminar fueron para aprender poco a poco XD

Algunos se perdieron en problemas tecnicos  :'(

Cuando pueda acceder a mi laptop reviso ese bug del que hablas...
Battlefield Galactic (Nombre piloto) Alpha 1.7.5.0
Juego Genero: Multiplayer Online Battle Arena!
Is more than 9000 APM!!

creo que he conseguido arreglarlo añadiendo esto a Step:

if ((Key_Right or Key_Left) && Key_Spear) {hsp=0}

if (grounded && spear = 1) {hsp = 0}


Muchas gracias a todos!