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.

l1nk3rn3l

queremos probar pero donde descargo algoooo

Erkosone

Aquí están los vídeos sobre el tema y cada descargable, cada nuevo tutorial incluye nuevas funcionalidades que se muestran en el vídeo que lo acompaña ;)
http://forum.bennugd.org/index.php?topic=3413.0

Erkosone

AVANCES:
- Función añadida: Physics_entity_fix_point();
- Función añadida: Physics_entity_set_joint2();


Esta función ancla al mundo un objeto en su posición actual por el c_point pasado como parámetro, un uso común en juegos es este:  "la he creado para esto precisamente jejeje.."


Como crear un puente por donde el personaje y los malos pueden caminar.. y que el puente sea construido a eslabones:
- Crear los procesos de los eslabones y guardad sus Id´s.
- unirlos mediante Physics_entity_set_joint2( id1, c_point, id2, c_point );
- Colocarlos en su sitio dentro del scroll.
- Usar esto con el primer y el ultimo eslabon: Physics_entity_fix_point( id, 0 );


Esto ancla los extremos del punte y crea una cadena por donde podremos pasearnos, con 2 simples funciones.. el próximo tutorial en vídeo trata este tema.


Erkosone

Comienzo el tema de los motores y en cuanto tenga lista la función que convierte a una entidad en un motor y la función que establece la velocidad del mismo publicaré otro tutorial.


La idea que tengo es la de crear una entidad como hasta ahora y simplemente llamando a una función sencilla se pueda convertir en un motor para que resulte sencillo de esta manera crear un rectangulo con 2 ruedas/motores que sean los que le proporcionen el movimiento.  ;)

Erkosone

Creo que hay algún bug en la mod_chipmunk con el tema de los motores.. pero no estoy seguro..
Alguien los ha usado ya y sabe el modo de usarlos correctamente?


Yo simplemente desde un proceso el cual ya tiene una entidad de física creada hago esto y debería funcionar.. no da error pero no hace nada:



   mi_motor = addsimplemotor(id,0,0.0);
   SETSIMPLEMOTORPROPERTIES(mi_motor, CP_C_RATE, 10000.0);


El caso es que si establezco el RATE directamente si que funciona con: addSimpleMotor( ID, 0, 10000.0 );
Con lo cual creo que el error es que yo no se actualizar el valor de CP_C_RATE, alguien puede ayudarme?

Erkosone

Parece que con CP_C_RATIO si que se puede actualizar la velocidad del motor de forma dinámica pero en la documentación no aparece este campo, quizá sea un error tipográfico, bueno, el caso es que ya tengo las funciones que crean y manipulan el motor jeje..


Physics_entity_set_motor( id ); -> Le pasamos el ID del proceso el cual se quiere convertir en un motor.
Physics_entity_Set_motor_velocity( id_motor, float velocity_ );


El siguiente tutorial va sobre esto, mostraré como crear un simple coche o carro que acelera pulsando la barra espaciadora jeje..

Erkosone

AVANCES:
- Añadidas 2 funciones para crear máquinas, osea, crear motores y ajustarlos.


De camino el Video tutorial final número 7.
Contenido:
- Ejemplo ridículamente simple de como se crea un coche y se hace correr por el escenario!


El vídeo está compilandose, en breve estará disponible.
Un saludo.

Prg

Quizá te ayude el ejemplo de máquina TheoJansen.

Test09

Se usa un motor para activar las patas...
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Erkosone

Voy a examinarlo, por que.. si te cuento lo que estoy haciendo XD..


tengo un vehiculo complejo ya montado con todas sus partes, y sucede que usé motores para las ruedas XD.. el problema es que al dejar de acelerar se ve un defecto en la representación de la simulación, no es culpa de la lib, está clarisimo que es culpa de un planteamiento deficiente por mi parte XD..  digamos que las ruedas desaceleran y eso proboca una fricción que frena al vehículo.


Ahora estaba esbozando el diseño de dos tipos distintos de tracción, el que mas me gusta por ahora es super simple, trata sobre anclar en el cuerpo de la máquina un motor circular con un size = 10; para el shape, osea, el shape bastante reducido, entonces coloco las ruedas en la posición clave en la cual friccionarían con el motor si este tubiera un poco mas de radio, entonces uso SIZE como si de un embrague se tratara, osea, con un size alto se embragan por fricción y con size bajo no XD.. así he conseguido simular "en mi opinión" un coche de una forma casi excelente, bueno.. sigo con ello, gracias por la recomendación, voy a mirarlo haber como está hecho ;)

