2012-02-22 2 views
5

私は一見単純な質問に簡単な答えがあると思っていますが、私は全く間違っている可能性があります。とにかく私はbox2dWebを初めて使っています。私のBox2dWeb世界では、床と単純な落下物を作成しています。キャンバスに「ドロー・ドロー」すると、箱が落ちて、すべてが見えます。私がしたいのは、私が作成した落下オブジェクトのx位置をブラウザのconsole.logに出力するだけで、正しく動作しません。 console.logにはオブジェクトの開始位置が表示されますが、キャンバス内のオブジェクトが落ちていても番号は更新されません。多くの検索エンジンやSeth Laddsのチュートリアルのような場所で何時間も検索した後、私は空になった。ここの誰かが助けてくれることを願っています。私は少し自分自身を説明するのに役立つサンプルコードをいくつか用意しました。それが役に立てば幸い。誰にも感謝します。代わりにcrateBodyのVARを使用しようと、ちょうどループすることができます...Box2dWebには、オブジェクトのposition.xを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 
    }; 

答えて

5

OKを試してみてください。すばやく、シカゴのJer Inの返信にも感謝したかったので、ありがとう。とにかく答え:

あなたがそうのようなあなたの世界にあなたのオブジェクトを追加したら、次のようにあなたがオブジェクトの値をつかむことができる

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

は(私の場合、それはcrateBodyです):

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

他人に役立つことを願っています!

+1

実際には、 'CreateBody'は' c2Body'を返すべきです、 'crateBody.GetPosition()。x' – sntran

+0

によって位置を得ることができます.CreateBody()はb2body、.CreateBody()を返しますが、CreateFixture b2fixture、メソッドGetPosition()を持たない – OneThreeSeven

2

OK]をクリックして、Box2dWebためのAPI /ドキュメントを見つけることができませんでしたので、私は、ソースをダウンロードして体が位置を持つべきであることを確認しました世界にあるすべての身体を通して、私たちが指導線を印刷できるかどうかを見てみましょう。幸運を祈る!

編集:ので、具体的Box2DWebための任意の実際のドキュメントの欠如への感謝が、私はこれを最終的に把握ませんでした。この

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

返信いただきありがとうございました。私はあなたが言ったことをして、私は "crateBody.position is undefined"と表示される同じmsgを取得します。奇妙なのは、私が "console.log( '箱が' + crateBody 'に位置している)ならば、私は "オブジェクトがそこにあることを意味するconsole.logの" [オブジェクトオブジェクト]に位置しています "が表示されますが、"位置 "の値が見当たりません。この問題は私をナットにしている。しかし、私はあなたの助けに感謝し、それは私の神経を静かにするのに役立ちました。 – Stankyfist

+0

ahh、おそらくcrateBody.GetPosition.xまたはcrateBody.GetPosition()。x –

+0

Hey Jer同じメッセージの兄弟: 'crateBody.GetPosition.x undefined'と' crateBody.GetPosition()。x undefined'これは、ポートの問題やそれがうまくいくはずです。私を助けてくれてありがとう、もう一度ありがとう。 – Stankyfist

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

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

又は

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

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

又は

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

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

ここで、(0,0)ローカル座標で本体の中心の座標です。 GetWorldPoint関数はWorld Coordinatesでそれを変換します。

+0

Box2dWebチュートリアルについては、http://adf.ly/FDbTHを参照してください。 – Shekhar

0

私はBox2dWebで同様の問題を扱っていました。この質問を投稿していただきありがとうございます。 @ JerinChicagoのヒントを使用して、私は解決策を見つけました。

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

これが役立ちます。

関連する問題