0

表示可能領域の周囲に境界線を作成しています。この領域内で、衝突検出用にセンサーが有効になっている他のフィクスチャを作成しています。isSensor = true のフィクスチャがウィンドウの境界を通過するようです。どうすればこれを防ぐことができますか? ありがとう!

    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
    b2Body *body = world->CreateBody(&bodyDef);

    // Define another box shape for our dynamic body.
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box

    // Define the dynamic body fixture.
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox; 
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    fixtureDef.isSensor = true; //causes fixtures to fall through border
    body->CreateFixture(&fixtureDef);

ウィンドウ境界:

 CGSize screenSize = [CCDirector sharedDirector].winSize;
 float widthInMeters = screenSize.width / PTM_RATIO;
 float heightInMeters = screenSize.height / PTM_RATIO;
 b2Vec2 lowerLeftCorner = b2Vec2(0, 0);
 b2Vec2 lowerRightCorner = b2Vec2(widthInMeters, 0);
 b2Vec2 upperLeftCorner = b2Vec2(0, heightInMeters);
 b2Vec2 upperRightCorner = b2Vec2(widthInMeters, heightInMeters);

b2BodyDef screenBorderDef;
screenBorderDef.position.Set(0, 0);
b2Body* screenBorderBody = world->CreateBody(&screenBorderDef);
b2EdgeShape screenBorderShape;

screenBorderShape.Set(lowerLeftCorner, lowerRightCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(lowerRightCorner, upperRightCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(upperRightCorner, upperLeftCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
screenBorderShape.Set(upperLeftCorner, lowerLeftCorner);
screenBorderBody->CreateFixture(&screenBorderShape, 0);
4

2 に答える 2

1

isSensore false にして、PostCollision メソッドで衝突をチェックします。

于 2013-11-15T06:05:57.230 に答える
0

1 つの方法は、センサーが取り付けられている本体に 2 つ目のフィクスチャを追加し、境界とのみ衝突するように衝突フィルターを設定することです。コリジョン フィルタ設定がどのように使用されるかについて少し学ぶ必要があり、最初は少し難しいかもしれません。これは役立つかもしれません: http://www.iforce2d.net/b2dtut/collision-filtering

デフォルトでは、カテゴリ ビット値は 1 であるため、何も変更しない限り、シーン内のすべてのフィクスチャはカテゴリ 1 になります。境界線と他のフィクスチャを区別するには、それらに異なるカテゴリを指定する必要があります。グランド フィクスチャ カテゴリ 2 を作成するとします。

screenBorderFixtureDef.filter.categoryBits = 2;

mask のデフォルト値は 0xFFFF であるため、カテゴリがこのように変更された場合でも、既存のフィクスチャはすべて以前と同様に境界線と衝突します。次に、新しく追加された 2 番目のフィクスチャが境界線以外をすべて無視するようにするには、境界線のみと衝突するようにマスクを設定します。

fixtureDef.filter.maskBits = 2;


もう 1 つの方法は、既存のセンサー フィクスチャをセンサーではなく、境界と衝突させることです。しかしもちろん、それは他のすべてのものとも衝突します。コンタクト リスナーの PreSolve コールバックを使用して、特定のコンタクトが衝突応答を行うべきではないことを示すことができます。

//in PreSolve
if ( this is NOT a contact between border and sensor )
    contact->SetEnabled( false );
于 2013-11-15T01:40:49.167 に答える