我最近在一个长期运行的项目中将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似乎有效,但我不知道为什么。
答案 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功能会更容易,更有效:)