2012-02-22 14 views
5

Estoy pensando que hay una respuesta simple a mi pregunta aparentemente simple, pero podría estar totalmente equivocado. De todos modos, soy nuevo en box2dWeb y en mi mundo Box2dWeb creo un piso y un simple objeto que cae. Cuando "depuro dibujar" en mi lienzo, veo caer la caja y todo. Todo lo que quiero hacer es dar salida a la posición x del objeto que caí que creé en los navegadores console.log y no funciona del todo bien. Console.log solo muestra la posición de inicio de mi objeto pero el número no se actualiza aunque mi objeto dentro del lienzo está cayendo. Después de horas de búsqueda con muchos motores de búsqueda y lugares como los tutoriales de Seth Ladds, llegué vacío. Espero que alguien aquí pueda ayudar. Proporcioné un código de muestra para ayudarme a explicarme un poco mejor. Espero eso ayude. Gracias a todos los que responden.¿Hay alguna manera en Box2dWeb para mostrar position.x de un objeto a console.log()?

var world; 

    function init() { 
    var b2Vec2 = Box2D.Common.Math.b2Vec2 
     , b2BodyDef = Box2D.Dynamics.b2BodyDef 
     , b2Body = Box2D.Dynamics.b2Body 
     , b2FixtureDef = Box2D.Dynamics.b2FixtureDef 
     , b2Fixture = Box2D.Dynamics.b2Fixture 
     , b2World = Box2D.Dynamics.b2World 
     , b2MassData = Box2D.Collision.Shapes.b2MassData 
     , b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape 
     , b2CircleShape = Box2D.Collision.Shapes.b2CircleShape 
     , b2DebugDraw = Box2D.Dynamics.b2DebugDraw 
     ; 

    world = new b2World(
      new b2Vec2(0, 10) //gravity 
     , true //allow sleep 
    ); 

    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 0.5; 
    fixDef.restitution = 0.2; 

    var bodyDef = new b2BodyDef; 

    //create ground 
    bodyDef.type = b2Body.b2_staticBody; 
    bodyDef.position.x = 9; 
    bodyDef.position.y = 13; 
    fixDef.shape = new b2PolygonShape; 
    fixDef.shape.SetAsBox(10, 0.5); 
    world.CreateBody(bodyDef).CreateFixture(fixDef); 


     //FIXTURE - define fixture 
     crateFixture = new b2FixtureDef; 


      //set object attributes 
      crateFixture.density = 0.9; 
      crateFixture.friction = 0.5; 
      crateFixture.restitution = 0.5; 


     //BODY - define body 
     crateDef = new b2BodyDef; 


      //setup type 
      crateDef.type = b2Body.b2_dynamicBody; 
      crateDef.position.x = 5;   
      crateDef.position.y = 5;  
      crateDef.angle = 65; 


     //SHAPE - define shape 
     crateFixture.shape = new b2PolygonShape; 


     //define shape 
      crateFixture.shape.SetAsBox(2, 2); 


     //add to our world 
     world.CreateBody(crateDef).CreateFixture(crateFixture); 


      //setup debug draw 
      var debugDraw = new b2DebugDraw(); 
    debugDraw.SetSprite(document.getElementById("canvas").getContext("2d")); 
    debugDraw.SetDrawScale(30.0); 
    debugDraw.SetFillAlpha(0.3); 
    debugDraw.SetLineThickness(1.0); 
    debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit); 
    world.SetDebugDraw(debugDraw); 

    window.setInterval(update, 1000/60); 
    }; 

    function update() { 
    world.Step(
      1/60 //frame-rate 
     , 10 //velocity iterations 
     , 10 //position iterations 
    ); 
    world.DrawDebugData(); 
    world.ClearForces(); 
    console.log('the crate is located at ' + crateDef.position.x); //position of crate doesnt update 
    }; 

Respuesta

5

autorización así que no gracias a la falta de documentación real, específicamente para Box2DWeb Yo finalmente resolver esto. Rápidamente también quería agradecer a Jer In Chicago por sus respuestas, así que gracias hermano. De todos modos la respuesta:

vez que se agrega el objeto en el mundo de esta manera:

crateFixture = world.CreateBody(crateBodyDef).CreateFixture(crateFixtureDef); 

se puede agarrar el valor de su objeto (en mi caso es crateBody) de la siguiente manera:

console.log('crate X: ' + crateFixture.GetBody().GetPosition().x); 
console.log('crate Y: ' + crateFixture.GetBody().GetPosition().y); 
console.log('crate Angle: ' + crateFixture.GetBody().GetAngle()); 

Espero que esto ayude a los demás!

+1

En realidad, 'CreateBody' debería devolver un' b2Body', que podría obtener la posición mediante 'crateBody.GetPosition(). X' – sntran

+0

Mientras que .CreateBody() devuelve un b2body, .CreateBody(). CreateFixture() devuelve un b2fixture, que no tiene el método GetPosition() – OneThreeSeven

2

Ok, no pudo encontrar una API/doc para Box2dWeb, lo que he descargado la fuente y confirmó que el cuerpo debe tener una posición ... en lugar de tratar de usar la crateBody var, deja apenas bucle a través de todos los cuerpos que están en el mundo y ver si podemos imprimir sus coordenadas ... ¡Buena suerte!

Editar: Prueba este

// Add after world step call 
for (b = world.GetBodyList(); b; b = b.GetNext()) { 
    console.log('the object is located at (' + b.position.x + ',' + b.position.y + ')'); 
} 
+0

Hola, Jer, gracias por responder. Hice lo que dijiste y recibí el mismo mensaje que se muestra como "crateBody.position no está definido". Lo que es extraño es que si "console.log ('la caja está ubicada en' + crateBody);" Obtengo que "la caja está ubicada en [object object]" en console.log, lo que significa que el objeto está allí pero parece que falta el valor de "posición". Este problema me está volviendo loco. Sin embargo, aprecio tu ayuda porque me ayudó a calmar mis nervios un poco. – Stankyfist

+0

ahh, tal vez crateBody.GetPosition.x o crateBody.GetPosition(). X –

+0

Hey Jer hermano del mismo mensaje: 'crateBody.GetPosition.x undefined' y' crateBody.GetPosition(). X undefined' No sé si esto es porque de una cuestión portuaria o qué, pero debería funcionar. Gracias de nuevo por tratar de ayudarme. – Stankyfist

0
var body = world.CreateBody(bodyDef); 
body.CreateFixture(fixDef); 

console.log(body.GetWorldCenter().x); 

o

var body = world.CreateBody(bodyDef); 
body.CreateFixture(fixDef); 

console.log(body.GetPosition().x); 

o

var body = world.CreateBody(bodyDef); 
body.CreateFixture(fixDef); 

console.log(body.GetWorldPoint(new b2Vec2(0,0)).x); 

Donde (0,0) es la coordenada del centro del cuerpo en coordenadas locales. La función GetWorldPoint la convierte en Coordenadas mundiales.

+0

Para los tutoriales de Box2dWeb, vaya a http://adf.ly/FDbTH – Shekhar

0

Tuve el mismo problema al trabajar con Box2dWeb. Gracias por publicar esta pregunta. Utilizando consejos de @JerinChicago, encontré la solución.

for (var b = world.GetBodyList() ; b; b = b.GetNext()) { 
    console.log('the object is located at (' + b.GetPosition().x + ',' + b.GetPosition().y + ')'); 
} 

Espero que esto ayude.

Cuestiones relacionadas