您如何在 emscripten 中迭代 Box2D 中的实体列表?

Posted

技术标签:

【中文标题】您如何在 emscripten 中迭代 Box2D 中的实体列表?【英文标题】:How do you iterate over the list of bodies from Box2D in emscripten? 【发布时间】:2014-02-09 05:33:16 【问题描述】:

我从这里使用 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 性,但我找不到任何有关如何执行此操作的文档。

【问题讨论】:

【参考方案1】:

试试这个

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 上找到了解决方案。

【讨论】:

【参考方案2】:

接受的答案无效,但确实有效:

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
    

【讨论】:

以上是关于您如何在 emscripten 中迭代 Box2D 中的实体列表?的主要内容,如果未能解决你的问题,请参考以下文章

Emscripten - 如何将我的makefile与emcc一起使用而不是gcc?

如何使用 emscripten 生成独立的 WebAssembly

Lua/Box2D:在一个方向上应用速度

如何结合Box2d的身体?

您是不是必须释放传递给 Emscripten 中导出的 C 函数的字符串?

为没有Box2D的libgdx Actors实现冲突检测