2012-02-22 4 views
5

Sto pensando che c'è una semplice risposta alla mia domanda apparentemente semplice, ma potrei sbagliarmi completamente. Ad ogni modo sono nuovo a box2dWeb e nel mio mondo Box2dWeb creo un pavimento e un semplice oggetto cadente. Quando "debug draw" nella mia tela vedo la scatola che cade e tutto. Tutto quello che voglio fare è mostrare la posizione x dell'oggetto che ho creato nel browser console.log e non funziona abbastanza bene. Il file console.log mostra solo la posizione iniziale del mio oggetto ma il numero non si aggiorna anche se il mio oggetto all'interno del canvas sta calando. Dopo ore di ricerche con molti motori di ricerca e posti come tutorial su Seth Ladds, mi sono ritrovato vuoto. Spero che qualcuno qui possa aiutarti. Ho fornito un codice di esempio per aiutare a spiegarmi un po 'meglio. Spero che sia d'aiuto. Grazie a tutti quelli che rispondono.C'è un modo in Box2dWeb per mostrare position.x di un oggetto su 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 
    }; 

risposta

5

OK quindi non grazie alla mancanza di qualsiasi documentazione reale appositamente per Box2DWeb ho fatto finalmente capire questo. Volevo anche ringraziare Jer In Chicago per le sue risposte, quindi grazie fratello. In ogni caso la risposta:

una volta aggiunto il tuo oggetto al vostro mondo in questo modo:

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

si può afferrare il valore del vostro oggetto (nel mio caso è crateBody) come segue:

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

Spero che questo aiuti gli altri!

+1

In realtà, 'CreateBody' dovrebbe restituire un' b2Body', che potresti ottenere dalla posizione di 'crateBody.GetPosition(). X' – sntran

+0

While .CreateBody() restituisce un b2body, .CreateBody(). CreateFixture() restituisce un b2fixture, che non ha il metodo GetPosition() – OneThreeSeven

2

Ok, non riusciva a trovare un api/doc per Box2dWeb, così ho scaricato la fonte e ha confermato che il corpo dovrebbe avere una posizione ... invece di cercare di usare il crateBody var, lascia solo ciclo attraverso tutti i corpi che sono nel mondo e vediamo se possiamo stampare le loro corde ... Buona fortuna!

Edit: Prova questo

// 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

Hey Jer, grazie per aver risposto. Ho fatto quello che hai detto e ottengo lo stesso messaggio che viene visualizzato come "crateBody.position non è definito". La cosa strana è che se io "console.log ('la cassa si trova in' + crateBody);" Ottengo "la cassa si trova in [oggetto oggetto]" nel console.log che significa che l'oggetto è lì ma sembra che il valore "posizione" sia mancante. Questo problema mi sta facendo impazzire. Comunque apprezzo il tuo aiuto perché mi ha aiutato a calmare un po 'i nervi. – Stankyfist

+0

ahh, forse crateBody.GetPosition.x o crateBody.GetPosition(). X –

+0

Hey Jer stesso fratello di msg: 'crateBody.GetPosition.x undefined' e' crateBody.GetPosition(). X undefined' Non so se questo è perché di un problema di porto o cosa, ma dovrebbe funzionare. Grazie ancora per aver cercato di darmi una mano. – 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); 

Dove (0,0) è la coordinata del centro del corpo in coordinate locali. La funzione GetWorldPoint la converte in Coordinate mondiali.

+0

Per i tutorial di Box2dWeb andare su http://adf.ly/FDbTH – Shekhar

0

Ho avuto il problema simile con Box2dWeb. Grazie per aver postato questa domanda. Usando i suggerimenti di @JerinChicago ho trovato la soluzione.

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

Spero che questo possa essere d'aiuto.