0

私のテスト環境:

Xcode 4.6、新しい cocos2d-x+box2d プロジェクト cocos2d-2.1beta3-x-2.1.1 PhysicsEditor 1.0.10

簡単にするために、PhysicsEditor cocos2dx demo の HelloWorldScene を少し変更しました。コードの一部を次に示します。

  1. initPhysics

    重力.セット(0.0f, 0.0f);

スプライトが動かないように。

  1. ccTouchesEnded 内のソース コードを次のように置き換えます。

    CCTouch* pTouch = (CCTouch *)touches->anyObject();

    CCPoint の場所 = pTouch->locationInView(pTouch->view());

    CCPoint convLoc = CCDirector::sharedDirector()->convertToGL(場所);

    b2Vec2 v = b2Vec2(convLoc.x/PTM_RATIO, convLoc.y/PTM_RATIO);

    for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {

    b2Fixture *f = b->GetFixtureList(); // get the first fixture
    CCSprite *sprite =(CCSprite *) b->GetUserData();
    
    if(sprite != NULL)
    {
        if(f -> TestPoint(v))
        {
            CCLog("You touched a body %d",sprite->getTag());
        }
    }
    

    }

問題は、TestPoint が (形状領域全体ではなく) 非常に小さな領域でのみ true を返すことです。

スクリーンショットは次のとおりです。

ここに画像の説明を入力

この問題をデバッグする方法を誰かが提案できますか? ありがとう

更新: PhysicsEditor から生成されたデータを表示

ここに画像の説明を入力

4

1 に答える 1

5

問題は、最初のフィクスチャのみをプローブすることです。しかし、複雑な体はいくつかから作られています。その理由は、

  • Box2d では、フィクスチャごとに 8 つの頂点しか許可されません
  • Box2d は凸形状でのみ機能します

これが、複雑な形状が多角形のリストに分解される理由です。

代わりに、フィクスチャ リストを反復処理します。

b2Fixture *f = body->GetFixtureList();
while(f)
{
    if(f -> TestPoint(v))
    {
        CCLog("You touched a body %d",sprite->getTag());
    }
    f = f->GetNext();            
}  
于 2013-03-15T07:13:08.623 に答える