miércoles, 19 de febrero de 2014

4.- El mundo, cuerpos, figuras y fixturas

El mundo (World)

Cada aplicación con Box2D comienza con la creacion de un objeto del tipo World. La clase World se encarga de manejar la memoria, objetos y la simulación.

1.- La creación del mundo es muy sencilla. Primero, necesitamos un vector que define la gravedad.

                    Vector2 gravedad = new Vector2( 0, -9.8f ); // Gravedad de la tierra 9.8 m/s/s

La gravedad afecta a cada cuerpo dinámico que se encuentra en nuestro mundo en este caso x=0 lo que significa que no hay gravedad horizontal e y=-9.8f que es casi la misma gravedad que la Tierra.

Si quisiéramos un mundo sin gravedad nuestro código se vería así

                   Vector2 gravedad = new Vector2( 0, 0);

2.- Otro parametros que necesita nuestro mundo es, si permitimos que nuestros cuerpos puedan dormir. Esto significa que cuando un cuerpo entra en reposo el mundo deja de hacer simulaciones en el lo que incrementa el rendimiento de nuestra aplicacion.

                    boolean dormir = true;

3.- Finalmente podemos crear nuestro mundo de con el siguiente código.

                   World oWorld = new World( gravedad, dormir);

4.- Corriendo las simulaciones: Box2D utiliza un algoritmo computacional llamado "integrator" que simula la física del mundo en pasos discretos de tiempo. Para simular tenemos que escoger un paso de tiempo ( time step). Normalmente los juegos corren a 60fps y tienen un "time step" de  1/60 segundos.
Para nuestros ejemplos utilizaremos el tiempo transcurrido desde el frame pasado y el actual, delta. 

Pero no solo necesitamos un time step. En cada paso de la simulación los cuerpos son actualizados dependiendo de las fuerzas que actúan en el. El algoritmo encargado de esto se llama "constraint solver".

Existen 2 fases en la simulación, la fase de velocidad y la fase de posicion. En la fase de velocidad las cuerpos se mueven de acuerdo a sus impulsos y en la fase de posicion se ajustan las posiciones para prevenir que se traslapen los cuerpos.

Por lo que entre más iteraciones más precisa será nuestra simulación pero menor rendimiento. Para nuestro tutorial utilizaremos 8 iteraciones de velocidad y 6 iteraciones de posicion. por lo que nuestro código se verá así:

                         oWorld.step(delta, 8, 6);


Cuerpos (Bodies)

Los cuerpos son parte fundamental de Box2D, cualquier cosa que se mueva con la que puedas interactuar en el mundo son cuerpos.

Existen cuerpos diferentes tipos de cuerpos: dinámicos, cinemáticos y estáticos.

Los cuerpos tiene distintas formas (figuras) : Circulares, cuadrados o cualquier tipo de polígono.

También tienen diferentes propiedades como son: densidad, fricción , restitución, velocidad,  posicion en el mundo, etc.

1.- Para crear un cuerpo en nuestro mundo el primero paso es crear un BodyDef que es la definición del cuerpo y sirve para mantener toda la información necesaria para crear nuestro cuerpo.

                    BodyDef bd = new BodyDef();
                    bd.position.set( 4 , 2 );
                    bd.type = BodyType.DynamicBody;

Creamos la definición del cuerpo y la posicionamos en el centro de la pantalla. Recordemos que el tamaño de nuestra cámara es de 8f x 4.8f. Y por último decimos que nuestro cuerpo será dinámico.

Nuestro cuerpo tendrá una figura circular por lo que tenemos que crear una figura circular (Shape)

Figuras ( Shapes) 

Una figura es un objeto geométrico, como un circulo, cuadrado o un polígono, en caso de que sea un polígono debe ser un polígono convexo ya que Box2D solo funciona con polígonos convexos.

Para crear nuestra figura circular utilizamos el siguiente código:

                   CircleShape shape = new CircleShape();
                   shape.setRadius(.1f);

Simplemente creamos un objeto circular y le damos radio de .1f, ahora es momento de crear una fixtura para nuestro cuerpo.

"Fixturas" (Fixture)

Las "fixturas" sirven para dar tamaño, forma y otras propiedades como densidad, fricción y restitución. 

Las principales propiedades son:

  • Densidad - Que tan pesado es un cuerpo en relación con su área
  • Fricción - Que tan resbaloso es el cuerpo
  • Restitución - Que tanto rebote tiene el cuerpo
  • Figura (Shape) - Puede ser un cuadrado, polígono o un circulo.
Existen más propiedades que iremos explicando más adelante en estos tutoriales. Por el momento no nos vamos a preocupar de las propiedades y vamos a crear una "fixtura".


                    FixtureDef fixDef=new FixtureDef();
                    fixDef.shape=shape;

Creamos la definición de la "fixtura" y le asignamos el cuerpo circular que creamos anteriormente.

Agregar el cuerpo al mundo

Para agregar nuestro círculo al mundo e creado una funcion llamada crearPelota() y contiene todo lo que aprendimos anteriormente.



a este código se han agregado dos líneas más que son

                    Body oBody = oWorld.createBody(bd);
                    oBody.createFixture(fixDef);

En la primera línea creamos el cuerpo con la definición del cuerpo que creamos anteriormente, y le agregamos a nuestro cuerpo la "fixtura".


Poniendo todo junto

Agregando todo el código a nuestro código base nuestra clase se deberá ver así. 



Ahora solo queda correr nuestra aplicacion como ya habíamos aprendido en tutoriales anteriores. 



Y nuestra aplicacion se vera asi.


Una pelota en medio de la pantalla que cae y desaparece de nuestra vista.
Pueden hacer pruebas cambiando el radio de la pelota, cambiando los valores de la gravedad, etc.

Conclusión

En este tutorial vimos como crear el mundo y como hacer que nuestro mundo corra las simulaciones.

También aprendimos que son los cuerpos, que tipos de formas pueden tener y como agregarlos al mundo.
















6 comentarios:

  1. Al añadir el código salen errores por las referencias a elementos no añadidos, desaparecen usando ctrl+shift+o Lo pongo por si hay otro torpe como yo!

    ResponderEliminar
  2. También decir que las modificaciones del código se hacen sobre el principal, pero para probar el funcionamiento se hace Run sobre el Desktop, porque Run sobre el principal da error!

    ResponderEliminar
    Respuestas
    1. Asi es se debe correr sobre el projecto del escritorio

      Eliminar
  3. Hola tienes tutoriales muy buenos,¿Como se podría añadir una textura a un cuerpo?quiero decir en vez de tener cuerpos geométricos tener texturas

    ResponderEliminar
    Respuestas
    1. Hola, el tutorial numero 8 explica como añadir imagenes. http://tutoriales.tiarsoft.com/2014/05/8-cuerpos-y-sprites-imagenes.html

      Eliminar
  4. Hola, tengo una duda sobre esto de libGDX, más específicamente sobre la acción que quiero darle a un body.

    Lo que sucede es que quiero poner algo así como potenciadores pero desconozco como hacer que un potenciador desaparezca cuando el personaje lo toque. Ya he hecho que el personaje muera cuando lo toca un enemigo (cuando hay una colisión) pero no sé como hacer lo otro, si alguien me puede ayudar se lo agradecería mucho.

    ResponderEliminar