CHIPMUNK en bennu

Started by Prg, January 12, 2011, 04:27:44 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

josebita

Para los paths de esas variables debes usar rutas absolutas:
LD_LIBRARYU_PATH=$(pwd):$LD_LIBRARY_PATH

Prg

ni siquiera así  :'(

dice exactamente lo mismo

¿no puedo guardarla en alguna carpeta y hacer algo mas para que la reconozca para dejarme de cosas?

la guardé en /usr/lib y luego le hice sudo ln -s libChipmunk.so liblibChipmunk.so
y nada  :'(  :'(  :'(
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

josebita

Vale. Si te fijas en el código C, a la librería la has llamado "libchipmunk" no "libChipmunk". Eso es importante.
Por cierto, no sé si has mirado lo de las dependencias que te puse, que están como "modulename" en lugar de "libchipmunk".

Prg

QuotePor cierto, no sé si has mirado lo de las dependencias que te puse, que están como "modulename" en lugar de "libchipmunk".

sí, lo corregí inmediatamente. gracias

QuoteVale. Si te fijas en el código C, a la librería la has llamado "libchipmunk" no "libChipmunk". Eso es importante.

le he puesto en el include libchipmunk, le he cambiado el nombre al .so por libchipmunk.so

e hice todo esto:

Quoteorlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$ LD_LIBRARY_PATH=pwd
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$ PATH=$PATH:pwd
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$ export LD_LIBRARY_PATH
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$ export PATH
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$ bgdc ejem.prg
BGDC 1.0.0 (Jan 20 2011 10:20:53)
Copyright � 2006-2011 SplinterGU (Fenix/BennuGD)
Copyright � 2002-2006 Fenix Team (Fenix)
Copyright � 1999-2002 Jos� Luis Cebri�n Pag�e (Fenix)
Bennu Game Development comes with ABSOLUTELY NO WARRANTY;
see COPYING for details

/home/orlando/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug/ejem.prg:13: error: Library "libchipmunk.so" not found, found "libchipmunk"
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$ $LD_LIBRARY_PATH
/home/orlando/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug
orlando@nodo1:~/Escritorio/chipmunkBennuUbuntu/LibChipmunks/Chipmunk/bin/Debug$

y como vemos en el resultado, todo sigue igual.

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

SplinterGU

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

Prg

#95
ya no uso . , uso pwd (sin la $ porque con eso no me da nada) y se setea la ld_library_path (al hacer $ld_library_path se presenta en la consola la ruta actual), el problema es que no se usa, no se por qué.  Eh revisado con la fsock y la mos_smpeg y pasa lo mismo. Parece que se ignora ese archivo o lo que sea que es.

también le he puesto la ruta manualmente y nada.

ya logreé hacer que las demás librerías me dejen compilar (ttf y smpeg), ahora falta la mía que nada. lo bueno es que ya pude hacer que las otras funcionaran y se que lo que queda es de mi libreria.

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

josebita

Prg, debes usar [code language="bash"]$(pwd)[/code] no [code language="bash"]pwd[/code] ni [code language="bash"]$pwd[/code].[code language="bash"]$(pwd)[/code] significa "el resultado de ejecutar el comando pwd". pwd no es una variable de entorno.

SplinterGU

tambien existe $PWD, que es la variable de entorno que tiene el path actual, segun el shell.

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

Prg

#98
entiendo. Lo recordaré :)

muchas gracias a ambos.

ya he logrado usar librerías de el directorio y también he logrado crear una librería propia y usarla en bennu. ya sólo queda que la chipmunk la pueda usar. Me he fijado que si uso una función y no está definida antes, el code no me manda error (sólo un warning de implicit declaration), no se porqué. pero la librería que resulta no se puede usar desde bennu. posiblemente algo así esté pasando en chipmunk, a lo mejor no todas las funciones que la librería chipmunk están en mi librería. Tengo que revisar bien esto.

bueno, me retiro un rato.

saludos y nuevamente gracias a ambos.

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

josebita

Quote from: SplinterGU on February 01, 2011, 12:53:17 PM
tambien existe $PWD, que es la variable de entorno que tiene el path actual, segun el shell.
Es bien cierto, no lo sabía.

Prg

#100
bien, ya compilé la librería y ya funciona. era que no había agregado todas las funciones de chipmunk a la librería que uso desde mi código de la libchipmunk.

