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.

l1nk3rn3l


josebita

Dos cosas:
¿Podrías explicar un poco más lo de la generación de terrenos mediante gpt?
Lo otro es que me has bajado el número de versión, de 0.975 a 0.9 y no me deja subir la versión a los repositorios (me dice que ya hay una versión posterior subida).

Prg

#287
Me faltó un nueve, perdón XD

es la 0.99

Ok, comento y subo aquí (No comenté todo porque lo que viene en el test ya se había comentado en los test anteriores, y como no tenía tanto tiempo mejor sólo comenté lo nuevo. Pero comentaré este test) :

Primero, se necesita un cpt, que son los archivos de puntos de control que exportan los editores fpg. El terreno se genera a partir del punto 1, el cero es ignorado. Los puntos de control consecutivos  generan las líneas que harán las colisiones en el terreno, por ejemplo:

si tenemos 3 puntos,

p1(0,100)
p2(100,90)
p3(200,100)

Nuestro terreno estará formado por dos líneas, que parecerán un pico.

Para cortar la continuidad de terreno hay que dejar puntos de control sin definir, de tal forma que se cumpla que el valor de la cadena leída es "-1 -1", por ejemplo:

si tenemos 5 puntos,

p1(0,100)
p2(100,90)
p3(-1,-1)    //Cuando un punto de control no se define se le asigna el valor -1 -1, Lo he hecho con mi editor de puntos de control de mi "editor fpg", pero no había visto que esto no lo acepta el editor del bennupack, supongo que tendrán que poner un valor genérico y remplazarlo luego por el valor -1 -1, o también pueden modificar la función, al fin y al cabo es código bennu
p4(0,400)
p5(100,390)

Los puntos anteriores generan dos líneas, una del punto 1 al 2 y otra del punto 4 al 5

El código comentado es:

[code language="bennu"]import "mod_math"
   import "mod_draw"
   import "mod_map"
   import "mod_screen"
   import "mod_chipmunk"
   import "mod_video"
   import "mod_text"
   import "mod_proc"
   import "mod_key"
   import "mod_wm"
   import "mod_say"
   import "mod_regex"
   import "mod_string"
   import "mod_map"
   import "mod_grproc"
   import "mod_rand"
   import "mod_file"
   import "mod_sound"
   import "mod_timers"
   import "mod_time"
   import "mod_dir"
   import "mod_scroll"

global
   pelota;
   cpVect ot;
   handler;
   fondo;
   fpg;
private
   press;
   cpSegmentQueryInfo info ;
   float distancia;
   bl;
Begin
   set_mode(800,600,32);
   fondo=load_png("fondoHielo.png");
   fpg=load_fpg("graficos.fpg");
   start_scroll(0,0,fondo,0,0,0);       //Se inicia el scroll

       gphysics.gravity_Y=300;              //Define la gravedad a 300
   gphysics.damping=0.9;                //Disminuye la viscosidad a 0.9
   handler=COLLISIONHANDLERNEW(1,0);    //detecta donde colisionan los objetos con lphysics.collisionType 1 y 0. De tal forma que nos permitirá saber cuando nuestro protagonista toque el suelo

   generaTerreno("piso.cpt");           //Se genera el terreno
       prota(100,100);                      //Se genera el protagonista
       
       write(0,100,30,4,"Presiona espacio para ver el terreno físico");
   while (!key(_esc))
           if (key(_space))             //si presionas espacio
           pintaTerreno("piso.cpt");    //Pinta el terreno en el que se colisiona
           end
      frame;
   end
   let_me_alone();                      //Si se presiona escape, se finaliza todo
end

function generaTerreno(string ruta);         //Recibe una string con la ruta donde está el cpt
private
   float x0=-1,x1=-1,y0=-1,y1=-1;
   string cad;
   string cadenas[2];
   otro_os;
   cant;
   cont8;
