Capa de abstracción para Chipmunk.

Started by Erkosone, January 16, 2013, 04:56:10 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Erkosone

Kamematen.. ya me auto respondo gracias a un comentario en uno de tus archivos .prg jeje.. "y se añaden al fondo.." he imaginado que el collisionType era el cero y efectivamente es el, ya ta!

Erkosone

AVANCES:
- Physics_entity_get_collision( TYPE_WORLD | TYPE_ENTITY );


Que hace esto?
- Esta función retorna el angulo de la normal del plano donde se produce una colisión, dicho en palabras "DIV".. retorna el angulo del suelo jeje.. creo que mas fácil imposible..


Esto implica que el API ahora tiene una nueva función que hay que llamar al inicio del programa: Physics_world_init();
- Esta función inicializa los collisionHandlers de forma completamente transparente, esto sirve para poder acceder al discriminador de colisiones interno de la chipmunk, y de esta manera poder conocer si existe o no una colisión entre dos tipos de objetos, en este caso la llamada a la función de esta manera:
angulo_suelo = Physics_entity_get_collision( TYPE_WORLD );
Con esto lo que obtenemos es, si no hay colision se obtiene un cero, si hay colisión con algún elemento del "mundo", osea.. las lineas.. pues nos devuelve automáticamente el angulo de la normal con esa linea, osea.. el angulo que necesitamos para saltar jeje..


Bueno.. sigo con esto.. la cosa está que arde!

Ran

joer que sencillo! pero cuanto curro hay detras! :D quiero probarlo ya!

Yawin

Dios, estoy deseando que saques una versión ya "oficial" con su documentación y todo para utilizarla en un proyecto que tengo en mente.
No lo voy a usar ahora, porque tengo muchos proyectos abiertos y todavía no has sacado una versión "estable" ya me entiendes xD
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Erkosone

Ya queda menos para la 1.0  ;D
La documentación estará en vídeo al completo.

Erkosone

AVANCES IMPORTANTES:
- Ya está integrado el sistema que abstrae del apoteosico sistema de collisionHandlers que usa la chipmunk  :o


Que significa esto?
- La librería de física Chipmunk incluye un sistema de alto performance para la detección de colisiones, el tema es que puede resultar un poco complejo trabajar directamente con el, aunque es excelente hay que decir que es algo lioso por que hay que inicializarlo y usarlo con tipos definidos por el usuario, esto significa que hay que definir tipos en las entidades u objetos y dependiendo del tipo asociado a un objeto pues será un handler u otro el que haya que consultar.


Que leches he hecho yo para simplificar todo esto?
- He creado estas funciones "para mantener la consistencia del API":
* Physics_entity_set_type( int type );
* Physics_entiy_build_collision_handle( int type );


Ahora con estas dos simples funciones podemos hacer lo siguiente, sabiendo de antemano que todos los objetos del WORLD siempre serán del tipo CERO:
1 - Crear la entidad con Physics_entity_build();
2 - Setear el tipo con Physics_entity_set_type();
3 - Crear un detector de colisiones con: detector_de_colision = Physics_entiy_build_collision_handle( 0 );
4 - Ya está todo!!


Simplemente para saber si estamos tocando el WORLD se hace esto:


angulo_suelo = Physics_entity_get_collision( detector_de_colision );
if( angulo_suelo != 0.0)..


Voy a montar el tercer vídeo tutorial sobre este tema, es muy interesante y con esto creo que ya estoy muy cerca de tener una versión 1.0 ahora ya si, con colisiones jeje!!
El detector de colisiones ahora es para mearse XD.. creo que esto para el que use la chipmunk le va a ayudar bastante..


Making off vídeo tutorial incoming..   esta vez con varios objetos diferentes..

Erkosone

Buenas, estoy trabajando en la abstracción de los joints, ya tengo la función que crea un joint pero tengo errores en la ejecución de la función que los elimina, en cuanto lo tenga arreglado publicaré otro tutorial y la explicación de como se usan ;)


Que es un joint?
- Es una unión entre 2 cuerpos, básicamente sirve para unir 2 objetos por 2 puntos, esto permite agarrar con el mouse a un objeto, o por ejemplo crear un coche con un par de rectangulos y 2 circulos como ruedas, es exactamente lo que deja hacer el juego "bad piggies".


Las funciones inicialmente van a ser estas:
- id_joint = Physics_entity_set_joint( int id_destino_ );
- Physics_entity_kill_joint( id_joint );


Luego ya las iré ampliando para crear joints mucho mas elaborados como los joint´s excentricos y cosas así.


De forma colateral a esto me ha surgido la necesidad de crear una nueva función:
- Physics_entity_set_position( x, y );
Esta función será la encargada de colocar a un objeto en su posición exacta justo antes de crear el joint, de esta manera podremos crear uniones de una forma extremadamente sencilla.




