Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: vitail en Febrero 27, 2015, 05:20:33 PM

Título: Hacer que sea mas suave el movimiento
Publicado por: vitail en Febrero 27, 2015, 05:20:33 PM
quiero saber como hacer de que haga todo esto

direction = image_angle;
if(keyboard_check(vk_left))
{
    image_angle += 3.5;
}
else if(keyboard_check(vk_right))
{
    image_angle -= 3.5;
}
if(keyboard_check(vk_up))
{
    speed = 5;
} else {
    speed = 0;
}


pero que todo lo haga suave y que el image angle cuando le des a un lado sea suave su movimiento, osea de que no pare asi todo feo si no suavemente igual que con la velocidad y eso.
Título: Re:Hacer que sea mas suave el movimiento
Publicado por: Clamud en Febrero 27, 2015, 11:09:27 PM
Lo que yo entiendo es que el cambio de velocidad debe ser gradual. Si quieres que la aceleración sólo sea lineal define un valor para la variable friction, ejemplo: [gml]friction = 0.2[/gml]
Si también quieres que la aceleración sea angular y quieres que la aceleración lineal sea más agradable, usa un código como éste:
[gml]
///EVENTO CREATE: Inicializar

a_ang = 0.2; //aceleración angular
a_lin = 0.2; //aceleración linear

v_ang = 0; //velocidad angular
speed = 0; //velocidad linear

direction = 0;
[/gml]
[gml]
///EVENTO STEP: Movimiento

//Angular
if( keyboard_check(vk_left) ) { //si se presiona izquierda
    v_ang = min( v_ang+a_ang, 3.5 ); //cambiar v_ang hasta 3.5
}
else if( keyboard_check(vk_right) ) {//si se presiona derecha
    v_ang = max( v_ang-a_ang, -3.5 ); //cambiar v_ang hasta -3.5
}
else { //si no se presiona izquierda ni derecha
    if( v_ang < 0 ) v_ang = min( v_ang+a_ang, 0 ); //v_ang se hace cero
    if( v_ang > 0 ) v_ang = max( v_ang-a_ang, 0 ); //de forma gradual
}
direction += v_ang; //cambiar la deirección
image_angle = direction;

//Lineal
if( keyboard_check(vk_up) ) { //si se presiona arriba
    speed = min( speed+a_lin, 5 ); //aumentar speed hasta 5
} else { //si no se presiona arriba
    speed = max( speed-a_lin, 0 ); //disminuir speed hasta 0
}
[/gml]
Ajusta los valores de aceleración hasta que sean agradables.
Título: Re:Hacer que sea mas suave el movimiento
Publicado por: vitail en Febrero 27, 2015, 11:27:41 PM
gracias pero para entender el script que es min y max?, me podrias decir la definicion TU para que sirven esas 2 funciones?
Título: Re:Hacer que sea mas suave el movimiento
Publicado por: Silver_light en Febrero 27, 2015, 11:38:49 PM
Esencialmente lo que hacen min y max son devolver el menor y mayor de los argumentos o parámtros pasados a dicha función.

por ejemplo:
[GML]
min (1,2,3,4,5); // devolverá 1 puesto que es el menor

o
max (1,2,3,4,5); // devolverá 5 puesto que es el mayor
[/GML]

cada una de las funciones soporta hasta 16 parametros.
Título: Re:Hacer que sea mas suave el movimiento
Publicado por: Clamud en Febrero 28, 2015, 01:03:15 AM
Es exactamente como dice Silver_light, uso esas funciones porque el código queda más reducido; la expresión
[gml]v_ang = min( v_ang+a_ang, 3.5 );[/gml]
es equivalente a
[gml]
v_ang += a_ang;
if( v_ang > 3.5 ) v_ang = 3.5;
[/gml]
se mantiene el valor de v_ang dentro del límite y el código de dos líneas se hace en una. También se puede usar la función clamp, pero uso min y max porque sólo necesito 2 argumentos y el código es compatible con versiones anteriores a  :GMS: