Hola Amaka, puedo pedirte una función para tu DivGO?
El caso es que ejecutarla por código consume bastante, pero en javascript va como un tiro de rápida, lo he probado y funciona exageradamente bien, es la famosa función constraint() que programé para mi motor de física dinámica, sería un detalle si la incluyeras como nativa para procesos.
Por si no estás al día de lo que hace te lo explico en resumen, creo que es una función valiosa que sirve para todos los juegos y que en definitiva suple las carencias de getDist() y getAngle() aunando su uso y aplicando el resultado a procesos directamente, con lo que la hace especialmente útil para este tipo de lenguajes.
En si la función constraint() es un integrador proporcional muy extendido en todos los motores de física actuales, se puede implementar de varias formas y se pueden aplicar los resultados de diversas maneras, pero las mas importante para un lenguaje estilo DIV es la posibilidad de unir mediante un joint a 2 procesos.
Si estás minimamente interesado en añadirla como nativa a tu engine no tengo ningún problema en explicarte detalladamente como funciona, los usos que se le puede dar, documentarla y comentarte los diversos overloads que debería tener para ser todo lo flexible que uno necesite.
Dime que tenias pensado, soy todo oídos. A ver si para la próxima versión puedo darte la alegría.
Para unir dos procesos, por lo que dices, tengo una función ahora mismo (DivGO 0.28): get_union(id, distancia, elasticidad), hace como un pequeño campo gravitatorio entre dos procesos y puedes ajustar la distancia del centro y la elasticidad.
Anda pues seguramente te sirva la función que te quería comentar, lo que permite es esto:
A bajo nivel une dos vectores con una elasticidad que afecta al integrador proporcional, también se puede especificar si uno de los 2 vectores debe ser estático y no recibir la realimentación de corrección de posición.
A alto nivel que es lo que nos interesa: Nomenclatura de la función "ya que se conoce en todos los lenguajes con este nombre sería bueno que se llamase así pero solo es una idea " INT CONSTRAINT();
Donde: 'a' indica el ID del proceso A. 'aStatic' indica si el proceso A debe ser integrado. 'b' indica el ID del proceso B. 'bStatic' indica si el proceso B debe ser integrado. 'distancia' indica la distancia entre centros que debe integrar la función. 'elasticidad' indica la elasticidad que debe tenerse en cuenta para la integración "grado de rigidez de la unión/joint".
function constraint(int a,int aStatic,int b,int bStatic,float distancia,float elasticidad);
private
float xdist;
float ydist;
float dist;
float diff;
float correccion;
float angulo;
begin
// comprovar si se trata de dos bodies fijos..
if(aStatic ==true&& bStatic ==true)
Return(0);
end
// determinar la separación escalar entre bodies..
xdist = a.x- b.x;
ydist = a.y- b.y;
// determinar la separación en el plano entre bodies..
dist =sqrt((xdist*xdist)+(ydist*ydist));
diff = dist - distancia;
// si la distancia es despreciable no se hace nada (performance up!)..
if(abs(diff)<1)
Return(0);
end
if(aStatic || bStatic)
correccion = diff;
else
correccion = diff /2.0;
end
// determinar el angulo que forman los centros de los bodies entre si..
angulo =-atan2(xdist,ydist);
// si el nodo a no es fijo se integra su nueva posición..
if(!aStatic)
a.x+= correccion *sin(angulo)* elasticidad;
a.y-= correccion *cos(angulo)* elasticidad;
end
// sie l nodo b no es fijo se integra su nueva posición..
if(!bStatic)
b.x-= correccion *sin(angulo)* elasticidad;
b.y+= correccion *cos(angulo)* elasticidad;
end
Return(0);
end
Funcionamiento: - Para usar esta función simplemente se deja dentro del bucle de un proceso, durante sucesivos frames la distancia entre los 2 procesos indicados en los parámetros de la función se irá integrando, esto no es lo mismo que crear el joint y mediante un identificador a el poder manipularlo, es la versión sin "engine" para usar, la cual creo que sería un buen punto de partida pues esta función es el núcleo de cualquier motor de física, en este caso está presentada por escalares con signo para evitar el uso de vectores por pura comodidad
Con esta simple función se consigen cosas como estas en Gemix, te pego un vídeo de mi librería de física usando esta función: La cadena de bolas está creada exclusivamente con constraints, es una pasada.
Si añades esto y funciona bien en DivGO podemos mirar la otra función también super interesante que comprueba intersección entre un circulo y una linea, y con lo que he aprendido utlimamente casi podría decirte como hacer un pequeño motor de física para tu DivGO, es realmente mas simple de lo que parece, con constraints eficientes, y sin pretender hacer una ChipMunk o Box2D se puede perfectamente hacer un engine que permita física con objetos circulares y segmentos, que al final por rendimiento es lo que uno acaba usando aunque disponga de todo lo demás
Gracias Jose un detalle por tu parte El tema de los juegos web está en todo su auge, no se si durará pero la gente ya no quiere descargar ni gratis XD.. habrá que probar haber que pasa..
Pues ya tengo la función constraint() aplicada en DivGO, para la próxima versión.
Si, los juegos web y sobre todo los juegos móviles, están en pleno auge. Supongo también que la gente ahora es más selectiva a la hora de descargar un juego para ordenador, hay mucha competencia y si no se ve gráficamente impresionante (FULL HD y sin que se vea un solo pixel) o no tienen el suficiente 3d con efectos mágicos que te dejen medio estéril, como que cuesta.
Por cierto, un paso adelante en calidad sería tener un pequeño motor de física de verdad en DivGO, simplificaría mucho el diseño de los juegos, y aunque la gente suele decir que los juegos con física tienen ese efecto que "canta a leguas" no es cierto en absoluto, se pueden hacer muy fácilmente juegos estilo retro y no se nota nada raro en absoluto.
Sabias que Chipmunk está disponible para JS? y es realmente simple de usar Amaka, yo la estoy usando activamente y es realmente una librería sencilla de usar y con resultados buenisimos, es la lib que mas performance ofrece en 2D de las que tienen licencia MIT, hay port a Javascript jeje.. ahí te dejo el dato
Como llevas la nueva versión Amaka? alguna novedad interesante? fecha de salida de la versión descargable? voy a intentar montar un entorno 'todo-en-1' basándome en el Notepad++ como editor, haber que consigo..
Fecha exacta no tengo... me gustaría tenerlo para este mes, antes de las vacaciones. Lo del notepad++ también me lo estuve mirando, tengo instalada la versión 6.3.3, pero no pude configurarlo para que coja las funciones y variables de DivGO (autocompletar y colorear), o lo de pasar el código a compilador.php, aunque para esto último recuerdo haber encontrado tutoriales de como hacerlo.
Y las novedades, lo que ya hay funcionando actualmente para la versión 0.28: - funciones: near_angle(), constraint() - variables: timer[9], declaración de const (por compatibilidad con IE const crea variables globales) - arreglo de muchos bugs del compilador: ahora hasta funciona el código de ejemplo en Div2 del juego plataformas - arreglado problema con declaración de variables locales - mejoras en el entorno, ahora el código se autoguarda bien cuando cierras el navegador
Y lo que tengo pendiente (o lo que desearía que ya incluyera esta versión): - funciones: path_find(), path_free(), path_line() - variables: s_kill_tree, s_sleep_tree, s_freeze_tree, s_wakeup_tree (actualmente funcionan s_kill, s_sleep, s_freeze, s_wakeup) - arreglar fade()