Hola a todos, estoy empezando a usar el lenguaje y ya tengo mis primeras dudas, en concreto seria la manera de implementar gravedad a un proceso (para el salto), vi un ejemplo en el manual pdf de osk pero no me quedo muy claro, me gustaria que tenga aceleracion y desaceleracion (para hacerlo mas realista). quiza alguien tenga algun ejemplo a mano?... bueno eso es todo espero alguna respuesta gracias
Implementar algo que parezca a la gravedad parece facil pero no lo es xDDD si tienes el BennuPack instalado busca el juego de EEEEEKK EEEKKK OOOOKKK .. q tiene un sistema para el salto de mono muy chulo. Te marearás buscando la parte del codigo exacto pero asi aprendes a leer codigo de otros y puedes sacar ideas. Si te ves que te supera y es demasiado complejo para tí, no tengas prisa. Prueba cosas mas sencillas.
si, se que es complicado, por las formulas y demas, mucha fisica para que quede bien. voy a mirar el juego que mencionas, gracias
Honestamente, soy malísimo en matemáticas y no tengo ni idea de programar físicas. Pero no hay que saber demasiado o ser un genio para conseguirlo :)
Pégale un vistazo a este código simple.
http://www.pixjuegos.com/descargas/nyan.rar
La gravedad practicamente se resume en una elipse, asi que toca matematicas con seno coseno in tangente...
Si nos ponemos a analizar la gravedad de algo lanzado hacia arriba (un tio saltando es lo mismo ;) ) al principio la fuerza aplicada es muy grande pero vá reduciendo gradualmente u de movimiento no lineal, hasta que llega a un punto cero donde los valores se invierten...
te hago un esquemita y en cinco minutillos te lo cuelgo ;)
Aqui tienes el ejemplo, al aumentar el radio el valor del seno aumentará de forma gradual en relacion a la circunferencia
Ahora lo que deves hacer es no avanzar en x
(http://forum.bennugd.org/index.php?action=dlattach;topic=3290.0;attach=2651)
La solucion de laghengar es la más simple. Y si usas floats, o la local RESOLUTION, podes darle mucha suavidad al movimiento.
Buenas, me permito contestar para recomendaros algo ya que en estos ultimos meses he estado desarrollando una pequeña librería de física vectorial con velocidad, gravedad, colisiones, delta_time y colisiones de objetos enlazados por constraints etc etc..
La gravedad no es mas que un vector "tanto en la realidad como en la programación", no la mires como una elipse ni como un "apaño" para tu programa, mira a la gravedad como lo que es, algo que te empuja en una dirección hasta que toques un suelo ;)
Mi recomendación es que te pares una hora a estudiar los teoremas de un señor llamado "Verlet" en cual describe un sencillo sistema para implementar un mecanismo de física realista con calculos para nada complejos.
Te doy una pista sobre la gravedad, en un programa tienes que expresarla de igual manera que la expresa box2d o chipmunk, bueno.. hay 2 formas de expresarla, la mas sencilla de las dos y que luego te va a servir para poder calcular todo lo demás "sin complicaciones" es esta:
aGravity = 90000.0;
vGravity = 0.098;
Que es eso? dos simples variables "globales" que expresan el angulo de la gravedad y el valor de su aceleración.
Si lo haces así luego podrás simplemente cambiar el angulo de la gravedad y que los objetos floten etc etc..
Como añadir la gravedad a un proceso?
Es lo mas simple del mundo, dentro de su bucle 'LOOP':
x += vGravity * COS(aGravity);
y += vGravity * SIN(aGravity);
Mola no? prueba a cambiar el angulo de la gravedad y verás como puedes orientarla hacia donde tu quieras..
Como parar la gravedad o simplemente anular su efecto?
Sencillo también:
fi(NOT toco_suelo)
//.. aquí el código anterior..
end
La variable 'toco_suelo' simplemente debe estár en TRUE/FALSE en función de si ese proceso toca un suelo/plataforma o no.
El resultado de este sistema de gravedad lo puedes ver en este vídeo, el programa no usa ninguna librería de física, bueno si que una una. la que yo me he programado ;)
Así que te aseguro que este es un buen punto de partida.
Un saludo.
http://www.youtube.com/watch?v=tL0ti2YXdK8
Ahora salgo a comprar algo.. cuando vuelva si no se me la cabeza con otra cosa te explico también un tema importante, las 4 propiedades que tiene que tener cualquier objeto para que se le pueda aplicar física de Verlet y te copio y pego una función llamada updateVector() para que no tengas ni que hacerlo tu.. esta función es la encargada de convertir posición en velocidad y apartir de ese momento para mover a un personaje ya no tendrás que hacer mas x++ si no que tendrás que hacer vx_ += 0.1
El resultado será el mismo pero con un sistema de fricción automático, esto suavizará enormemente todos los movimientos dejandolos a la altura de cualquier lib de física.
muy bueno erkosone, felicitaciones...
esto esta en bennugd o en gemix (que a decir verdad el otro dia entre a su pagina y me puse a ver unos videos de los juegos que hay hechos con el o en desarrollo y debo reconocer que se mueve bien) ?
piensas compartir la libreria de fisica que has hecho?
Gracias Splinter, la verdad es que me ha costado ponerme a estudiar unos meses para poder montarla, he tenido que aprender "pero de verdad" trigonometría, geometría, física dinámica, cinemática, cinemática inversa, deformación de cuerpos elásticos.. y para el tema de la respuesta de las colisiones ya ha sido el no va mas, es un tema apasionante para mi y en su día pensé que si lograba hacer una librería por mi mismo aunque fuera mínima con un escenario vectorizado a lineas y un motor de física realista para una lista de objetos sencillos, entonces cuando me pusiera ya en serio a usar box2D o chipmunk sería capaz de sacarle todo el potencial a estas librerías ya de categoría superior.
Pues el vídeo que se ve exactamente está programado en gemix, pero el código es completamente portable a BennuGD y la idea es compartirlo por supuesto, es open source completamente y lo mejor de todo es que está programada en el propio lenguaje de scripting, con lo que es completamente personalizable y expandible.
Lo del lenguaje en si es lo de menos, me puse como meta personal que la lib no dependiera de ningúna de las funciones de ningún lenguaje, así es portable desde C a pelo hasta cualquier otro lenguaje como lo es BennuGD o gemix.
Estos días un colega ha estado testeandola y la está usando para un juego, le ha añadido varias propiedades que no tenía y me ha sugerido de añadir algunas mas que todavía no tiene, en cuanto tenga un poco de tiempo la traduciré a bennu por que es cosa de 30 minutos.
Lo mejor de todo esto no es que sea una lib muy muy poderosa, si no mas bien que está con todo el código a la vista y creo que se entiende bastante bien, así que cualquiera puede añadirle lo que necesite y no va a tener ningún problema en que no sea compatible con cualquier plataforma ;)
Ahora mismo tengo 2 librerías por separado, la que uso para juegos que dispone de:
- Gravedad vectorial.
- Velocidad por escalares con signo.
- Objetos tipo Circulo.
- Sistema de inercia real "en un rebote se calcula el llamado 'momentum' o momento de inercia" y todo se resuelve en base a las teorías de verlet aplicadas a cuerpos de masa conocida.
- Sistema automático de asignación de masa a un objeto. "en función de su radio".
- Sistema automatizado de detección de colisión entre "circulo - segmento".
- Sistema automatizado de detección de colisión entre "circulo - circulo".
- Sistema de transmisión de energía entre objetos en un choque "lo mismo que el momentum pero entre objetos tipo circulo".
Y lo mas complejo de todo esto:
- Sistema encargado del DELTA_TIME o también llamado TIME_STEEP que parte 1 frame en n' subframes y soluciona las colisiones con una precisión muy elevada ya que objetos de reducido tamaño podrían atravesar a otros objetos también pequeños y no sería posible detectar la colisión, este sistema precalcula n' veces toda la física necesaria para que ningún objeto atraviese a otro.
Y luego tengo el segundo motor que es específico para animación por cinemática inversa, trata sobre unir puntos para formar figuras complejas, todo el sistema que calcula el centro de gravedad, la inercia, la fricción y estas cosas ya lo tengo terminado, ahora me falta la resolución de colisiones que es algo realmente duro, he hecho algunas pruebas con exito pero de verdad que tengo que estudiar un poco mas para dominar tal cosa, es realmente un tema complejo, si logro realizar esto con exito pues ya tendré una librería de física completa, pero es el paso mas complicado de todos, y aunque he resuelto parte del problema y en casos concretos con 2 o 3 objetos funciona, con mas objetos es realmente caótico y tengo que repasar los calculos que he implementado en esa parte "respuesta de colisión entre objetos complejos formados por vectores interconectados por constraints".
Suena feo XD.. realmente es duro de entender.
Pues por lo que cuentas suena estupendamente!! Felicidades porq sé que es un tema complejo. Estoy deseando echarle mano a esa libreria que puede aportar cosas estupendas. Animo.
Bueno.. a lo que iba, la función de la que hablaba es esta:
function updatePoint( x );
private
float dx;
float dy;
begin
dx = ( (nodos
- .x_ - nodos
- .oldx_) * 1.0 / (float)timeSteep);
dy = ( (nodos - .y_ - nodos
- .oldy_) * 1.0 / (float)timeSteep);
nodos - .oldx_ += dx;
nodos - .oldy_ += dy;
nodos - .x_ += friction * (dx + vGravity * cos(aGravity));
nodos - .y_ += friction * (dy + vGravity * sin(aGravity));
return(0);
end
Es muy sencilla de entender pero la explico a fondo para que el concepto de como usarla quede claro:
- Basicamente en mi caso y para mi motor he creado una estructura llamada nodos.
En realidad es un typedef pero eso no viene al caso..
Vale, que hace esta función?
- Hablando en general actualiza la posición de un vector, y eso para que me sirve en un juego donde no hay un motor de física todavía?
Vale.. veamos de convertir esta función para que sea aplicable a un simple proceso.
Teoría:
- Para empezar tenemos que saber que mover por pantalla a un objeto dependiendo de una velocidad es un completo error, aveces cuando uno no sabe como hacerlo pues lo hace así, pero no es la mejor solución, simplemente por que estamos pasando por alto unos datos que son muy importantes, la posición relativa anterior y la posición relativa actual, que entre las dos generan la posición realtiva del siguiente frame.
Entonces? que debe tener un proceso para tratarlo como si formara parte de los elementos de un motor de física?
Un proceso debe tener 4 variables LOCAL primordiales para hacer las cosas bien, y para que no estemos limitados a la imprecisión de los datos tipo INT deben ser "como mínimo" del tipo FLOAT.
Tales variables son:
float oldX_
float oldY_
float x_
float y_
Que representan estas variables?
oldX_ y oldY_ indican la posición que tenía el objeto "proceso en este caso" en el frame anterior,
X_ e Y_ indican la posición actual que tiene el proceso en el frame actual.
También tenemos que disponer de una variable GLOBAL llamada: 'FRICTION' y tiene que ser "como mínimo" del tipo float.
Para que sirve esta variable?
- Simple, será la encargada del control de inercia de los objetos, dado que en el bucle de los objetos que hagan uso de este sistema que estoy explicando existirá la llamada a la función updatePoint() en ella será donde se aplique la denominada "fricción" que será la encargada de frenar con mayor o menor suavidad a los objetos.
Que valores debe tener la variable FRICTION?
para un valor de 1.0 no existirá fricción, osea, los objetos no perderán parte de su inercia/enegía durante el tiempo
para un valor de 0.0 la fricción será maxima y los objetos no serán capaces de moverse.
Esto nos da un amplio rango de valores para experimentar y observar los resultandos, customizando de esta manera el comportamiento de nuestra pequeña física ingame.
Y todo esto para que me sirve?
- Simplemente para calcular con absoluta precisión la velocidad de desplazamiento del proceso "entiéndase que nos referimos al gráfico del proceso".
Vale.. y como debe un proceso gestionar su movimiento según esta teoría?
- Simple, como en este ejemplo:
Process pepito();
begin
graph = ...
loop
// ejemplo simplisimo de movimiento..
if(key(_left)) X_ --; end
UpdatePoint();
frame;
end
end
Con esto tenemos que si pulsamos el cursor izquierdo la variable LOCAL 'X_' disminuye.. simple.
También vemos que se llama a la función UpdatePoint();
Como debe quedar la función para que funcione con procesos y aplique la gravedad automáticamente?
function updatePoint();
private
float dx;
float dy;
begin
dx = father.x_ - father.oldx_;
dy = father.y_ - father.oldy_;
father.oldx_ += dx;
father.oldy_ += dy;
father.x_ += friction * (dx + vGravity * cos(aGravity));
father.x = father.x_;
father.y_ += friction * (dy + vGravity * sin(aGravity));
father.y = father.y_;
return(0);
end
Como se puede ver, la función procesa la perdida de inercia, las velocidades, aplica la gravedad global del mundo al objeto, y finalmente actualiza la posición del proceso que la ha llamado.
Espero que os sea de ayuda ;)
Haaa!! se me olvidaba.. como unica precaución para que los objetos no salgas disparados al inicio se debe especificar en el proceso lo siguiente:
En el momento de asignar un valor inicial a X y a Y se debe hacer así para que el objeto no tenga ningúna velocidad inicial:
Supongamos que se quiere iniciar un proceso en la posición de pantalla x = 100, y = 200;
Se debe hacer así:
x = x_ = oldx_ = 100;
y = y_ = oldy_ = 200;
Esto solo en la inicialización, por que como ya habréis deducido, tanto la velocidad, la inercia, la fricción o energía, y la gravedad se calculan en base a los valores de X_/Y_ y oldX_/oldY_, la función UpdatePoint() ya se encarga de actualizar las X/Y reales del proceso, así que cualquier modificación de posición debe hacerse siempre sobre las variables:
X_
Y_
Ahora ya si, a disfrutarlo ;)
NOTA: Todo esto lo estoy contando de cabeza, si alguien lo prueba y tiene algún problema que no tenga reparo en comentarlo por aquí mismo, encantado le hecho una mano.
Así leyendo lo que he puesto creo que me he pasado XD..
Solo preguntaban por la gravedad y me he liado a escribir sobre un sistema "básico" pero completo, esto engloba las propiedades:
Inercia.
Fricción.
Gravedad "vectorial".
Velocidad desatendida.
Pero vaya.. que como info en general mola mucho ver como desde una simple función se puede agrupar todo el control de tantos comportamientos que yo mismo y supongo que casi todos nosotros nos hemos matado a montar a mano durante muchos años por separado en todos los objetos de un juego..
Merece la pena completamente usar este sistema u otro similar a este en concepto, con esto nos despreocupamos de casi todo lo relacionado con el movimiento de un juego sencillo.
una pregunta, o quizas tambien una sugerencia...
tu dices que la fisica se basa en gravedad y angulo de gravedad... pero no seria mejor poder definir objetos con (centro de) gravedad y que los demas objetos interactuen con este de acuerdo a la fuerza de gravedad que este objeto tiene y a la distancia que estan (obviamente el angulo se calcularia solo)?
por ejemplo, defino un objeto tipo planeta tierra (su centro) y la fuerza de su gravedad, ahora empiezo a poner objetos mas chicos, que seran atraidos por este centro, hasta encontrar un suelo, segun la distancia de este suelo se modifica automaticamente el angulo y la fuerza con que interactuan... lo mismo podria tener un objeto tierra y un objeto luna, ambos con su gravedad y los objetos que se aproximan a uno u a otro, seran afectados por la fuerza de gravedad de estos objetos.
no seria mejor que la cosa sea asi? digamos que solo cambiaria lo del angulo que seria calculado automaticamente...
Bueno, a primera vista suena bastante razonable, pero por algún motivo este concepto no se explica en ningún artículo sobre el tema "de los que yo he estudiado", he estado empollando primero una buena base de matemáticas y vectores y luego me he metido con la física dinámica aplicada y no he visto que se hable desde este punto de vista en ningún sitio, lo cual no quiere decir que no tenga sentido ni mucho menos, supongo que mirar la física de una forma tan "global" o "desde lejos" quizá dista un poco de lo que es en si una simulación sobre una escena.
Pero es una buena pregunta, la verdad es que no me lo había planteado de esta manera.
no importa, si liberas los fuentes luego cuando tenga tiempo la adapto yo para eso, no creo sea complicado.
pero si piensas en el angry bird space, seguro tiene algo de eso, porque hay muchos niveles donde hay mas de 1 planeta y los pajaros cambian la trayectoria segun a que distancia de cada planeta se encuentre, y tambien si mal no recuerdo, afecta segun el tamaño de cada uno de los planetas.
Yo creo q el metodo de Erkosone es igual de valido que el que plantea Splinter. Con la diferencia que estais refiriendoos a la gravedad en dos escalas distintas. Lo que plantea Erkosone es un campo gravitatorio donde la gravedad apunta en una dirección, es perfectamente valido para un microentorno, como por ejemplo como actuaría la gravedad en una ciudad. Lo que dice Splinter es mas apropiado para un macroentorno donde las fuentes de esa gravedad tienen una dimension puntual, porque toda esa masa esta en un punto y el potencial gravitatorio apunta a ese unico punto del espacio. Esto es mas apropiado para simular planetas y esta clase de condiciones.
Los dos estais diciendo cosas correctas pero en niveles de escala distinta.
Por cierto Erkosone cuando liberes la libreria .. toda la explicación de como funciona y ejemplos hazlo en un pdf como el manual de Osk para que este todo junto y tal y así mejoramos la calidad de la documentación.
Ok, montaré un manual de uso junto con una explicación del código, así se podrá ampliar facilmente.
Mi método que es perfectamente válido y sencillo no le gusta a nadie no? Vale, vale, joios XD.
todo metodo es valido...
Nada nada, quiero a todo el mundo usar vectores para cualquier cosa, si no me liaré a hacer copia pegas tochos de métodos super complicados. ;D
Quote from: SplinterGU on November 20, 2012, 09:55:45 PM
una pregunta, o quizas tambien una sugerencia...
tu dices que la fisica se basa en gravedad y angulo de gravedad... pero no seria mejor poder definir objetos con (centro de) gravedad y que los demas objetos interactuen con este de acuerdo a la fuerza de gravedad que este objeto tiene y a la distancia que estan (obviamente el angulo se calcularia solo)?
por ejemplo, defino un objeto tipo planeta tierra (su centro) y la fuerza de su gravedad, ahora empiezo a poner objetos mas chicos, que seran atraidos por este centro, hasta encontrar un suelo, segun la distancia de este suelo se modifica automaticamente el angulo y la fuerza con que interactuan... lo mismo podria tener un objeto tierra y un objeto luna, ambos con su gravedad y los objetos que se aproximan a uno u a otro, seran afectados por la fuerza de gravedad de estos objetos.
no seria mejor que la cosa sea asi? digamos que solo cambiaria lo del angulo que seria calculado automaticamente...
curioso, se me ocurrio algo similar...
aun me falta codificarlo y probarlo
solo que ademas de la posicion (x,y) y la fuerza gravitatoria, coloque un limite o alcanze maximo (fuera de eso la gravedad provocada por la fuente es 0) y un factor de atenuacion (o cuanto se atenua por pixel)
con la posicion de la fuente y la propia del objeto se calcula la distancia y el angulo a la fuente
luego se obtiene un vector, al cual se le aplica la gravedad, se proyecta dicho vector en los eje X e Y, y se resta a la posicion del objeto
Quote from: Rein (K´)ah Al-Ghul on November 22, 2012, 07:45:25 PM
Quote from: SplinterGU on November 20, 2012, 09:55:45 PM
una pregunta, o quizas tambien una sugerencia...
tu dices que la fisica se basa en gravedad y angulo de gravedad... pero no seria mejor poder definir objetos con (centro de) gravedad y que los demas objetos interactuen con este de acuerdo a la fuerza de gravedad que este objeto tiene y a la distancia que estan (obviamente el angulo se calcularia solo)?
por ejemplo, defino un objeto tipo planeta tierra (su centro) y la fuerza de su gravedad, ahora empiezo a poner objetos mas chicos, que seran atraidos por este centro, hasta encontrar un suelo, segun la distancia de este suelo se modifica automaticamente el angulo y la fuerza con que interactuan... lo mismo podria tener un objeto tierra y un objeto luna, ambos con su gravedad y los objetos que se aproximan a uno u a otro, seran afectados por la fuerza de gravedad de estos objetos.
no seria mejor que la cosa sea asi? digamos que solo cambiaria lo del angulo que seria calculado automaticamente...
curioso, se me ocurrio algo similar...
aun me falta codificarlo y probarlo
solo que ademas de la posicion (x,y) y la fuerza gravitatoria, coloque un limite o alcanze maximo (fuera de eso la gravedad provocada por la fuente es 0) y un factor de atenuacion (o cuanto se atenua por pixel)
con la posicion de la fuente y la propia del objeto se calcula la distancia y el angulo a la fuente
luego se obtiene un vector, al cual se le aplica la gravedad, se proyecta dicho vector en los eje X e Y, y se resta a la posicion del objeto
es que a medida que te alejas, la fuerza de atraccion de la gravedad va perdiendo fuerza, segun la fuerza (que tambien depende de la masa) es el radio de accion... aunque quizas no haya radio, sino fuerza segun distancia... y ese modelo es valido para cualquier cosa, macro y micro... ya que lo importante es donde se encuentre el centro de gravedad, puedes tener un escenario de 500mts o 1km y tener un centro de gravedad a 100km o 200km, no importa la distancia, pero la fisica deberia funcionar igual... como funciona en la vida real... para mi, es una unica simulacion... segun pienso, es un error pensar en una simulacion para macro y otra para micro... eso pienso yo, desde mi total ignorancia.
Pues ahí te equivocas Splinter !! xDDD Te lo dice uno que desperdició 5 años de vida en la Facultad de Física de la Universidad de Sevilla (España) hasta rendirse y cambiarse a Económicas jajajajajaja.
En un sistema micro ( una ciudad por ejemplo) el valor de la gravedad se toma constante y la dirección también. Para simplificar los cálculos .. no merece la pena utilizar la ley de gravitación universal para esos casos, porq la precisión no te hace falta y vas a tener un sobrecoste de calculo.
En un sistema macro (como un sistema planetario) si se usa la ley completa porq la dirección y la intensidad varían en el campo. También se hace una simplificación muy grande porque se estima que la masa del planeta es puntual. Si quieres considerar el volumen del planeta los cálculos se complican y para nosotros en este caso no nos aporta nada.
En la ley de gravitación universal el concepto de radio q aparece en la ecuación hace referencia a la distancia entre los dos puntos de masa, no al radio del planeta, la fuerza disminuye en intensidad con el cuadrado de la distancia, no linealmente.
Como bien dices Splinter para simular la gravedad se utiliza esta ley unicamente, pero si vas a simular un entorno micro como yo le digo, no merece la pena unos calculos tan costosos para los resultados q obtienes. Si vas a simular un objeto que orbita al rededor de otro si merece la pena, y aun asi se puede simplificar la cosa.
Quote from: SplinterGU on November 22, 2012, 08:04:48 PM
Quote from: Rein (K´)ah Al-Ghul on November 22, 2012, 07:45:25 PM
Quote from: SplinterGU on November 20, 2012, 09:55:45 PM
una pregunta, o quizas tambien una sugerencia...
tu dices que la fisica se basa en gravedad y angulo de gravedad... pero no seria mejor poder definir objetos con (centro de) gravedad y que los demas objetos interactuen con este de acuerdo a la fuerza de gravedad que este objeto tiene y a la distancia que estan (obviamente el angulo se calcularia solo)?
por ejemplo, defino un objeto tipo planeta tierra (su centro) y la fuerza de su gravedad, ahora empiezo a poner objetos mas chicos, que seran atraidos por este centro, hasta encontrar un suelo, segun la distancia de este suelo se modifica automaticamente el angulo y la fuerza con que interactuan... lo mismo podria tener un objeto tierra y un objeto luna, ambos con su gravedad y los objetos que se aproximan a uno u a otro, seran afectados por la fuerza de gravedad de estos objetos.
no seria mejor que la cosa sea asi? digamos que solo cambiaria lo del angulo que seria calculado automaticamente...
curioso, se me ocurrio algo similar...
aun me falta codificarlo y probarlo
solo que ademas de la posicion (x,y) y la fuerza gravitatoria, coloque un limite o alcanze maximo (fuera de eso la gravedad provocada por la fuente es 0) y un factor de atenuacion (o cuanto se atenua por pixel)
con la posicion de la fuente y la propia del objeto se calcula la distancia y el angulo a la fuente
luego se obtiene un vector, al cual se le aplica la gravedad, se proyecta dicho vector en los eje X e Y, y se resta a la posicion del objeto
es que a medida que te alejas, la fuerza de atraccion de la gravedad va perdiendo fuerza, segun la fuerza (que tambien depende de la masa) es el radio de accion... aunque quizas no haya radio, sino fuerza segun distancia... y ese modelo es valido para cualquier cosa, macro y micro... ya que lo importante es donde se encuentre el centro de gravedad, puedes tener un escenario de 500mts o 1km y tener un centro de gravedad a 100km o 200km, no importa la distancia, pero la fisica deberia funcionar igual... como funciona en la vida real... para mi, es una unica simulacion... segun pienso, es un error pensar en una simulacion para macro y otra para micro... eso pienso yo, desde mi total ignorancia.
Splinter, creo que tienes mucha razon, yo lo veo que el modelo seria el mismo para cualquier distancia.
Pero para ser mas exactos, (la verdad es que seria muy costoso de trabajo), que yo creo que debe haber el minimo de leyes posibles, y a partir de ahi sacar las funciones para el calculo. Pues que yo creo que las leyes fisicas estan regidas por leyes moleculares, y estas por los atomos, estas por neutron proton y electron, y estas por subparticulas, (la fisica cuantica). Y mucho nos queda por descubrir...
Segun esto, pienso que la mejor libreria de fisica (no hablando de fisica solo, sino de fisica-cuantica, quimica, etc.) seria una que organizara todas estas leyes, en una sola (la mas simple) y a partir de esta las derivadas, pudiendo crear asi funciones y funciones.
No solo eso, sino que asi se podria recrear facilmente el comportamiento humano (que no es mas que un monton de particulas chocando). y el futuro, analizando toda la materia y energia particula por particula. Claro, pero ya no estarias solo tratando de analizar las particulas de el tiempo en el que estas, sino de muchos mas universos temporales que al verlos en la el programa recreados, puedan afectar al espectador y cambiar sus pensamientos.
Y esto supondria crear unos nuevos ficheros, que lleven codificada la informacion de cada particula.
Aunque pueda parecer que se mucho, lo respondo como un chaval con mucha imaginacion XD, y que no tengo mucha idea.
En resumen... que para crear una lib de que incluya toda la ciencia todavia nos queda, pero que para una lib de fisica como decis prefiero la idea de Splinter, porque lo que se trata mas o menos es emular la realidad. Ya sea distorsionandola como el Mario Galaxy, o hacerla parecida como cualquier juego.
Quote from: KeoH on November 22, 2012, 08:29:11 PM
Pues ahí te equivocas Splinter !! xDDD Te lo dice uno que desperdició 5 años de vida en la Facultad de Física de la Universidad de Sevilla (España) hasta rendirse y cambiarse a Económicas jajajajajaja.
En un sistema micro ( una ciudad por ejemplo) el valor de la gravedad se toma constante y la dirección también. Para simplificar los cálculos .. no merece la pena utilizar la ley de gravitación universal para esos casos, porq la precisión no te hace falta y vas a tener un sobrecoste de calculo.
En un sistema macro (como un sistema planetario) si se usa la ley completa porq la dirección y la intensidad varían en el campo. También se hace una simplificación muy grande porque se estima que la masa del planeta es puntual. Si quieres considerar el volumen del planeta los cálculos se complican y para nosotros en este caso no nos aporta nada.
En la ley de gravitación universal el concepto de radio q aparece en la ecuación hace referencia a la distancia entre los dos puntos de masa, no al radio del planeta, la fuerza disminuye en intensidad con el cuadrado de la distancia, no linealmente.
Como bien dices Splinter para simular la gravedad se utiliza esta ley unicamente, pero si vas a simular un entorno micro como yo le digo, no merece la pena unos calculos tan costosos para los resultados q obtienes. Si vas a simular un objeto que orbita al rededor de otro si merece la pena, y aun asi se puede simplificar la cosa.
Si, en esa parte me parece bien tambien, porque consigues simplificar los calculos y economizar mucho.
pero es que yo no hablo si vale la pena o no, yo digo que el metodo que digo sirve para ambos... que valga la pena o no, es otra cosa, pero no puedes negar que no sea valido... o sea, que si yo lo aplico no funcione...
y como sea, me cuesta imaginar el tema del angulo de gravedad... en todo caso, ya que quieres simplificar y hablas de constantes yo diria que ni siquiera se necesita el angulo de gravedad, este deberia ser siempre perpendicular al piso, o sea, 90 grados... si queremos simplicar, simplifiquemos... pero no me parece logico que si quiero que el objeto flote tener que invertir el angulo de gravedad, ya que incluso estaria afectando a todos los objetos y quizas el que vuele es 1 solo objeto... que repito me parece que no deberia tener que modificar el angulo de gravedad para eso, sino aplicar otras fisicas con el mismo angulo de gravedad que afecta al mundo simulado.
por tu explicacion y desde donde lo veo, no veo que me equivoque, simplemente podemos decir que se puede simplicar poniendo constantes ciertas cosas, pero en ese caso, tambien deberia ir constante el angulo... con lo que toda la charla carece de valor... si hablamos de angulo, entonces hablemos de un centro de gravedad a nivel simulacion de la vida real.
repito, no estamos hablando de que merece la pena, sino estamos hablando de algo mas bien real... si quieres simplificar que me parece perfecto, entonces deberiamos tambien simplificar el tema del angulo... ya que yo no lo veo logico... o sea, da efectos chulos, pero no lo veo como realidad...
igual, hablo desde mi total ignorancia, lamentablemente yo no pase 5 años en una universidad de fisica (cosa que me gusta, mas que nada la fisica cuantica).
y quisiera agregar, en el caso del objeto que flota o vuela, el angulo de gravedad no deberia variar, sino que lo que pasa es que se le aplica una fuerza externa y contraria que hace que este levite o flote, o por ejemplo, un viento que hace volar a todos los objetos.
Quote from: SplinterGU on November 22, 2012, 08:49:13 PM
y quisiera agregar, en el caso del objeto que flota o vuela, el angulo de gravedad no deberia variar, sino que lo que pasa es que se le aplica una fuerza externa y contraria que hace que este levite o flote, o por ejemplo, un viento que hace volar a todos los objetos.
Exactamente eso es lo que te iba a comentar ahora jejeje. Si tienes razón, el ángulo sería constante, a eso me he referido cuando decía dirección (la dirección del vector). Pero el tema de poder cambiar ese vector podría dar juego en algunos casos, en los juegos. Si por supuestamente pretendes simular la realidad, eso no tiene sentido.
Y por supuesto si quiero que un objeto levite, tendría q aplicarle una fuerza de intensidad igual (modulo del vector) y dirección igual al peso del objeto dentro de ese campo gravitatorio, con lo que el objeto tendría dos fuerzas actuando sobre el (vectores) que se anularían la una a la otra y el objeto flotaría.
Finalmente esa gravedad no es mas que una aceleración constante en modulo y dirección, que origina una fuerza sobre un objeto en función de su masa, lo que sería el peso. Si
Yo insisto en que la solucion de laghengar es la mas simple y facil de aplicar! :P
Quote from: KeoH on November 22, 2012, 08:57:30 PM
Quote from: SplinterGU on November 22, 2012, 08:49:13 PM
y quisiera agregar, en el caso del objeto que flota o vuela, el angulo de gravedad no deberia variar, sino que lo que pasa es que se le aplica una fuerza externa y contraria que hace que este levite o flote, o por ejemplo, un viento que hace volar a todos los objetos.
Exactamente eso es lo que te iba a comentar ahora jejeje. Si tienes razón, el ángulo sería constante, a eso me he referido cuando decía dirección (la dirección del vector). Pero el tema de poder cambiar ese vector podría dar juego en algunos casos, en los juegos. Si por supuestamente pretendes simular la realidad, eso no tiene sentido.
Y por supuesto si quiero que un objeto levite, tendría q aplicarle una fuerza de intensidad igual (modulo del vector) y dirección igual al peso del objeto dentro de ese campo gravitatorio, con lo que el objeto tendría dos fuerzas actuando sobre el (vectores) que se anularían la una a la otra y el objeto flotaría.
Finalmente esa gravedad no es mas que una aceleración constante en modulo y dirección, que origina una fuerza sobre un objeto en función de su masa, lo que sería el peso. Si
vale, pero cuando dijiste que estaba equivocado, parecia como que decias que el metodo que decia no era valido para cualquier situacion... o sea, quedamos en claro que valido es, lo que no es, es conveniente.
Quote from: gecko on November 22, 2012, 09:09:02 PM
Yo insisto en que la solucion de laghengar es la mas simple y facil de aplicar! :P
entre tanta charla ya no recuerdo el metodo de laghengar.
Nada, no puse nada. Borré él mensaje. Fallo mío por molestarme en responder, no es la primera vez que me pasa. Gracias Gecko. Alee me piro.
Quote from: alex on November 22, 2012, 08:37:53 PM
Quote from: SplinterGU on November 22, 2012, 08:04:48 PM
Quote from: Rein (K´)ah Al-Ghul on November 22, 2012, 07:45:25 PM
Quote from: SplinterGU on November 20, 2012, 09:55:45 PM
una pregunta, o quizas tambien una sugerencia...
tu dices que la fisica se basa en gravedad y angulo de gravedad... pero no seria mejor poder definir objetos con (centro de) gravedad y que los demas objetos interactuen con este de acuerdo a la fuerza de gravedad que este objeto tiene y a la distancia que estan (obviamente el angulo se calcularia solo)?
por ejemplo, defino un objeto tipo planeta tierra (su centro) y la fuerza de su gravedad, ahora empiezo a poner objetos mas chicos, que seran atraidos por este centro, hasta encontrar un suelo, segun la distancia de este suelo se modifica automaticamente el angulo y la fuerza con que interactuan... lo mismo podria tener un objeto tierra y un objeto luna, ambos con su gravedad y los objetos que se aproximan a uno u a otro, seran afectados por la fuerza de gravedad de estos objetos.
no seria mejor que la cosa sea asi? digamos que solo cambiaria lo del angulo que seria calculado automaticamente...
curioso, se me ocurrio algo similar...
aun me falta codificarlo y probarlo
solo que ademas de la posicion (x,y) y la fuerza gravitatoria, coloque un limite o alcanze maximo (fuera de eso la gravedad provocada por la fuente es 0) y un factor de atenuacion (o cuanto se atenua por pixel)
con la posicion de la fuente y la propia del objeto se calcula la distancia y el angulo a la fuente
luego se obtiene un vector, al cual se le aplica la gravedad, se proyecta dicho vector en los eje X e Y, y se resta a la posicion del objeto
es que a medida que te alejas, la fuerza de atraccion de la gravedad va perdiendo fuerza, segun la fuerza (que tambien depende de la masa) es el radio de accion... aunque quizas no haya radio, sino fuerza segun distancia... y ese modelo es valido para cualquier cosa, macro y micro... ya que lo importante es donde se encuentre el centro de gravedad, puedes tener un escenario de 500mts o 1km y tener un centro de gravedad a 100km o 200km, no importa la distancia, pero la fisica deberia funcionar igual... como funciona en la vida real... para mi, es una unica simulacion... segun pienso, es un error pensar en una simulacion para macro y otra para micro... eso pienso yo, desde mi total ignorancia.
Splinter, creo que tienes mucha razon, yo lo veo que el modelo seria el mismo para cualquier distancia.
Pero para ser mas exactos, (la verdad es que seria muy costoso de trabajo), que yo creo que debe haber el minimo de leyes posibles, y a partir de ahi sacar las funciones para el calculo. Pues que yo creo que las leyes fisicas estan regidas por leyes moleculares, y estas por los atomos, estas por neutron proton y electron, y estas por subparticulas, (la fisica cuantica). Y mucho nos queda por descubrir...
Segun esto, pienso que la mejor libreria de fisica (no hablando de fisica solo, sino de fisica-cuantica, quimica, etc.) seria una que organizara todas estas leyes, en una sola (la mas simple) y a partir de esta las derivadas, pudiendo crear asi funciones y funciones.
No solo eso, sino que asi se podria recrear facilmente el comportamiento humano (que no es mas que un monton de particulas chocando). y el futuro, analizando toda la materia y energia particula por particula. Claro, pero ya no estarias solo tratando de analizar las particulas de el tiempo en el que estas, sino de muchos mas universos temporales que al verlos en la el programa recreados, puedan afectar al espectador y cambiar sus pensamientos.
Y esto supondria crear unos nuevos ficheros, que lleven codificada la informacion de cada particula.
Aunque pueda parecer que se mucho, lo respondo como un chaval con mucha imaginacion XD, y que no tengo mucha idea.
En resumen... que para crear una lib de que incluya toda la ciencia todavia nos queda, pero que para una lib de fisica como decis prefiero la idea de Splinter, porque lo que se trata mas o menos es emular la realidad. Ya sea distorsionandola como el Mario Galaxy, o hacerla parecida como cualquier juego.
Quote from: KeoH on November 22, 2012, 08:29:11 PM
Pues ahí te equivocas Splinter !! xDDD Te lo dice uno que desperdició 5 años de vida en la Facultad de Física de la Universidad de Sevilla (España) hasta rendirse y cambiarse a Económicas jajajajajaja.
En un sistema micro ( una ciudad por ejemplo) el valor de la gravedad se toma constante y la dirección también. Para simplificar los cálculos .. no merece la pena utilizar la ley de gravitación universal para esos casos, porq la precisión no te hace falta y vas a tener un sobrecoste de calculo.
En un sistema macro (como un sistema planetario) si se usa la ley completa porq la dirección y la intensidad varían en el campo. También se hace una simplificación muy grande porque se estima que la masa del planeta es puntual. Si quieres considerar el volumen del planeta los cálculos se complican y para nosotros en este caso no nos aporta nada.
En la ley de gravitación universal el concepto de radio q aparece en la ecuación hace referencia a la distancia entre los dos puntos de masa, no al radio del planeta, la fuerza disminuye en intensidad con el cuadrado de la distancia, no linealmente.
Como bien dices Splinter para simular la gravedad se utiliza esta ley unicamente, pero si vas a simular un entorno micro como yo le digo, no merece la pena unos calculos tan costosos para los resultados q obtienes. Si vas a simular un objeto que orbita al rededor de otro si merece la pena, y aun asi se puede simplificar la cosa.
Si, en esa parte me parece bien tambien, porque consigues simplificar los calculos y economizar mucho.
Lo que comentas de la simulación molecular es exactamente lo que hacen box2D y chipmunk como tantas otras, no es otra cosa mas que eso mismo, aunque pueda parecer complicado no lo es para nada, lo que pasa es que el tema asusta un poco si no se conoce bien.
En realidad en un motor de física los objetos mas primitivos son "atomos" o "vectores" enlazados molecularmente por "constraints" que son simples limitadores que simulan los enlaces moleculares, a todo esto que parece tan retorcidamente complejo "que en realidad no lo es para nada" se le aplica un tercer limitador llamado "joint" que une moleculas para así crear un cuerpo complejo o objeto.
Sobre este tema se puede hablar largo y tendido, cada uno daría su opinión y seguramente nunca se llegaría a un consenso general por que cada cual lo ve desde su perspectiva, yo estoy de acuerdo con la teoría de Splinter, es razonable y lo que es mejor, es sumamente sencillo de implementar.
Hablando del método simple que proponía Laghengar, personalmente he usado este tipo de soluciones durante mucho tiempo, pero cuando he aprendido a razonar el comportamiento real de la gravedad lo he desestimado simplemente por que no es nisiquiera una aproximación lejana a la realidad, aunque sigue siendo completamente válido para un juego claro está.
Esto supongo que ya depende de lo que se busca para el juego en sí, pero está claro que si se hace con una función como la que propuse, el siguiente paso es implementar otra sencilla función que compruebe colisión entre circulos y segmentos, y ya se tiene un motor completo de física "sencillo" que simula paredes,techos, suelos y todo lo que sea necesario, sinembargo usando el método que apuntaba laghengar se está completamente limitado a lo que es, un sistema sencillo para hacer caer un objeto pero nada mas.
No critico el método pues está mas que demostrado que soluciones como esta están detrás de miles de juegos de NES, SNES incluso actuales, pero quizá sea un sistema demasiado simple y "cerrado" de hacer algo que en realidad si se hace como se tiene que hacer queda completamente integrado con todo lo que pueda venir después.
Pero vaya.. que lo que dije solo es "una opción mas" de todas las que puedan existir, ni es la buena ni es la mala, es solo una mas ;)
Quote from: laghengar on November 22, 2012, 11:38:15 PM
Nada, no puse nada. Borré él mensaje. Fallo mío por molestarme en responder, no es la primera vez que me pasa. Gracias Gecko. Alee me piro.
sono mal lo que has dicho, o yo lo interprete mal, sono a que no valia la pena hablar con nosotros sobre tus ideas... me senti menospreciado... amigo, te pido disculpas si no fue tu intencion, pero no sono muy bien...
Quote from: Erkosone on November 23, 2012, 04:50:59 AM
Quote from: alex on November 22, 2012, 08:37:53 PM
Quote from: SplinterGU on November 22, 2012, 08:04:48 PM
Quote from: Rein (K´)ah Al-Ghul on November 22, 2012, 07:45:25 PM
Quote from: SplinterGU on November 20, 2012, 09:55:45 PM
una pregunta, o quizas tambien una sugerencia...
tu dices que la fisica se basa en gravedad y angulo de gravedad... pero no seria mejor poder definir objetos con (centro de) gravedad y que los demas objetos interactuen con este de acuerdo a la fuerza de gravedad que este objeto tiene y a la distancia que estan (obviamente el angulo se calcularia solo)?
por ejemplo, defino un objeto tipo planeta tierra (su centro) y la fuerza de su gravedad, ahora empiezo a poner objetos mas chicos, que seran atraidos por este centro, hasta encontrar un suelo, segun la distancia de este suelo se modifica automaticamente el angulo y la fuerza con que interactuan... lo mismo podria tener un objeto tierra y un objeto luna, ambos con su gravedad y los objetos que se aproximan a uno u a otro, seran afectados por la fuerza de gravedad de estos objetos.
no seria mejor que la cosa sea asi? digamos que solo cambiaria lo del angulo que seria calculado automaticamente...
curioso, se me ocurrio algo similar...
aun me falta codificarlo y probarlo
solo que ademas de la posicion (x,y) y la fuerza gravitatoria, coloque un limite o alcanze maximo (fuera de eso la gravedad provocada por la fuente es 0) y un factor de atenuacion (o cuanto se atenua por pixel)
con la posicion de la fuente y la propia del objeto se calcula la distancia y el angulo a la fuente
luego se obtiene un vector, al cual se le aplica la gravedad, se proyecta dicho vector en los eje X e Y, y se resta a la posicion del objeto
es que a medida que te alejas, la fuerza de atraccion de la gravedad va perdiendo fuerza, segun la fuerza (que tambien depende de la masa) es el radio de accion... aunque quizas no haya radio, sino fuerza segun distancia... y ese modelo es valido para cualquier cosa, macro y micro... ya que lo importante es donde se encuentre el centro de gravedad, puedes tener un escenario de 500mts o 1km y tener un centro de gravedad a 100km o 200km, no importa la distancia, pero la fisica deberia funcionar igual... como funciona en la vida real... para mi, es una unica simulacion... segun pienso, es un error pensar en una simulacion para macro y otra para micro... eso pienso yo, desde mi total ignorancia.
Splinter, creo que tienes mucha razon, yo lo veo que el modelo seria el mismo para cualquier distancia.
Pero para ser mas exactos, (la verdad es que seria muy costoso de trabajo), que yo creo que debe haber el minimo de leyes posibles, y a partir de ahi sacar las funciones para el calculo. Pues que yo creo que las leyes fisicas estan regidas por leyes moleculares, y estas por los atomos, estas por neutron proton y electron, y estas por subparticulas, (la fisica cuantica). Y mucho nos queda por descubrir...
Segun esto, pienso que la mejor libreria de fisica (no hablando de fisica solo, sino de fisica-cuantica, quimica, etc.) seria una que organizara todas estas leyes, en una sola (la mas simple) y a partir de esta las derivadas, pudiendo crear asi funciones y funciones.
No solo eso, sino que asi se podria recrear facilmente el comportamiento humano (que no es mas que un monton de particulas chocando). y el futuro, analizando toda la materia y energia particula por particula. Claro, pero ya no estarias solo tratando de analizar las particulas de el tiempo en el que estas, sino de muchos mas universos temporales que al verlos en la el programa recreados, puedan afectar al espectador y cambiar sus pensamientos.
Y esto supondria crear unos nuevos ficheros, que lleven codificada la informacion de cada particula.
Aunque pueda parecer que se mucho, lo respondo como un chaval con mucha imaginacion XD, y que no tengo mucha idea.
En resumen... que para crear una lib de que incluya toda la ciencia todavia nos queda, pero que para una lib de fisica como decis prefiero la idea de Splinter, porque lo que se trata mas o menos es emular la realidad. Ya sea distorsionandola como el Mario Galaxy, o hacerla parecida como cualquier juego.
Quote from: KeoH on November 22, 2012, 08:29:11 PM
Pues ahí te equivocas Splinter !! xDDD Te lo dice uno que desperdició 5 años de vida en la Facultad de Física de la Universidad de Sevilla (España) hasta rendirse y cambiarse a Económicas jajajajajaja.
En un sistema micro ( una ciudad por ejemplo) el valor de la gravedad se toma constante y la dirección también. Para simplificar los cálculos .. no merece la pena utilizar la ley de gravitación universal para esos casos, porq la precisión no te hace falta y vas a tener un sobrecoste de calculo.
En un sistema macro (como un sistema planetario) si se usa la ley completa porq la dirección y la intensidad varían en el campo. También se hace una simplificación muy grande porque se estima que la masa del planeta es puntual. Si quieres considerar el volumen del planeta los cálculos se complican y para nosotros en este caso no nos aporta nada.
En la ley de gravitación universal el concepto de radio q aparece en la ecuación hace referencia a la distancia entre los dos puntos de masa, no al radio del planeta, la fuerza disminuye en intensidad con el cuadrado de la distancia, no linealmente.
Como bien dices Splinter para simular la gravedad se utiliza esta ley unicamente, pero si vas a simular un entorno micro como yo le digo, no merece la pena unos calculos tan costosos para los resultados q obtienes. Si vas a simular un objeto que orbita al rededor de otro si merece la pena, y aun asi se puede simplificar la cosa.
Si, en esa parte me parece bien tambien, porque consigues simplificar los calculos y economizar mucho.
Lo que comentas de la simulación molecular es exactamente lo que hacen box2D y chipmunk como tantas otras, no es otra cosa mas que eso mismo, aunque pueda parecer complicado no lo es para nada, lo que pasa es que el tema asusta un poco si no se conoce bien.
En realidad en un motor de física los objetos mas primitivos son "atomos" o "vectores" enlazados molecularmente por "constraints" que son simples limitadores que simulan los enlaces moleculares, a todo esto que parece tan retorcidamente complejo "que en realidad no lo es para nada" se le aplica un tercer limitador llamado "joint" que une moleculas para así crear un cuerpo complejo o objeto.
Sobre este tema se puede hablar largo y tendido, cada uno daría su opinión y seguramente nunca se llegaría a un consenso general por que cada cual lo ve desde su perspectiva, yo estoy de acuerdo con la teoría de Splinter, es razonable y lo que es mejor, es sumamente sencillo de implementar.
Hablando del método simple que proponía Laghengar, personalmente he usado este tipo de soluciones durante mucho tiempo, pero cuando he aprendido a razonar el comportamiento real de la gravedad lo he desestimado simplemente por que no es nisiquiera una aproximación lejana a la realidad, aunque sigue siendo completamente válido para un juego claro está.
Esto supongo que ya depende de lo que se busca para el juego en sí, pero está claro que si se hace con una función como la que propuse, el siguiente paso es implementar otra sencilla función que compruebe colisión entre circulos y segmentos, y ya se tiene un motor completo de física "sencillo" que simula paredes,techos, suelos y todo lo que sea necesario, sinembargo usando el método que apuntaba laghengar se está completamente limitado a lo que es, un sistema sencillo para hacer caer un objeto pero nada mas.
No critico el método pues está mas que demostrado que soluciones como esta están detrás de miles de juegos de NES, SNES incluso actuales, pero quizá sea un sistema demasiado simple y "cerrado" de hacer algo que en realidad si se hace como se tiene que hacer queda completamente integrado con todo lo que pueda venir después.
Pero vaya.. que lo que dije solo es "una opción mas" de todas las que puedan existir, ni es la buena ni es la mala, es solo una mas ;)
demas esta decir que interesa sobremanera tu implementacion de fisica, y creo que puede ser una base para ampliarla al modelo que estamos debatiendo... y que pueda funcionar de ambas maneras...
Estoy corrigiendo una función que comprueba intersección entre circulo/segmento, tiene un pequeño error en un extremo del segmento, en cuanto la corrija os la comparto sin ningún problema, seguro que viene alguien detrás y la mejora, de eso se trata en realidad todo esto jeje..
Os dejo un código de ejemplo en Bennu donde se puede ver perfectamente lo que comentaba sobre la gravedad y la fricción, son 2 funciones muy muy básicas y sencillas que permiten lo siguiente:
Control pleno sobre la gravedad, orientación y cantidad, se pueden manipular de forma completamente dinámica si así se desea.
Control de un simple proceso con los cursores, con las teclas de cursor se añade una pequeña cantidad de velocidad al objeto y se puede manejar por la pantalla.
Control de fricción de la escena, ajustando el valor de la variable 'friction' se consigue manipular el entorno para que simule a una valor de 1.0 un entorno normal, y a valores como 0.95 o inferiores un entorno acuatico etc etc.. "cambia la viscosidad del entorno por así decirlo".
Espero que os guste, esto es una pequeña muestra de lo que he comentado, tremendamente simple y que salta a la vista el potencial que tiene para juegos ;)
No es nada serio.. es un simple ejemplo conceptual:
import "mod_video"
import "mod_say"
import "mod_mouse"
import "mod_text"
import "mod_map"
import "mod_draw"
import "mod_math"
import "mod_key"
Local
float x_;
float y_;
float oldx_;
float oldy_;
Global
float aGravity = 90000;
float vGravity = 0.098;
float friction = 1.0;
Process main()
Begin
set_mode(640, 480, 16);
set_fps(30, 0);
graph = makeMyGraph(20, 20);
// coloco el objeto en la posición inicial..
x = x_ = oldx_ = 320;
y = y_ = oldy_ = 50;
loop
if(key(_c_up))
addVelocity(1.0, 90000.0);
end
if(key(_c_left))
addVelocity(1.0, 180000.0);
end
if(key(_c_right))
addVelocity(1.0, 0.0);
end
updatePoint();
checkScreenDownLimit();
frame;
end
end
//.....................................................................................
// Ejemplo de función que auna el computo del efecto gravedad y fricción con el medio..
function updatePoint();
private
float dx;
float dy;
begin
dx = father.x_ - father.oldx_;
dy = father.y_ - father.oldy_;
father.oldx_ += dx;
father.oldy_ += dy;
father.x_ += friction * (dx + vGravity * cos(aGravity));
father.x = father.x_;
father.y_ += friction * (dy + vGravity * sin(aGravity));
father.y = father.y_;
return(0);
end
//.....................................................................................
function makeMyGraph(int ancho, int alto);
private
int buffer_;
begin
buffer_ = new_map(ancho, alto, 16);
for(y=0; y<alto; y++)
for(x=0; x<ancho; x++)
map_put_pixel(0, buffer_, x, y, rgb(100,100,100));
end
end
return(buffer_);
end
//.....................................................................................
function addVelocity(float vel_, float angle_);
begin
father.x_ += (vel_ * cos( angle_ )) * friction;
father.y_ -= (vel_ * sin( angle_ )) * friction;
return(0);
end
//.....................................................................................
function checkScreenDownLimit();
begin
if(father.y_ > 470)
father.y_ = father.oldy_ = 470;
end
return(0);
end
//.....................................................................................
por lo que se ve en los videos que has puesto, mejorar no creo que haga falta, simplemente expandirla (si realmente hace falta, o como experimiento, porque mola mucho como funciona)
me gustaria ver el rendimiento con bennugd.
saludos y gracias por todo, excelente trabajo!
No fue así, Splinter, un saludo y disculpas. Sigue con tu trabajo que es muy grande.
para que me mandes a seguir con lo mio... evidentemente algo de lo que dije/hice te ofendio... te pido disculpas... y me gustaria saber que fue para intentar remediar la situacion...
Quote from: SplinterGU on November 23, 2012, 02:43:07 PM
para que me mandes a seguir con lo mio... evidentemente algo de lo que dije/hice te ofendio... te pido disculpas... y me gustaria saber que fue para intentar remediar la situacion...
Na no era una frase para mandar, disculpa, era de ánimo. Un saludo.
:) saludos!
muchas gracias a todos los que colaboraron, tengo mucho codigo que leer =)