viernes, 2 de septiembre de 2011

2d-Box Librería de Física para As3 Tutorial

 Simular la realidad en juegos es fundamental para el éxito de estos. 2D-Box es una librería bastante útil para estos casos. Sin embargo existen muy poca documentación en Español sobre esta gran herramienta y si las hay son complejas o están sin terminar.  Básicamente haré una traducción mas simple del tutorial de Emanele Feronato.
 ¿Qué logramos con esta libreria?
Mostraré una serie de capturas de juegos basados en 2dbox son bastante conocidos y ya verán porque le doy importancia a 2dbox.




 Básicamente 2dbox permite interactuar, gravedad, colisiones, distancia, densidad. Conceptos fundamentales en la Física de los cuerpos.

Comienzo : "Hola Mundo"  a continuación haremos un tutorial. pasos a seguir para integrar 2dbox a flash.

1. Debes descargar 2dbox para flash http://www.box2dflash.org/download , puedes elegir la versión. Les recomiendo usar siempre la última versión aunque en este caso usaremos la 2.0.2 ya que el código que mostraremos es para que compile en dicha versión unicamente.

2. Crearemos una carpeta de nuestros proyecto (juego) e incorporaremos todos los archivos que se encuentran en el Zip de 2dbox.
3. Abrimos nuestro programa Flash y elegimos nuevo  ActionScrip 3
    Guardaremos inmediatamente y le pondremos demo.fla . luego nos iremos a las propiedades del documento y en clase colocaremos demo y le hacemos click a lápiz (nos saldra un mensaje de que no se encontró....) y luego le hacemos click nuevamente al lápiz y nos creará un archivo As. (foto)


Guardamos todo eso en la carpeta del proyecto.


Luego en el archivo As. agregaremos el siguiente código . explicaré linea por linea cada código.
Para entender el código claramente hay que saber programar en orientación a objetos
ya que se necesita hacer llamadas, crear objetos, declarar variables, etc.... sin embargo
puedes analisar este código e ir probando cambiando sus números.

package {
import flash.display.Sprite;
import flash.events.Event;
import flash.utils.Timer;
import flash.events.TimerEvent;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
public class demo extends Sprite {
public var the_world:b2World;
var time_count:Timer=new Timer(1000);
public function demo() {
var environment:b2AABB = new b2AABB();
environment.lowerBound.Set(-100.0, -100.0);
environment.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2=new b2Vec2(0.0,10.0);
the_world=new b2World(environment,gravity,true);
var debug_draw:b2DebugDraw = new b2DebugDraw();
var debug_sprite:Sprite = new Sprite();
addChild(debug_sprite);
debug_draw.m_sprite=debug_sprite;
debug_draw.m_drawScale=30;
debug_draw.m_fillAlpha=0.5;
debug_draw.m_lineThickness=1;
debug_draw.m_drawFlags=b2DebugDraw.e_shapeBit;
the_world.SetDebugDraw(debug_draw);
var final_body:b2Body;
var the_body:b2BodyDef;
var the_box:b2PolygonDef;
the_body = new b2BodyDef();
the_body.position.Set(8.5, 13);
the_box = new b2PolygonDef();
the_box.SetAsBox(8.5, 0.5);
the_box.friction=0.3;
the_box.density=0;
final_body=the_world.CreateBody(the_body);
final_body.CreateShape(the_box);
final_body.SetMassFromShapes();
addEventListener(Event.ENTER_FRAME, on_enter_frame);
time_count.addEventListener(TimerEvent.TIMER, on_time);
time_count.start();
}
public function on_time(e:Event) {
var final_body:b2Body;
var the_body:b2BodyDef;
var the_box:b2PolygonDef;
the_body = new b2BodyDef();
the_body.position.Set(Math.random()*10+2, 0);
the_box = new b2PolygonDef();
the_box.SetAsBox(Math.random()+0.1,Math.random()+0.1);
the_box.friction=0.3;
the_box.density=1;
final_body=the_world.CreateBody(the_body);
final_body.CreateShape(the_box);
final_body.SetMassFromShapes();
}
public function on_enter_frame(e:Event) {
the_world.Step(1/30, 10);
}
}
}



