Cosas generales, World y Bodies

Para llamar a las dependencias, a diferencia de box2D.js en el que se llaman muchos archivos, se hace la importación con variables ya que en javascript no se puede importar paquetes.

var b2Vec2 = Box2D.Common.Math.b2Vec2;
var b2BodyDef = Box2D.Dynamics.b2BodyDef;
var b2Body = Box2D.Dynamics.b2Body;
var b2FixtureDef = Box2D.Dynamics.b2FixtureDef;
var b2Fixture = Box2D.Dynamics.b2Fixture;
var b2World = Box2D.Dynamics.b2World;
var b2MassData = Box2D.Collision.Shapes.b2MassData;
var b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape;
var b2CircleShape = Box2D.Collision.Shapes.b2CircleShape;
var b2DebugDraw = Box2D.Dynamics.b2DebugDraw;


Ahora creamos el mundo (WORLD).

var world = new b2World(new b2Vec2(0,10), true);

Los valores de x,y seubican de esta forma:

canvascoords

Bodies

Los cuerpos tienen posición y velocidad. Se les puede aplicar fuerzas, torques e impulsos. Pueden ser de 3 tipos: estáticos  kinematicos, o dinámicos.

b2_staticBody (Type = 0)


Un cuerpo estático  no se mueve en la simulación y se comporta  como si tuviera masa infinita. Internamente Box2D asigna 0 para la masa y la masa inversa del mismo. Los cuerpos estáticos pueden ser movidos manualmente por el usuario. Tienen 0 de velocidad. Dos cuerpos estáticos no colisionan entre si y tampoco uno estático con uno kinematico.

b2_kinematicBody (Type = 1)


Se mueven en la simulación de acuerdo a su velocidad. No responden a fuerzas. Pueden ser movidos manualmente por el usuario, pero normalmente se mueven cambiando su velocidad. Se comporta como si tuviera masa infinita, sin embargo, Box2D asigna 0 para su masa y su masa inversa. No colisionan con otros cuerpos kinematicos ni estáticos. Son similares a los cuerpos estáticos en que cuando colisionan con un cuerpo dinámico siempre mantienen su posición y fuerza al cuerpo dinámico a moverse a otro lado. La diferencia es que pueden moverse.

b2_dynamicBody (Type = 2)


Un cuerpo dinámico es simulado por completo. Se pueden mover manualmente por el usuario, pero normalmente se mueven de acuerdo a fuerzas. Puede colisionar con todos los tipos de cuerpos. Siempre tiene masa finita, no tiene masa 0. Si se le asigna masa 0 Box2D le asigna 1kg automáticamente.
Los cuerpos(bodies) son la columna vertebral de las fixtures. Ellos llevan muchas fixtures y las mueven con ellos mismos. Los cuerpos son siempre rigidos en box2d. Eso significa que dos fixtures asignadas a un cuerpo nunca se mueven relativas una de otra.

Los Fixtures tienen geometría de colisión y densidad. Normalmente los cuerpos adquieren propiedades de masa de los fixtures.  Sin embargo se puede sobre escribir las propiedades de masa después que un cuerpo es construido.

Definiendo un cuerpo:

var bodyDef = new b2BodyDef;
bodyDef.type = b2Body.b2_dynamicBody;
bodyDef.position.Set(4,8);
bodyDef.userData = 'BOX';


Ahora, usamos esta definicion para crear la instancia real del cuerpo:

var myBody = world.CreateBody(bodyDef);

Definiendo las propiedades de un cuerpo:

myBody.SetPositionAndAngle(new b2Vec2(10,0),Math.PI/2);
myBody.SetLinearVelocity(new b2Vec2(4, 3));
myBody.SetAngularVelocity(Math.PI);


Obteniendo propiedades de los cuerpos:

var pos = new b2Vec2; //Vector para guardar la posición
var vel = new b2Vec2; //Vector para guardarla velocidad
float angle; // Nuevo "float" para guardar el angulo de inclinación del cuerpo
pos = myBody.GetPosition(); //Vector Get Position
angle = (myBody.GetAngle())*(180/Math.PI); //Convierte radianes que son retornados a ángulo
vel = myBody.GetLinearVelocity(); //vector Get linear velocity
var x_pos = pos.x; // Posición con respecto al eje X
var y_pos = pos.y; // Posición con respecto al eje Y
var x_vel = vel.x; // Velocidad en X
var y_vel = vel.y; // Velocidad en Y


Ejemplo para iterar todos los cuerpos en un mundo:

var b = new b2BodyDef;
for(b = world.GetBodyList(); b; b = b.GetNext()) {
//Realizar la acción que se desee con el cuerpo o los cuerpos
}


Destrucción de un cuerpo:

world.DestroyBody(myBody);

Comentarios

Entradas populares de este blog