2012-07-08 76 views
1

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

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似乎工作,但我不知道为什么。

回答

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的光线投射功能:)

+0

谢谢,非常翔实的答案。链接到你如何知道这一点? – 2012-07-10 13:49:38

+0

我对过去的经历有一个粗略的想法,并检查了来源以确认:http://code.google.com/p/box2d/source/browse/#svn%2Ftrunk%2FBox2D%2FBox2D%2FCollision%2FShapes查看我的其他信息的网站:www.iforce2d.net/b2dtut – iforce2d 2012-07-10 14:13:09