begin
   otro_os=fopen(ruta,O_READ);          //abre el cpt
   if (not otro_os)                     //Si no pudo abrirlo retorna false
      return false;
   end
   x0=y0=x1=y1=-1;                      //inicializa las variables de la posición a -1
   cad=fgets(otro_os);                  //Lee encabezado
   cad=fgets(otro_os);                  //lee la cantidad de puntos de control
   cant=atoi(cad);                      //Almacena la cantidad de puntos de control en la variable cant
   cant--;
   cad=fgets(otro_os);                  //leer punto 0  e ignorarlo
   for (cont8=0;cont8<cant;cont8++)     //Para todos los puntos que faltan
      x1=x0;                       //guarda en x1 el valor de la última coordenada leída de x
      y1=y0;                       //y en y1 la última coordenada leída en y
      cad=fgets(otro_os);          //lee el siguiente punto
      if (cad=="-1 -1")            //si tiene -1 -1, reiniciar la línea
         x0=y0=x1=y1=-1;      //La línea se reinicia colocando las cuatro variables a -1
      else                         //De lo contrario
         split(" ",cad,&cadenas,2);   //Dividir la cadena en 2 usando el espacio
         x0=atoi(cadenas[0]);         //recoger el valor de x
         y0=atoi(cadenas[1]);         //recoger el valor de y
      end
      if (x1<>-1)                          //si la x1 está definida, entonces ya tenemos una línea
         z= addInanimateShape(type_line,x1,y1,x0,y0,0.0);       //se agrega al terreno la línea
      end
   end
   fclose (otro_os);                                                      //si ya se terminó de leer, se cierra el archivo
   return true;                                                           //y se retorna true
end


//Esta función pinta líneas con draw para ver si nuestro terreno quedó bien,
//su funcionamiento es el mismo que el de la función anterior, así que no lo comentaré

function pintaTerreno(string ruta);
private
   float x0=-1,x1=-1,y0=-1,y1=-1;
   string cad;
   string cadenas[2];
   otro_os;
   cant;
   cont8;
begin
   delete_draw(0);
   drawing_color(rgb(255,0,0));
   otro_os=fopen(ruta,O_READ);
   if (not otro_os)
      return false;
   end
   x0=y0=x1=y1=-1;
   cad=fgets(otro_os);
   cad=fgets(otro_os);
   cant=atoi(cad);
   cant--;
   cad=fgets(otro_os); //leer punto 0
   for (cont8=0;cont8<cant;cont8++);
      x1=x0;
      y1=y0;
      cad=fgets(otro_os);
      if (cad=="-1 -1")
         x0=y0=x1=y1=-1;
      else
         split(" ",cad,&cadenas,2);
         x0=atoi(cadenas[0]);
         y0=atoi(cadenas[1]);
      end
      if (x1<>-1)
         draw_line(x1-scroll.x0,y1-scroll.y0,x0-scroll.x0,y0-scroll.y0);
      end
   end
   fclose (otro_os);
   return true;
end

//Protagonista
process prota(x,y)
private
   id3;
   cpvect nPiso,vel,inter,aux,pos=0,-17;
   cpContactPointSet Ct;
   int x0,y0;
   sub;
   dat[]=0,-20,20;//se puede crear un arreglo con los parámetros para la creación del cuerpo físico y asignarse la dirección del arreglo a la variable local lphysics.params para crear el cuerpo de acuerdo a éstos. Los parámetros son los mismos que los que se usan en las funciones que hacen este trabajo y en el mismo orden (addCircleShape, por ejemplo).
