使用Box2D 2.2.0,我正在使用Box2D开发游戏。玩家射击AABB。在每一步()中,我通过b2World->QueryAABB(&queryCallback,AABB)移动AABB并处理冲突。然而,我的游戏世界是由链条形状组成的。所以b2World->QueryAABB只检测倾斜链形状的AABB。因此,我现在的目标是从ReportFixture()中获取子索引,这样我就可以根据链形状的指定边缘测试AABB。
我发现:http://www.box2d.org/forum/viewtopic.php?f=3&t=8902
在那篇文章之后,我将子索引添加到ReportFixture中,如下面的代码所示。
我的问题是,当我返回childIndex时,它总是沿着-1082069312、-1053558930、-1073540884的线。
//in b2WorldCallbacks.h
class b2QueryCallback
{
public:
virtual ~b2QueryCallback() {}
/// Called for each fixture found in the query AABB.
/// @return false to terminate the query.
virtual bool ReportFixture(b2Fixture* fixture, int32 childIndex) = 0;
};
和
//in b2World.cpp
struct b2WorldQueryWrapper
{
bool QueryCallback(int32 proxyId)
{
b2FixtureProxy* proxy = (b2FixtureProxy*)broadPhase->GetUserData(proxyId);
return callback->ReportFixture(proxy->fixture, proxy->childIndex);
}
const b2BroadPhase* broadPhase;
b2QueryCallback* callback;
};
这是我的b2QueryCallback:
class MyQueryCallback : public b2QueryCallback {
public:
vector<b2Fixture*> foundFixtures;
vector<int32> foundIndex;
bool ReportFixture(b2Fixture* fixture, int32 childIndex) {
foundFixtures.push_back ( fixture );
foundIndex.push_back( childIndex );
return true;
}
};
在试验台上:
// PolyShapes.h, line 85
bool ReportFixture(b2Fixture* fixture, int32 childIndex)
和
//Test.cpp, line 113
bool ReportFixture(b2Fixture* fixture, int32 childIndex)
看起来你做的每件事都是正确的。我的怀疑是,您的项目的一部分没有使用新修改的头进行完全的重新编译,因此ReportFixture的第二个参数甚至没有被传递。也就是说,调用代码仍然使用该函数的原始单参数版本,因此childIndex从未被推送到调用堆栈上。
你在用Xcode吗?当您有预编译的头文件时,Xcode非常擅长搞砸这一点——它根本无法检测到它们何时需要刷新。除了清理和重建,你还可以尝试删除"派生数据"——这是苹果公司的另一个好主意,我相信这是出于善意,但实施起来似乎很仓促。显然,将删除"派生数据"的选项与"生成"one_answers"清理"选项放在一起太明显了,所以你可以在"管理器"窗口的"项目"选项卡中找到它<咆哮>