Bueno.. sigo con ello.. haber si descubro el motivo de que al intentar eliminar el joint la lib me salte con "antes de eliminar el joint debe estar añadido al mundo" o algo así.

Erkosone

Ya tengo los joints integrados en el API de una forma chachi piruli  ;D


Con estos dos pedos de funciones conseguimos agarrar "justo por el punto de colisión" a cualquier objeto del mundo jeje..
He sudado para aprenderme bien como funcionan las funciones que hizo Prg integradas con bennu, pero ahora que he comprendido exactamente lo que hacen la cosa queda así de simple jeje..


Physics_entity_set_joint( id_process_to_joint );
Physics_entity_kill_joint( &id_joint );


Estas 2 funciones con tan pocos parámetros las he montado especialmente para el 'MOUSE', tengo que mirar ahora que ya me funcionan perfect como dejarlas un poco mas dinámicas y abiertas a mas configuraciones.


Preparo el 5º vídeo tutorial con todo esto y lo cuelgo en unos minutos.
Gracias 'Prg' por permitirnos disfrutar de la física en bennu, a mi me hace enormemente feliz.

Prg

Que bueno que les guste la librería :)

A ver si en breve puedo revisar los editores que suenan muy bien y claro que aceptaré la lista con las sugerencias para la librería.

Saludos :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Erkosone

La librería está genial de verdad, gran trabajo en lo que a la integración con bennu se refiere, está todo bastante bien organizado.

Erkosone

He creado una nueva función que simplifica mucho mas los códigos y los hace mas eficientes con el mismo resultado.


Antes era necesario hacer esto para controlar los limites de velocidad de una entidad dentro de su loop:



      if(Physics_entity_get_vx() > 200.0)                  // Si supero la velocidad en X..
         Physics_entity_set_vx(200.0);                  // la limito..
      end
      if(Physics_entity_get_vx() < -200.0)               // Si supero la velocidad en X..
         Physics_entity_set_vx(-200.0);                  // la limito..
      end


Ahora simplemente con esta función accedemos al vector limitador de velocidad de la propia chipmunk:
Physics_entity_set_maxMotion( 200.0 );


Cada minuto que pasa esto queda mas simple XD..

Erkosone

AVANCES:
+ Añadidas las funciones para la creación de joints de forma completamente al gusto.


De que va esto?
- Simplemente con la función: Physics_entity_set_joint2( ID1, ID1x, ID1y,    ID2, ID2x, ID2y )  ahora podemos crear un joint entre 2 procesos cualesquiera, esto abre un amplio abanico de posibilidades y como se ve es muy sencillo de utilizar.


Se le pasa el ID de un proceso y "un punto dentro de su gráfico" y otro ID de otro proceso y "un punto dentro de su gráfico", y automáticamente quedan unidos por esos puntos, esto es bastante interesante por que se puede preparar un gráfico con 2 puntos de control definidos por ejemplo.. para crear puerdas o cosas así es la leche jeje.. el siguiente tutorial va sobre esto..


Lo que abstrae esta función es básicamente escribir todo el código que se necesita para recuperar la posición dentro del mundo de los puntos que queremos usar.

Erkosone

Estoy añadiendo algo interesante y que simplifica bastante e integra con este tipo de lenguaje los joints..
La función se llama Physics_entity_set_joint2( id1, cp1, id2,cp2 );


Que hace?
- Crea un joint desde el ID1 en su posición interna "punto de control cp1" y ID2 y su punto de control pasados como parámetros.


Esto permitirá crear gráficos prefabricados con puntos de control y luego simplemente engancharlos desde ellos, me estoy peleando con la formula que saca el offset del punto de control dentro del shape "en el mundo físico".. haber si lo consigo..  pero estoy cerca.. ya se crean aproximadamente bien XD.. pero estoy restando algo mal de lo que me devuelven get_real_point() y map_info()..


Incomming..

Erkosone

Conseguido!


Ahora estoy con otra función interesante: Physics_entity_fix_point( id_process, c_point_number, world_X, world_Y );


Esta función ancla un proceso al mundo en las coordenadas pasadas como parámetro y desde el punto de control pasado como parámetro ;)


Osea, si tenemos una caja y queremos anclar su c_point[1] en las coordenadas de un scroll "100,50" se hace esto:
Physics_entity_fix_point( id, 1, 100, 50 ); y ale.. proceso anclado..


La función retorna el id que apunta al joint para poder eliminarlo en cualquier momento.
Incomming..  cuando funcione esta función armo otro vídeo explicando como se usa.

Ran

joer la leche! lo estas simplificando muchisimo! un excelente trabajo el tuyo, despues del div espero que mi primer proyecto publicado sea con tu lib de físicas :D