quiero hacer un movimiento rectilineo que segun vaya llegando a su destino decelere considerablemente la velocidad de avance, he intentado usar chipmunk pero ni zorra de nada; me gustaria ir poco a poco aprendiendo cada una de sus funciones ...
por otro lado lo he intentado con el seno de una circunferencia aplicado solo al eje y (que es el movimiento que quiero hacer) para conseguir el proposito ...
o alguien me enseña a manejar chipmunk para dummies de dumies (idiotas en mi pueblo) o me aconsejais alguna funcion matematica para que el movimiento no sea tan artificial
quiero simular una pseudo gravedad dentro del agua
Yo te recomiendo q te veas un par de conceptos de física xD .. aqui te dejo una web que tiene ejemplos interactivos: http://www.sc.ehu.es/sbweb/fisica/ (http://www.sc.ehu.es/sbweb/fisica/)
¿Qué tal moverte una fracción de la distancia que separa tu cosa de donde tiene que pararse? por ejemplo:
avanzar = distancia/10;
if (avanzar > max_velocidad) avanzar=max_velocidad; end
if (avanzar < 1) avanzar=1; end
y += avanzar;
He puesto 10 como podría haber puesto 3 o 20, eso ya es cuestión de que experimentes. Lo de <1 es porque cuando está cerca, la división empieza a valer 0 y nunca llega a su destino. Este método funciona mejor si se usa RESOLUTION.
Lo pruebas y, si te gusta, lo usas, si no, siempre puedes ir a la fórmula de movimiento rectilineo uniformemente acelerado y calcular a la distancia a la que debe empezar a frenar (y asegurarte que la cosa movil esa pasa por ese punto exacto o no se parará donde quieres :D).
vale, ya voy cogiendo onda, reparto de karmas :D
lo complicado viene ahora, me interesa que ese movimiento sea muy muy lento, pero el añadir 0.5 a la 'y' como que empana al proceso y no lo mueve...
¿hay otro metodo mas simple para que vaya super-pauperrimamente lento??
[edito]
definitivamente el metodo ''incremento de velocidad'' que me estaba apañando no me servia, y he vuelto al seno/angulo/etc...
Como he dicho: usa resolution ;D
Estas cosas son las que ni en la biblia ni en el wiki te dicen como van...
no me entero de ná; ¿¿resolution para que es y como funciona??
al parecer resolution hay que asignarle un valor, pongamos que 3, no se pa que...
a continuacion lo pongo que para que al pulsar una tecla me avance una tercera parte de un pixel pero no hace nada
no entiendo nada de nada de resolution y eso que le estoy dando mas vueltas
Vamos a ver: por defecto, si a X le sumas 1, el proceso avanza un pixel horizontalmente.
Si a su variable LOCAL resolution le asignas el valor 3, para que el proceso avance un pixel tienes que sumarle a X 3, por lo que si en cada frame le sumas 1 tardará 3 frames en avanzar al siguiente pixel.
Si le pones 100, los valores que sumes a X e Y, o los que uses con advance, valdrán centésimas de pixel (aunque visualmente sólo se notará el movimiento de pixel en pixel, pero es porque el pixel es la unidad mínima de representación de una imágen).
Resalto que la variable es LOCAL, por lo que cada proceso tendrá la suya, que puede ser tu problema, y que te los puede causar cuando tengas dos procesos con resolutions distintas interactuando entre sí.
Aaaaah...
migo, que es una
Quote from: Drumpi on November 01, 2011, 07:14:56 PM
variable LOCAL, por lo que cada proceso tendrá la suya
fijate tú como una pamplina tan grande me vuelve loco de tal manera...
ahora al ponerlo dentro de cada proceso tambien hay que cambiarle la posicion de inicio ¿no?
si resolution vale 3 y estaba a 100, tendré que situarlo en 300 ¿no?
Quote from: Futublock on November 02, 2011, 08:51:38 AM
si resolution vale 3 y estaba a 100, tendré que situarlo en 300 ¿no?
O en 100*resolution ... y asi no tienes q cambiar todo si cambias resolution xD
CUIDADO: si se va a multiplicar por resolution, aseguraos antes de que este no vale 0, QUE ES SU VALOR POR DEFECTO. Ya tuve mis más y mis menos por lo mismo.
Una solución a esto es definir, al menos, resolution a 1 en todos los procesos, por si acaso (aunque no sé si esto incrementará los cálculos internos).
si quieres una aceleración y desaceleración en chipmunk lo que tienes que hacer es definir la viscocidad del mundo con gphysics.damping=0.8; //Viscosidad entre 0 y 1
y para aplicar el impulso se usa
APPLYIMPULSE(id,1000,100,0,0);
por ejemplo:
Quote//PRG, ejemplo para el motor de física
import "mod_key";
import "mod_text";
import "mod_proc";
import "mod_grproc";
import "mod_video";
import "mod_wm";
import "mod_map";
import "mod_say";
import "mod_math";
import "mod_screen";
import "mod_chipmunk"
global
//gráficos
cuadro;
bola;
bomba;
Begin
set_mode(800,600,32);
bola=map_new(20,20,32);
map_clear(0,bola,0FFFFFF00h);
gphysics.damping=0.8; //Viscosidad entre 0 y 1
//Cantidad de correcció de intersección cada frame/phresolution
gphysics.bias_coef=0;
bomba(250,150,10.0);
while (!key(_esc))
frame;
end
let_me_alone();
end
process bomba(x,y,float masa)
private
cpVect pos;
pego=true; //se considera que la bomba inicia tocando al protagonista
cpVect velocidad;
begin
lphysics.mass=masa;
priority=father.priority-2;
lphysics.group=2;
lphysics.elasticity=0.3;
lphysics.friction=0;
graph=bola;
lphysics.ShapeType=TYPE_CIRCLE;
forceCreateBody();
//Antes de llamar a getOptimalInertia hay que actualizar el cuerpo, ya sea forzando su creación (cuando éste aún no existe) o haciendo un frame(v) antes, con v igual a cualquier valor o sin v.
lphysics.inertia=GETOPTIMALINERTIA(lphysics.ShapeType,lphysics.shape);
write_var(0,400,300,4,velocidad.x);
write_var(0,400,350,4,velocidad.y);
APPLYIMPULSE(id,1000,100,0,0);
while (!key(_esc))
getBody(lphysics.body,CP_C_V,&velocidad);
frame;
end
end
también puedes aplicar fuerzas en lugar de impulsos y usar updateVelocity para desacelerar más rápido los cuerpos.
Si lo quieres hacer desde bennu puedes usar alguna función como logaritmos o seno usando rangos adecuados, algo así:
Quoteprocess avd()
private int av=-90000;
begin
x=100;
y=100;
graph=bola;
loop
if (av<0)
av+=300;
x-=sin(av)*4;
end
frame;
end
end