SplinterGU

estaria buena una tabla de compraciones o ventajas/desventajas del la implementacion de prg vs la de erkosone... o al menos que mejoras traer el usar una sobre la otra...

no se si me explico.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Solo me interesa el algoritmo que haga los bordes a un grafico para las colisiones, regalo un jamon a quien lo termine

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Ves preparando ese jamón XD.. yo lo tengo apuntito..

Erkosone

Para ir abriendo boca con algo de código XD..


Este fragmento es un scanner de contorno.. no está terminado todavía por que lo estoy portando desde otro lenguaje que lo tenía ya hecho y en bennuGD cambian algunas cosas pero practicamente es idéntico, me falta ya un pedo para que guarde en la lista de c_point del gráfico la lista de vectores jeje..



//.............................................................
//.............................................................
//..............VECTORIZAR UN GRAFICO EN LINEAS................
function Physics_entity_calculate_shape();
private
   int ancho_;            // ancho de la imágen en pixels..
   int alto_;            // alto de la imágen en pixels..
   int x_inicial = -1;      // X del inicio del contorno..
   int y_inicial = -1;      // Y del inicio del contorno..
   int secure_steeps = -4;   // En el quinto paso por la tortuga será mayor que cero y entonces tendré la certeza de que no estoy
                     // En el punto inicial del contorno..
begin
   // Heredar gráfico del proceso que realiza la llamada..
   file = father.file;
   graph = father.graph;
   
   // No pintar nada en pantalla desde esta función..
   alpha = 0;
   
   // Obtener las dimensiones del gráfico..
   ancho_ = map_info(file, graph, g_width);
   alto_  = map_info(file, graph, g_height);
   
   // Buscar un pixel con color diferente de cero para establecer el inicio del contorno...
   for(y=0; y<alto_; y++)      // Scanear filas de la imágen..
      for(x=0; x<ancho_, x++)   // Scanear columnas de la imágen..
         if( map_get_pixel( file, graph, x, y ) <> rgb(0,0,0) )
            // Guardo las coordenadas del punto que tomaré como inicio del contorno para la imágen..
            x_inicial = X;
            y_inicial = Y;
            break;
         end
      end
   end
   
   
   // Si la imágen no contenía ningún pixel con color entonces se termina esta función..
   // Valor de retorno -1 para este error..
   if(x_inicial == -1 or y_inicial_ == -1)
      Return(-1);
   end
   
   // Comienza el scan real de contorno..
   while(true)
      // Tortuga de Pappert, COLOR DETECTION, método excelente..
      if(map_get_pixel(file, graph, x, y) <> rgb(0, 0, 0) )
         angle+=90000;
         advance(1);
      end
      // Tortuga de Pappert, COLOR MISSING, método excelente..
      if(map_get_pixel(file, graph, x, y) == rgb(0, 0, 0) )
         angle-=90000;
         advance(1);
      end
      
      // Aumento este contador.. es el que pasados 5 pasos me dejará comprobar si la posición actual es la inicial..
      // y entonces asumiré que el contorno se ha recorrido al completo..
      secure_steeps ++;
      
      if(secure_steeps > 0 )
         if(x_inicial = X && y_inicial == Y)      // he vuelto al punto de partida del contorno??
            BREAK;                        // si es cierto se termina el scanner..
         end
      end
      
   end
end
//.............................................................

Erkosone

La idea de todo esto es que cualquiera haga esto desde un proceso cualquiera:


Physics_entity_calculate_shape();


y ale.. ya tenemos la lista de vectores guardada en el propio gráfico ya que dudo muchísimo que una imágen tipo "sprite" necesite mas de 999 vectores  ;D


Y lo siguiente es esto:


Physics_entity_build( TYPE_POLY..... )

Con la interesante cosa de que no hay que hacer absolutamente nada con vectores ni lineas ni nada de nada.. está pensado para alguien que no sabe hacer nada de esto, simplemente el tipo poligonal usará la propia lista de puntos de control del gráfico jeje.. ingenioso no?