begin
       file=fpg;
   graph=302;
   ctype=c_scroll;
   scroll.camera=id;

   lphysics.static=false;
   lphysics.mass=10;
   lphysics.inertia= cpMomentForCircle(lphysics.mass, 0, 20, cpv(0,-20,&aux)); //define el momento, este valor es muy importante
   lphysics.params=&dat;                     //parámetros para la creación del lphysics.shape: centro 0,-20 y 20 de radio.
   lphysics.elasticity=0;
   lphysics.friction=0;
   lphysics.collisionType=1;
   lphysics.ShapeType=TYPE_circle;
   FORCECREATEBODY(); //forza la creación del cuerpo físico inmediatamente para comenzar a usarlo
       cpv(0,-1,nPiso);   //el personaje comienza de pie
   loop

      if (key(_right))
         GetBody(lphysics.body,cp_c_v,&vel);      //Obtiene la velocidad del cuerpo
         cpvperp(&nPiso,&aux);                    //guarda en aux el vector perpendicular a nPiso (Normal al piso)
         cpvmult(&aux, 10,&inter);                //Multiplica aux por 10 y lo guarda en inter
         cpvadd(&vel, &inter,&inter);             //Suma a vel inter y lo guarda en inter
         inter.x=cpfclamp(inter.x, -120, 120);    //Restringe inter.x entre -120 a 120
         DEFBODYP(lphysics.body,CP_C_V,&inter);   //Define la velocidad del cuerpo igual a inter
         graph++;
         flags=1;

      end
      if (key(_left))
         GetBody(lphysics.body,cp_c_v,&vel);
         cpvperp(&nPiso,&aux);
         cpvmult(&aux, -10,&inter);               //Igual al anterior, pero multiplica aux por -10 para mover el proceso en la otra dirección
         cpvadd(&vel, &inter,&inter);
         inter.x=cpfclamp(inter.x, -120, 120);
         DEFBODYP(lphysics.body,CP_C_V,&inter);
         graph++;
         flags=0;
      end
      if (GETCOLLISIONINFO(handler,&ct))               //Si se toca el piso

         if (ct.points[0].normal.y>0.5)           //Se restringe qué inclinación del piso se considera para obtener las normales (Este vector es unitario)
            nPiso.x=-1.0*ct.points[0].normal.x;   //Se guarda la normal
            nPiso.y=-1.0*ct.points[0].normal.y;
         end
         sub=true;
      else
         sub=false;
      end

      angle=atan2(nPiso.y*1000.0,nPiso.x*1000.0)+90000;     //Le asigna un ángulo al personaje de acuerdo a al inclinación del piso
      if (flags==0)
         angle*=-1;                                    //Corrige los ángulos
      end
      if (sub and key(_up) )                                //si quieres saltar y estás tocando el piso
         GetBody(lphysics.body,cp_c_v,&vel);           //Se guarda la velocidad en vel
         cpvmult(&nPiso, 600.0,&aux);                  //Se multiplica la normal al piso por 600 (altura del salto)
                       cpvadd(&vel, &aux,&vel);                      //Se suma el resultado anterior a la velocidad actual
                       vel.y=cpfclamp(vel.y, -600, 600);             //Se limita la velocidad del salto
         DEFBODYP(lphysics.body,cp_c_v,&vel);          //y se hace saltar asignándole la velocidad almacenda en vel al cuerpos
         cpBodyActivate(lphysics.body);                //Cuando se hagan cambios a las propiedades de un cuerpos, es necesario llamar esta función
      end
      if (graph>309)
         graph=302;
      end
      if (y>600)
      y=100; x=100;
      end
      UpdateVelocity();                                     //Actualiza la velocidad del proceso para que disminuya con el paso del tiempo. sólo es necesario usar esta función cuando se modifican los valores del cuerpo directamente mediante funciones como DEFBODY* o setMass
      frame;

   end
end[/code]

El cpt tiene la forma:

QuoteCTRL-PTS
27
693 300
332 337
125 347
-1 -1
129 204
39 212
3 240
3 3
1383 14
1380 269
1334 245
1260 251
1178 301
1094 399
1024 463
862 466
830 534
639 532
-1 -1
742 213
636 216
-1 -1
589 469
508 468
-1 -1
460 405
382 407

Igual, al ser código bennu se puede usar cualquier criterio y cualquier modificación que se considere pertinente, esta es una propuesta y un método que yo uso.

En el ejemplo anterior se puede observar que el  movimiento se hace por medio de velocidades en lugar de usar incr_x. cualquier método funciona, pero se me hace más naturar usar velocidades. Eso sí, se complica el código. En los test encontrarán los dos métodos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

FreeYourMind

Aqui tienes el output mister PRG.

Prg

gracias amigo.

esos mensajes deben aparecer, se generan en la línea 3641 y 3642 del main.c

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

josebita

Prg, ¿estarías dispuesto a cambiar la licencia de la GPL a otra más liberal tipo la propia zlib para que pueda incluir tu mod_chipmunk en la versión para iOS?

Un saludo.

FreeYourMind

Pero eso no compite a los creadores de la chipmunk original ?

josebita

Dado que estamos usando chipmunk, yo diría que complementa.

Windgate

El chipmunk para iOS sería la polla con cebolla. ¿El Bennu para iOS ofrece interactividad con el gravitómetro ese?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

josebita

#294
Menuda frase más guapa que te ha quedao :)
Sí, parece que los acelerómetros funcionan muy bien:
http://bennugd-mobile.blogspot.com/2011/05/accelerometers-in-ios.html

PD: Prg no contesta... ¿Alguien sabe si anda de vacaciones o algo?

Prg

perdón, salí de viaje 4 días, pero ya estoy de vuelta a la vida cotidiana (tareas, proyectos, etc.), je je.

No tengo ningún problema, sólo díganme qué hacer, qué necesitan que haga.

