Lo que pasa es que me e topado con un errorcito de codigo y no e descubierto como revertirlo ni se como evitarlo, aveces sale y aveces no sale

tengo una serie de scrpits que inducen el stado de salto y despues el de caida de un objeto pero al precionar la tecla salto el objeto no salta, solo aparece en la cordenada Y, donde deberia estar la altura maxima del salto, en vez de ser un movimiento gradual hasta dicho punto solo aparece sin mas.

Alguien de buen corazon podria explicarme porque pasa eso y algunos consejos para evitar repetirlo.

este es mi codigo de salto

///Salto
if (state_new)
{
   image_index  = 0;
   sprite_index = sprFireAir;
   image_index  = 0;
   
   y-= jumpUp;  //Altura de Salto
   if (jumpReleased)   //Salto Variable
   {
      if (vsp < 0) vsp *= 0.8;
   }
}


if (vsp=0) image_index = 1;

grounded = place_meeting (x, y + 1, objBlock);   //Variable "Parado en el Suelo"

//Gravedad
if (!grounded)
{
   vsp = fallSpd;
}

y += vsp;   //Formula de la velocidad Vertical

move =(-left) + right;


//colision horizontal
if (place_meeting(x + hsp, y, objBlock))
{
   while (!place_meeting (x + sign (hsp), y, objBlock ))
   {
      x += sign (hsp);
   }
   hsp = 0;
}

if (vsp<0) state_switch("fall")

Codigo de Caida
///Caida
if (state_new)
{
   sprite_index = sprFireAir;
}


vsp = fallSpd;

if (vsp<0)image_index=2

//Variable "Parado en el Suelo"
grounded = place_meeting (x, y + 1, objBlock);

//Colision Vertical
if (place_meeting(x, y + vsp, objBlock))
{
   while (!place_meeting (x, y + sign (vsp), objBlock ))
   {
      y += sign (vsp);
   }
   vsp = 0;
}


y += vsp;
x += hsp;


//Velocidad Horiontal
if (move != 0) hsp = airSpd*move;


//colision horizontal
if (place_meeting(x + hsp, y, objBlock))
{
   while (!place_meeting (x + sign (hsp), y, objBlock ))
   {
      x += sign (hsp);
   }
   hsp = 0;
}



//===Cambio a estado de Reposo
if (grounded)
   state_switch("idle")

Lo ma probable es que sea esta parte
[gml]
y-= jumpUp;  //Altura de Salto
[/gml]
que deberia ser
[gml]
vsp-= jumpUp;  //Altura de Salto
[/gml]
Otra cosa es que tenes el codigo de colision horizontal 2 veces ???
Un consejo es que deberias dejar la parte de cambio de sprites para despues que tengas el movimiento y colisiones listo.

¿En qué parte se asigna state_new?