Abril 15, 2020, 04:27:07 AM Ultima modificación: Abril 18, 2020, 06:21:49 PM por Ikaro3d
Hola compañeros estoy intentando de implementar la función lerp en el pad de control ,para que el movimiento se suavice, en el keyboar me funciona bien pero no se como traspasarlo al pad
       
[gml]              //EL MANDO //
if gamepad_axis_value(0,gp_axislh ){ x+=v } //derecha

if -gamepad_axis_value(0,gp_axislh ){ x-=v } //izquierda

if gamepad_axis_value(0,gp_axislv ){ y+=v } //abajo

if -gamepad_axis_value(0,gp_axislv ){ y-=v} //arriba
//*******************************/////
if gamepad_axis_value(0,gp_axislh ) and gamepad_axis_value(0,gp_axislv ){ y+=-vlento }
if -gamepad_axis_value(0,gp_axislh ) and gamepad_axis_value(0,gp_axislv ){ y+=-vlento }//estos dos códigos no se si es la mejor manera de escribirlos ,es cuando se presina 2 direcciones y no se sumen y se incremente la velocidad

//////////////////////////////////////////////////////////////////////////
               //  teclado//

if keyboard_key
{

xx += (keyboard_check(ord("D")) -keyboard_check(ord("A")) ) *v;

x=lerp(x,xx,0.15);

yy += (keyboard_check(ord("S")) -keyboard_check(ord("W"))) *v;

y=lerp(y,yy,0.15)  [/gml]
}

#1 Abril 16, 2020, 03:48:47 AM Ultima modificación: Abril 16, 2020, 03:59:38 AM por BssString
Hola Ikaro3d

Encuentro interesante tu idea de usar LERP para suavizar el movimiento, pero le veo un problema al código de teclado.
Específicamente a la condición: "if keyboard_key" del inicio... no le encuentro sentido, pienso que el código quedaría mejor si la borras.
Esa condición te hace frenar de golpe si sueltas todas las teclas y no dejas que el lerp complete la distancia.
Ejemplo: si vas todo a la derecha, te deberías mover a la derecha con el suavizado y todo perfect, pero si sueltas todas las teclas de golpe, el personaje frena de golpe, pero aún le falta recorrer un 85% de la distancia que el LERP del step anterior no lo hizo recorrer. Eso significa que si ahora pulso izquierda, el personaje primero avanzará ese 85% hacia la derecha y luego irá a la izquierda como era esperado.

Este código debería funcionar con el JoyPad. Va explicado con comentarios para que no te pierdas.

[gml]//Primero recibo en qué porcentaje muevo el Stick (regresa un valor entre -1 y 1).
//En algunos Joystick de mala calidad, el axis queda pulsado ligeramente, para evitar eso, cuando se mueve 0.1 o -0.1, lo interpreta como 0.
var hdir = gamepad_axis_value(0,gp_axislh); if abs(hdir) < 0.1 { hdir = 0 }
var vdir = gamepad_axis_value(0,gp_axislv); if abs(vdir) < 0.1 { vdir = 0 }

//En caso de haber movimiento en cualquiera de los dos ejes:
if hdir != 0 || vdir != 0 {
//Convierte la coordenada cuadrada del X/Y a una coordenada circular (para que no importa a cuál de los 360º se mueva el personaje, nunca supere la máxima velocidad "v", si no haces esto, en diagonal se movería más rápido)
hdir *= sqrt(1 - 0.5*vdir^2)
vdir *= sqrt(1 - 0.5*hdir^2)
//Esto simplemente ajusta el "x" target e "y" target tal como lo tienes en tu código para keyboard.
xx += v*hdir
yy += v*vdir
}
//Esto actualiza las coordenadas del personaje para moverse un 15% de la distancia que hay entre su coordenada actual y su coordenada objetivo.
x=lerp(x,xx,0.15)
y=lerp(y,yy,0.15)[/gml]

Edit: Ojo que si pulsas derecha y al mismo tiempo mueves el Stick a la derecha, te moverás dos veces a la derecha (al doble de rápido). Deberías crear algún "if" que te haga moverte o con teclado o con joypad, pero no ambos a la vez

Saludos

Esto me lo tengo que estudia ,soy principiante y voy recogiendo información por la red , te agradezco muchísimo esta clase de maestría,

Cita de: Ikaro3d en Abril 18, 2020, 12:39:49 PM
Esto me lo tengo que estudia ,soy principiante y voy recogiendo información por la red , te agradezco muchísimo esta clase de maestría,

Le he probado funciona de lujo,que envidia que me das GRACIAS!!!!

Hola Ikaro3d

Que bueno que haya funcionado. Si has programado algo con gamepad, me gustaría testear tu proyecto cuando generes algún ejecutable.

Saludos