Buenas, tengo una duda que me ha surgido y que no consigo aclarar en mi cabeza. Salto a un lado, a una velocidad, y en el mismo aire pongamos en el punto máximo, si pulso el lado contrario, tiene tanta velocidad de vuelta que es capaz de volver a donde inicio el salto antes de caer.

Mi idea es por lógica de juego, poder volver un poco hacia atras. Pero no de nuevo al inicio del salto.

Tengo rozamiento que me frena en el aire y gravedad, pero si pulso el lado contrario, no quiero volver con tanta velocidad.

#1 Marzo 05, 2015, 04:11:57 AM Ultima modificación: Marzo 05, 2015, 04:19:30 AM por penumbra
En tu código de movimiento izquierda/derecha, debes agregar una condición para saber si estás en el aire o no. Si estás en el aire, la velocidad de movimiento (ya sea hspeed o el incremento a x) debe ser menor que cuando se está en el suelo.

Sin ver qué código usas no hay seguridad, pero sospecho que el rozamiento actúa sólo en una dirección, entonces, al saltar a la derecha, el rozamiento es un vector con dirección a la izquierda. Mientras mantengas la dirección hacia la derecha, el rozamiento va en contra del movimiento original, pero si cambias de dirección en el aire, el rozamiento se suma al movimiento, haciendo que regreses al punto de salto (o más allá).

Es una suposición solamente, pero si ese fuera el caso, el rozamiento debería manejarse más o menos como (suponiendo que el rozamiento es de 0.5)

[gml]
if (gravity != 0)
     rozamiento = sign(image_xscale) * -0.5[/gml]
Esto haría que el rozamiento siempre actuara en dirección opuesta a donde mira el personaje (mientras esté en el aire).



#2 Marzo 05, 2015, 04:19:28 AM Ultima modificación: Marzo 05, 2015, 04:21:31 AM por n0k
Perdona, la verdad es que así se verá mas claro.

////////////////////GRAVEDAD Y FRICCION//////////////////
if (!place_meeting(x, y+1, obj_suelo) == true){ //El objeto no se encuentra en el suelo
    vsp+= grav; //El objeto esta cayendo
    if (lkey == false) && (rkey == false){
        hsp = max(0, abs(hsp) - air_frict)*sign(hsp);
    }
    //Si el objeto no se esta moviendo, a continuacion, retardaremos el objeto con el AIR_FRICTION dado hasta que se detenga(0)
}

if (!place_meeting(x, y+1, obj_suelo) == false){ //El objeto esta en el suelo
    jsp = 0; //El objeto ha dejado de saltar.
    if (lkey == false) && (rkey == false){
        hsp = max(0, abs(hsp) - gnd_frict)*sign(hsp);
    }
    //Si el objeto no se esta moviendose, a continuacion, retardar el objeto con el GND_FRICTION dado hasta que se haya detenido (0)
}

Esto siguiente ocurre en el aire, quiza esta lioso, o no es la manera correcta de hacerlo, y esto solo debería ser para cuando estoy tocando suelo no?

if (!place_meeting(x, y + 1, obj_suelo)){
    if(rkey){
        hsp += ac_spd;
        if (hsp >= max_spd){
            hsp = max_spd;
        }
    }
   
    if(lkey){
        hsp += -ac_spd;
        if(hsp <= -max_spd){
            hsp = -max_spd;
        }
    }
}

Ahhh, ok ya he entendido, es que no estoy utilizando aun los sprites o imágenes, pero en realidad eso da igual, pero entiendo. Estuve varios días pensándolo, creo que se que pasa ahí. Un saludete. Gracias por la respuesta