Líneas 2-5 : algunas bibliotecas de Flash comunes utilizadas para hacer un juego.
Líneas 6-9 : Llamda a bibliotecas de 2dbox
Línea 11 : Declaración de the_world variable, b2World tipo. b2World es la pantalla principal de el motor Box2D. Que almacena todas las articulaciones y los órganos, se ocupa de las llamadas y es responsable de pasar a través de la simulación.
Línea 14 : Declaración de the_environment , b2AABB tipo. El entorno de la física generada por Box2D no es infinita, y b2AABB es el contenedor de ese entorno. Piense en ello como un cuadro de límite. Dentro de este cuadro de límite, el mundo está gobernado por la física Box2D.
Líneas 15-16 : Definición de las esquinas superior e inferior del cuadro delimitador del medio ambiente, en metros. 1 metro = 30 píxeles. Así que nuestra caja tiene partes hechas por 6000 píxeles. También le gustan mucho para un proyecto de una sola pantalla, pero si se utiliza el desplazamiento, que podría ser útil la creación de un ambiente grande. Para obtener más información acerca de píxeles y se refieren a metros de píxeles Comprensión y metros con Box2D y cómo seleccionar un objeto con el ratón - parte 2 .
Línea 17 : Declaración de gravedad variable, b2Vec2 . tipo b2Vec2 es un vector con componentes x e y.
Línea 18 : Puesta en marcha del mundo: el constructor tiene tres parámetros: el medio ambiente , la worldAABB cuadro delimitador, la gravedad del vector de gravedad del mundo, y un conjunto booleano true para mejorar el rendimiento mediante la simulación de los organismos no inactivo.


Líneas 19-27 : Estas líneas manejar el sorteo de depuración. Recuerde Box2D no saca nada, sólo calcula la posición, rotación y el movimiento de cada objeto en el mundo. Por lo tanto, depende de usted para fijar activos reales a los objetos gráficos world.
La línea 28 declara final_body , b2Body tipo. b2Body es el objeto que se utiliza para representar un cuerpo rígido. Un cuerpo rígido es un trozo de materia que es tan fuerte que la distancia entre dos pedazos de materia en el bloque es completamente constante. Son duros como el diamante.Box2D sólo se ocupa de los cuerpos rígidos.
La línea 29 y 31 declarar y crear the_body variable, b2BodyDef tipo. b2BodyDef se encarga de la definición del cuerpo. Con la definición del cuerpo se puede especificar la posición inicial del cuerpo.
La línea 30 y 33 declarar y crear the_box variable, b2PolygonDef tipo. b2PolygonDef es una definición de polígono.
Línea 32 : establecer la posición inicial del cuerpo. Recuerde que los valores están en metros y se refieren al centro del cuerpo.
Línea 34 : La función de SetAsBox se the_box y lo convierte en una caja, que pasa la mitad de ancho y medio de altura-como parámetros. Lea con cuidado ... la mitad de ancho y medio de altura. En metros.
Línea 35 : la definición de la fricción de la caja
Línea 36 : la definición de la densidad de la caja. Ajuste de la densidad de un cuerpo a cero , como en este caso, hará que el cuerpo estático. Un cuerpo estático no se ve afectada por la gravedad, colisiones, etc. Es sólo fija en el escenario. Esto representará el suelo.
Línea 37 : CreateBody crea el cuerpo previamente definidos
Línea 38 : Voy a crear la forma del polígono definido previamente con createShape en el cuerpo creado previamente con CreateBody
Línea 39 : Una vez que la forma se adjunta, instruimos al cuerpo para calcular sus propiedades físicas de las formas conectado con el método SetMassFromShapes . Esto es cuando los objetos que realmente existe.
Líneas 40-42 : La adición de algunos oyentes
Líneas 45-58 : Esta función, que se ejecutará en cada segundo, crea un cuadro de la misma manera que he creado el suelo, con la única excepción en la línea 54 me he fijado una densidad diferente a cero , es decir, el cuerpo no es estática una. Todo el mundo con una densidad va a reaccionar a las colisiones, la gravedad, las fuerzas y así sucesivamente.
Líneas 60 : Tenemos que actualizar el mundo en cada marco. Lo podemos hacer con el paso de funciones. Paso tiene dos parámetros: el primero es el intervalo de tiempo, en segundos. Esto significa que en cada cuadro que voy a actualizar el mundo como si 1/30s pasado. El segundo es el solucionador de restricciones. El solucionador de restricciones resuelve todas las restricciones en la simulación, uno a la vez. Una restricción solo se puede resolver perfectamente. Sin embargo, cuando se resuelve una limitación, que poco interrumpir otras limitaciones. Para obtener una buena solución, tenemos que iterar sobre todas las restricciones de un número de veces. El número de iteraciones sugerido para Box2D es de 10.







Espero que les haya servido este tutorial. Más adelante publicaré otros artículos en relación a esta gran librería para así terminar con un juego como demostración.
gracias y cualquier duda no dudes en comentar.



No hay comentarios:

Publicar un comentario