box2d光线投射向后兼容问题

时间:2012-07-08 17:22:18

标签: iphone c++ box2d

我最近在一个长期运行的项目中将box2d的版本升级到v2.2.1,并且它导致了许多与现有项目代码的向后兼容性问题。大多数人都被解决了,除了这个

b2Fixture *f = body->GetFixtureList();
b2RayCastOutput output;
b2RayCastInput input;
f->RayCast(&output, input) // broken call

现在已经破了,期待第三个参数。我在box2d源代码中看到函数签名是

inline bool b2Fixture::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, int32 childIndex) const;

但我找不到childIndex应该是什么的任何例子。有人可以举例说明如何使用这个更新的RayCast函数吗?

编辑:我注意到将childIndex设置为0似乎有效,但我不知道为什么。

1 个答案:

答案 0 :(得分:2)

此参数仅与b2ChainShape灯具有关。对于其他形状类型,它只是符合虚函数签名。

链形状的功能实际上是由多个b2EdgeShapes完成的,链形状本身可以被认为是组织这些边缘形状“儿童”的帮手。它为你分配内存,设置鬼顶点,并将诸如collsion检查之类的东西委托给边缘形状。

如果你没有对链形状投射光线,你可以将其保留为零。如果是,您可以使用b2ChainShape的这些函数来针对每个子边缘投射光线:

int32 GetChildCount() const;
void GetChildEdge(b2EdgeShape* edge, int32 index) const;

其中第二个用作:

b2EdgeShape edgeShape;
chainShape->GetChildEdge(&edgeShape, 123);

首先需要将形状转换为b2ChainShape *:

if ( e_chain == fixture->GetType() ) {
    b2ChainShape* chainShape = (b2ChainShape*)fixture->GetShape();
    ....
}

...使用b2World的RayCast功能会更容易,更有效:)