你如何在emscripten中迭代Box2D的尸体列表?

时间:2014-02-09 05:33:17

标签: javascript box2d emscripten

我正在使用Box2D的emscripten端口:https://github.com/kripken/box2d.js

它运行良好,但我在与emscripten交互时遇到了一些麻烦。

具体来说,我在这样的循环中执行模型显示同步:

function step() {
    world.Step(1/60);
    var body = this.world.GetBodyList();
    while(body != null) {
        readGeometry(body, body.data);
        body = body.GetNext();
    }
}

......但这似乎不起作用。尽管C ++代码在body对象的链表的末尾返回NULL,但body.GetNext()(cpp中的返回类型是b2Body *)绝不是本机javascript null。

我也试过了:

body != Box2D.NULL

然而,这也是不对的。我猜emscripten正在返回一个包装指针,我必须对它进行一些特定的操作来测试'nullness'。

检查返回的对象我可以看到空值中的'指针'值为零,我可以使它适用于:

function step() {
    world.Step(1/60);
    var body = this.world.GetBodyList();
    while(body.a != 0) { // <--------------- This hack
        readGeometry(body, body.data);
        body = body.GetNext();
    }
}

因此,显然可以测试NULL-ness,但我找不到任何关于如何做的文档。

2 个答案:

答案 0 :(得分:3)

试试这个

function step() {
  world.Step(1/60);
  var body = this.world.GetBodyList();
  while(Box2D.getPointer(body)) { // <-- will equal 0 for a Box2D.NULL object
    readGeometry(body, body.data);
    body = body.GetNext();
  }
}

我知道这个问题真的很老但我最近遇到了这个问题并在github找到了解决方案。

答案 1 :(得分:0)

接受的答案不起作用,但确实如此:

var next = World.m_bodyList;
var current;
while (next != null) {
    current = next; next = next.m_next;
    if(current.m_userData){
        var current_body = {};
        current_body.x = current.m_xf.position.x;
        current_body.y = current.m_xf.position.y
    }
}