2012-02-22 3 views
5

Tôi nghĩ rằng có một câu trả lời đơn giản cho câu hỏi dường như đơn giản của tôi nhưng tôi có thể hoàn toàn sai. Dù sao tôi mới vào box2dWeb và trong thế giới Box2dWeb của tôi, tôi tạo ra một tầng và một đối tượng rơi đơn giản. Khi tôi "gỡ lỗi vẽ" vào vải của tôi, tôi thấy hộp rơi xuống và mọi thứ. Tất cả tôi muốn làm là đầu ra x vị trí của đối tượng rơi tôi tạo ra vào console.log trình duyệt và nó không hoạt động khá đúng. Console.log chỉ hiển thị vị trí bắt đầu của đối tượng của tôi nhưng số không cập nhật ngay cả khi đối tượng của tôi trong canvas đang rơi. Sau nhiều giờ tìm kiếm với nhiều công cụ tìm kiếm, và những nơi như hướng dẫn Seth Ladds tôi đã trống rỗng. Tôi hy vọng một người nào đó ở đây có thể giúp đỡ. Tôi đã cung cấp một số mã mẫu để giúp giải thích cho bản thân mình tốt hơn một chút. Hy vọng nó giúp. Cảm ơn tất cả những người trả lời.Có cách nào trong Box2dWeb xuất vị trí.x của một đối tượng đến console.log() không?

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 
    }; 

Trả lời

5

OK vì vậy không nhờ vào sự thiếu của bất kỳ tài liệu hướng dẫn thực đặc biệt cho Box2DWeb tôi cuối cùng con số này ra. Một cách nhanh chóng tôi cũng muốn cảm ơn Jer In Chicago đã trả lời, vì vậy cảm ơn anh trai. Dù sao câu trả lời:

khi bạn thêm đối tượng của bạn đến với thế giới của bạn như vậy:

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

bạn có thể lấy giá trị của đối tượng của bạn (trong trường hợp của tôi nó là crateBody) như sau:

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

Hy vọng điều này sẽ giúp người khác!

+1

Thực ra, 'CreateBody' sẽ trả về' b2Body', bạn có thể lấy vị trí bằng 'crateBody.GetPosition(). X' – sntran

+0

Trong khi .CreateBody() trả về một b2body, .CreateBody(). CreateFixture() trả về một b2fixture, không có phương thức GetPosition() – OneThreeSeven

2

Ok, không thể tìm thấy một api/doc cho Box2dWeb, vì vậy tôi đã tải về nguồn và đã xác nhận rằng cơ thể nên có một vị trí ... thay vì cố gắng sử dụng var crateBody, cho phép chỉ là vòng lặp thông qua tất cả các cơ quan trên thế giới và xem liệu chúng ta có thể in coords của họ ... Chúc may mắn!

Edit: Hãy thử điều này

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

Xin cảm ơn Jer đã trả lời. Tôi đã làm những gì bạn nói và tôi nhận được cùng một msg hiển thị như "crateBody.position là không xác định". Điều kỳ lạ là nếu tôi "console.log ('thùng được đặt tại' + crateBody);" Tôi nhận được "thùng được đặt tại [đối tượng Object]" trong console.log có nghĩa là đối tượng là có nhưng có vẻ như giá trị "vị trí" là mất tích. Vấn đề này đang khiến tôi phát điên. Tuy nhiên tôi đánh giá cao sự giúp đỡ của bạn vì nó đã giúp tôi bình tĩnh lại một chút. – Stankyfist

+0

ahh, có thể crateBody.GetPosition.x hoặc crateBody.GetPosition(). X –

+0

Xin chào Jer same msg brother: 'crateBody.GetPosition.x undefined' và' crateBody.GetPosition(). X undefined' Tôi không biết nếu điều này là vì của một vấn đề cổng hoặc những gì nhưng nó sẽ làm việc. Cảm ơn một lần nữa vì đã cố gắng giúp tôi. – Stankyfist

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

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

hoặc

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

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

hoặc

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

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

đâu (0,0) là tọa độ của trung tâm của cơ thể trong tọa độ địa phương. Chức năng GetWorldPoint chuyển đổi nó trong các tọa độ trên thế giới.

+0

Đối với hướng dẫn Box2dWeb, hãy truy cập http://adf.ly/FDbTH – Shekhar

0

Tôi đã gặp sự cố tương tự khi làm việc với Box2dWeb. Cảm ơn bạn đã đăng câu hỏi này. Sử dụng mẹo @JerinChicago tôi đã tìm ra giải pháp.

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

Tôi hy vọng điều này sẽ hữu ích.