我最近在一个长期运行的项目中将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似乎可行,但我不知道为什么。

最佳答案

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

链形状的功能实际上是由多个b2EdgeShapes完成的,并且链形状本身可以看作是组织这些边缘形状“子级”的辅助工具。它分配内存,为您设置重影顶点,并将诸如碰撞检查之类的事情委托(delegate)给边缘形状。

如果您不针对链形投射光线,则可以将其保留为零。如果是这样,可以使用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函数将更容易,更高效:)

关于iphone - box2d raycast向后兼容性问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11385100/

10-09 20:14