he cambiado el nombre de libchipmunk a mod_chipmunk, he dado soporte a signal(id,signal) y he visto el problema del carro. buscaré la solución...

En lo de los dominos no me salió problemas.

Entonces corrijo el problema ese (ojalá que sea algo mío y algo sencillo) y subo la nueva versión.

Lo de los callbacks, no supe muy bien. Supongo que te pediré ayuda cuando tengas un poco de tiempo amigo splinter.

por lo pronto a ver si se puede probar la librería en más sistemas  y ver que todo va bien.

Y a ver si le cuento al creado de la chipmunk por su foro que ya existe chipmunk en bennu, veo que tiene una zona de descargas de ports (así se les llama vd?)


Para el que no haya visto código de chipmunk en bennu, pongo lo siguiente:


[code language="bennu"]//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";

import "mod_draw";





global

   pelota;

   cpVect point,ot;

   handler;

private

   press;

   cpSegmentQueryInfo info ;

   cpContactPointSet Ct;

   float distancia;

   bl;

Begin

   set_mode(800,600,32);

   pelota=load_png("bola40.png");

   gravity_Y=20;

   interval=1.0/25.0;

   plano();

   for (z=0;z<6;z++)

      cubo();

   end

   write(0,400,10,4,"Mueve la pelota con _left, _right y gira el plano con _a, _d");

   write(0,400,30,4,"Usa espacio para crear más círculos. ");

   bias_coef=1.0;

   mouse.graph=pelota;

   mouse.size=50;

   write_var(0,400,300,4,distancia);

   handler=COLLISIONHANDLERNEW(1,2);    //detecta donde colisionan los objetos con collisionType 1 y 2

   say(handler);

   while (!key(_esc))

      bl=SpaceSegmentQueryFirst( 400,300, mouse.x,mouse.y, CP_ALL_LAYERS, CP_NO_GROUP, &info);  //busca primera colision de una linea entre x,y  y x1,y1 (raycol)

      x=mouse.x;

      y=mouse.y;

      if(mouse.x<800 and mouse.y<600 and bl!=-1)       //si encontró colisión, busca el punto de colisión y lo almacena en x,y

         SegmentQueryHitPoint(400,300, mouse.x,mouse.y, &info,&x,&y);

         distancia=SegmentQueryHitDist(400,300, mouse.x,mouse.y, &info);    //encuentra la distancia entre el inicio de la linea y la colisión

      end



      delete_draw(0);

      drawing_Z(-100);

      draw_line(400,300,x,y);                         //imprime una linea desde el comienzo de la linea de colisión hasta el mouse o el punto de colisión

      while (GETCOLLISIONINFO(handler,&ct))

         for (z=0;z<ct.count;z++)

            draw_fcircle(ct.points[z].point.x,ct.points[z].point.y,5);   //dibuja círculos en los puntos donde colisionan los objetos indicados en el handler "handler".

         end

      end



      if (key(_space))

         if (not press)

            cubo();

            press=true;

         end

      else

         press=false;

      end

      // Ch_update();

      frame;



   end



   let_me_alone();

   //   Ch_End();



end



process plano()

private

datos[]=-250,0,250,0,50;

begin

// params=&datos;

   static=true;



   mass=infinity;

   inertia=infinity;

   collisionType=2;

   elasticity=1;

   friction=0.4;

   graph=new_map(500,20,32);

   x=400;

   y=440;

   z=15;

   angle=-45000;

   ShapeType=TYPE_LINE;

   map_clear(file,graph,rgb(0,255,0));



   loop

      if (key(_a))

         angle+=1000;

      end

      if (key(_d))

         angle-=1000;

      end

      frame;

   end

end



process cubo()

private

id3;

begin

   x=400;

   y=100;

   static=false;

   mass=10;

   inertia=10;

   ELASTICITY=0.1;

   friction=0.3;

   collisionType=1;

   priority=father.priority-2;

   ShapeType=TYPE_CIRCLE;

   graph=pelota;

    while (body==0)     //el sistema creador de física actúa después del primer frame en cada proceso, así que, mientras no actúe, no continuará el proceso,

   say("aun");

   frame;

   end

   while (id3=GETCONSTRAINTS(id))       //no tienen constraints, no debe salir en consola nada

   say("const"+id3);

   end

   while (id3=GETSHAPES(id))

   say("shapes"+id3);                   //sólo tienen un shape, así que sólo debe haber 6 shapes en la consola al principio.

   end

   while (!key(_esc))

      if (key(_right))

         incr_x+=5;

      end



      if (key(_left))

         incr_x-=5;

      end

      if (out_region(id,0))

         signal(id,s_kill);

      end

      frame;



   end

