您如何在 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