Есть ли способ в Box2dWeb для вывода position.x объекта в console.log ()? - PullRequest
5 голосов
/ 22 февраля 2012

Я думаю, что есть простой ответ на мой, казалось бы, простой вопрос, но я могу быть совершенно неправ. В любом случае, я новичок в box2dWeb и в своем мире Box2dWeb я создаю пол и простой падающий объект. Когда я "отлаживаю рисование" на своем холсте, я вижу падающую коробку и все. Все, что я хочу сделать, это вывести позицию x падающего объекта, который я создал, в браузер console.log, и он работает не совсем правильно. 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
  };

Ответы [ 4 ]

5 голосов
/ 26 февраля 2012

ОК, так что нет, из-за отсутствия какой-либо реальной документации специально для Box2DWeb, я наконец-то понял это.Вскоре я также хотел поблагодарить Джер Ин Чикаго за его ответы, так что спасибо брат.В любом случае ответ:

как только вы добавите свой объект в свой мир следующим образом:

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());

Надеюсь, это поможет другим!

2 голосов
/ 23 февраля 2012

Хорошо, не удалось найти API / документацию для Box2dWeb, поэтому я загрузил исходный код и подтвердил, что тело должно иметь позицию ... вместо того, чтобы пытаться использовать переменную crateBody, давайте просто пройдемся по всем телам, которыев мире и посмотрим, сможем ли мы напечатать их координаты ... Удачи!

Редактировать: Попробуйте это

// 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 голосов
/ 08 сентября 2013

У меня была похожая проблема при работе с Box2dWeb. Спасибо за размещение этого вопроса. Используя советы @JerinChicago, я нашел решение.

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

Надеюсь, это поможет.

0 голосов
/ 24 ноября 2012
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 преобразует его в мировые координаты.

...