end[/code]

creo que esto captura la idea de programación de bennu
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

que es ese problema de los signals que mencionas?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

#102
El problema no es del signal. El problema es que ... mejor mira:
la búsqueda de procesos que no tienen body o que han cambiado su tipo de shape es:

[code language="bennu"] INSTANCE *i = first_instance ;
   while ( i )
   {
       if (LOCDWORD( mod_chipmunk, i, LOC_BODY )==0 &&  LOCDWORD( mod_chipmunk, i, LOC_SHAPETYPE )!=0)
       {
           creaBodyAndShapeAutomat(i);
       }
       i = i->next ;
   }[/code]

Esto está en updatePhisc:

HOOK __bgdexport (mod_chipmunk , handler_hooks ) [] =
{
   { 4700 , updatePhisc},
   { 0 , NULL }
};

y se ejecuta cada frame, sin embargo si un proceso se crea, hacemos algo como:

[code language="bennu"]process plano(x,y,angle)
private
//   datos[]=-250,0,250,0,50;
begin
   static=true;
   mass=infinity;
   inertia=infinity;
   collisionType=2;
   elasticity=1;
   friction=0.4;
   graph=new_map(300,20,32);
   z=15;
   ShapeType=TYPE_LINE;
   map_clear(file,graph,rgb(0,255,0));
       ctype=c_scroll;
   loop
      frame;
   end
end[/code]
De tal forma que cuando se llega a la proxima ejecución del hook, se revisa el proceso y se crea el body y el shape. El problema es que tienes que esperar hasta el próximo shape,  y si usas una función que trabaja con el body y todavía no se ha llegado al frame el programa truena.

Se me ocurren 3 formas de solucionarla:

1) poner un frame antes de usar cualquier función del motor la primera vez en un proceso (así está pero no me gusta)
2) poner la creación del body en los callbacks que me comentabas
3) que toda función revise si existe un body en el proceso (body<>0), si no y el type_shape<>type_none, crear el body y continuar, si el type_shape==0 mandar un mensaje de error y exit() o ignorar

la ventaja del 3er punto es que se podría especificar el tipo de shape e inmediatamente comenzar a usarlo, la desventaja que cada vez que se llamara una función se realizaría la verificación

qué opinas, lo que me digas eso haré..


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

SplinterGU

#103
una funcion que trabaja con body? a que te refieres?

---

por otro lado, no estas teniendo en cuante si estas variables son modificadas desde otro proceso externo, por ejemplo, imagina que tenemos un proceso, body_controler() que lo que hace es setear o transformar los cuerpos de una forma a otra, entonces este proceso buscaria ciertos procesos, accederia a sus variables locales y las modificaria, con lo que ahi el frame no te va a ayudar de mucho, ya que vas a tener que esperar el frame real para que ese cuerpo se cree.

podes usar el callback  instance_pos_execute_hook para agregar ahi la creacion de los body, esto se haria cuando sale del proceso, asi sea por frame o por debug o frame parcial o por lo que sea que haga salir a la instancia para pasar a otro proceso; esto seria mas rapido que el anterior metodo, pero sigue teniendo el problema de los procesos externos que modifican estas variables locales.

yo creo que la respuesta al problema es la primer pregunta que te hice en este post.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

con funciones que trabajan con body me refiero a:

[code language="bennu"]static int modUpdateVelocity2(INSTANCE * my, int * params)
{
   cpBodyUpdateVelocity(LOCDWORD(mod_chipmunk,my,LOC_BODY), cpv(*(float *)GLOADDR(mod_chipmunk,GLO_GRAVITY_X),*(float *)GLOADDR(mod_chipmunk,GLO_GRAVITY_Y)), *(float *)&params[0],*(float *)GLOADDR(mod_chipmunk,GLO_INTERVAL)/(float)GLODWORD(mod_chipmunk,GLO_PHRESOLUTION));
   return 0;
}[/code]

por ejemplo,

si LOCDWORD(mod_chipmunk,my,LOC_BODY)==0 puede crashear o no hacer nada (no se).

Quote
yo creo que la respuesta al problema es la primer pregunta que te hice en este post.
a cuál pregunta te refieres?
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)