Movimiento suave

Started by izubiaurre, July 06, 2011, 03:22:18 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

izubiaurre

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

Futu-block

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??

Arcontus

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!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

izubiaurre

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?

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)