Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: izubiaurre on July 06, 2011, 03:22:18 PM

Title: Movimiento suave
Post by: izubiaurre on July 06, 2011, 03:22:18 PM
Hola

necesito que algunos gráficos se muevan horizontalmente o verticalmente. El caso es que el movimiento constante tipo x + = 5; ó y + = 5; quedan algo planos. ¿Alguien conoce alguna fórmula o algún modo para hacerlo en forma suave? En plan, aceleración suave hasta velocidad constante y luego de nuevo decelerar de modo suave.

Un saludo
Title: Re: Movimiento suave
Post by: Futu-block on July 06, 2011, 03:34:09 PM
usa bloques for

del tipo:

[code language="bennu"]
private
int variable_cuaquiera;

...
bla bla bla
...

for (variable_cuaquiera = 0; variable_cuaquiera < 25; variable_cuaquiera++)
    x++;
    frame(150);
end

...
bla bla bla
...
[/code]

ese 150 dentro de los parentesis del frame es lo que marca la velocidad, cuanto mas pequeño mas rapido; ahí es donde tienes que jugar tu, con la velocidad del frame, con la distancia de movimiento
[code language="bennu" options="singleline"]variable_cuaquiera = 0; variable_cuaquiera < 25;[/code]
y repitiendo ese bloque for tres veces, uno para ir despacio, otro para mas velocidad y se nota el aceleron y el ultimo para frenar.

si lo metes dentro del loop el proceso se queda como congelado esperando a terminar el bloque for para seguir con las instrucciones, lo que en verdad hace es seguir las instrucciones tantos frames como el parentesis indica...


¿te he liado mucho??
Title: Re: Movimiento suave
Post by: Arcontus on July 06, 2011, 06:16:36 PM
El problema que planteas es muy simple de solventar. Para que un proceso haga una aceleración/deceleración, a la coordenada o función advance, no se puede pasar un valor fijo como haces tu de +5, en vez de eso, usamos una variable aceleración:

ej:
...
if (key(_up))
acelerar++;
END
if (key(_down))
acelerar--;
END
x = x + acelerar;
...

Si quisieras añadir un valor máximo y mínimo de aceleración, por ejemplo 5 y 0, quedaría de la siguiente manera:

...
if ((key(_up)) && (acelerar < 5))
acelerar++;
END
if (key(_down) && (acelerar > 0))
acelerar--;
END
x = x + acelerar;
...

Espero haberte ayudado.

Saludos!
Title: Re: Movimiento suave
Post by: izubiaurre on July 06, 2011, 07:53:32 PM
Mientras esataba nadando en la pistina se me ha encendido una bombilla. Se podría hacer basándose en las funciones sin(x) y cos(x), ¿verdad?
Title: Re: Movimiento suave
Post by: Drumpi on July 06, 2011, 08:07:30 PM
La solución de Arcontus es la que más se acerca... bueno, lo digo porque se puede hacer que si se pulsa el acelerador, aumente "aceleración", y si no que disminuya, porque tal como lo ha planteado, si no se pulsa ningún botón se mantiene la velocidad.

Pero sí, puedes hacer que el incremento sea sinusoidal y quedaría más realista, pero si puedes hacerlo "tangencial" (con una forma gráfica similar a una S), mejor (nunca he sabido cómo se hacía ese tipo, cambiando la velocidad de aceleración en cada momento, como se ven en las gráficas del FZero de SNES).