Free, no había podido revisar los txt, pero ahorita que los veo me doy cuenta que si hay diferencias en los valores de los archivos. Como se imprimen cada frame y estoy seguro que debieron pasar algunos frames antes de que eliminaras el rectángulo verde, entonces revisé las primeras líneas. Estas son las primeras líneas:

El de la portátil
Quote160 20 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
sin movimiento arriba comienzo 160 28 0
sin movimiento arriba 160 28 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
resorte comienzo 140 50 0
resorte 140 50 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
motor comienzo 200 90 0
motor 200 90 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
oscilacion comienzo 58 135 0
oscilacion 58 135 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
sin movimiento abajo comienzo 160 165 0
sin movimiento abajo 160 165 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
sin movimiento abajo 160 165 0 ( 0.000,  0.000) ( 0.000,  1.000) ( 1.000, -0.000)
oscilacion 58 135 0 ( 0.445,  0.000) ( 0.000,  1.000) ( 1.000,  0.000)
impulso 2.573447

El de la PC
Quotebola 160 20 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
sin movimiento arriba comienzo 160 28 0
sin movimiento arriba 160 28 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
resorte comienzo 140 50 0
resorte 140 50 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
motor comienzo 200 90 0
motor 200 90 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
oscilacion comienzo 58 135 0
oscilacion 58 135 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
sin movimiento abajo comienzo 160 165 0
sin movimiento abajo 160 165 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
sin movimiento abajo 160 165 0 ( 0.000,  0.000) ( 0.000,  0.000) ( 1.000, -0.000)
oscilacion 58 135 0 ( 0.445,  2.727) ( 0.000,  0.000) ( 1.000,  0.000)
impulso 0.450572

Ahora, aunque haya discrepancias en los valores, no entiendo el porqué de los problemas que se están dando en estas consolas.

Por otro lado, ya salió la nueva versión de Chipmunk, hace como un mes, pero aún no hay api de ayuda, así que antes de adaptarla necesito ver qué cambiar.

Otra cosa que quiero comentar es que adjunté nueva versión que corrige algunas cosas del tema de la liberación de recursos.

Además, en junio tengo un pequeño juego (4 niveles) de un juego de plataformas que usa Chipmunk, me gustó mucho el resultado. Lo presentaré en junio porque primero lo quiero presentar en la exposoftware de la Univ.

bueno, saludos.

Entonces, para concluir, hay nueva versión y además estoy de acuerdo en el cambio de licencia.

Saludos.


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

josebita

Genial, mil gracias :)

Prg

#297
Hola, subo un juego que preparé con la librería en las vacaciones pasadas. Ayer y hoy lo presenté (junto con otros 2 juegos) en la universidad permitiendo que las personas lo probaran.

El link de descarga es:

http://www.mediafire.com/?kgym2yv5g1uump6

hubo muchos problemas cuando lo subí, cualquier problema me avisan. El juego usa los cursores del teclado y el joystick y el botón 3 de éste.

Son 4 niveles, y 3 vidas, hay que usar los barriles para destruir los enemigos (abejas, changos, etc). Los gráficos y los sonidos los reconocerán de inmediato, son ripeados.

Para conseguir más vidas hay que recoger los globos o 100 bananas. Si lo sienten muy difícil pueden cambiar la variable vidas (línea 223) o incluso modificar la linea 224 cambiando de zona (1-4)

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

SplinterGU

Quote from: Prg on June 03, 2011, 02:33:13 AM
Hola, subo un juego que preparé con la librería en las vacaciones pasadas. Ayer y hoy lo presenté (junto con otros 2 juegos) en la universidad permitiendo que las personas lo probaran.

El link de descarga es:

http://www.mediafire.com/?kgym2yv5g1uump6

hubo muchos problemas cuando lo subí, cualquier problema me avisan. El juego usa los cursores del teclado y el joystick y el botón 3 de éste.

Son 4 niveles, y 3 vidas, hay que usar los barriles para destruir los enemigos (abejas, changos, etc). Los gráficos y los sonidos los reconocerán de inmediato, son ripeados.

Espero les guste, Saludos.

prg, hacia tiempo que no te veia, o por lo menos asi me parecio.

podrias incluir en el pack los modulos de linux y de windows en una carpeta dll dentro del directorio del juego (y dependencias), de esta forma podemos ejecutar el juego con el runtime que tenemos instalado de bennugd, pero si no disponemos de la chipmiunk.

gracias, ya doy un karma por el juego que no dudo esta bueno y cuando subas el modulo chipmunk te doy otro karma.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

l1nk3rn3l

le mirare...  descargando    ;D