Box2D:通过报表固定装置获取子索引



使用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"清理"选项放在一起太明显了,所以你可以在"管理器"窗口的"项目"选项卡中找到它<咆哮>

相关内容

  • 没有找到相关文章

最新更新