0

アプリで Box2D と Cocos2D を使用しています。そのため、私のアプリでは、人々が反対することを推奨しているにもかかわらず、ボディが私の CCSprites に従うようにしています。また、衝突検出にはBox2D のみを使用するため、ボディをスプライトにアタッチし、b2ContactListener のみを使用します。とにかく、このセットアップは、この小さな問題を除いてほとんどの部分で機能します。

したがって、私の体はゲーム ループで次のようにスプライトに従います。

for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {
        if (b->GetUserData() != NULL) {
            CCSprite *sprite = (CCSprite *)b->GetUserData();
                b2Vec2 b2Position = b2Vec2(sprite.position.x/PTM_RATIO, sprite.position.y/PTM_RATIO);
                float32 b2Angle = -1 * CC_DEGREES_TO_RADIANS(sprite.rotation);
                b->SetTransform(b2Position, b2Angle);
        }
    }

また、次のように b2World を作成します (違いがある場合):

world = new b2World(b2Vec2(0.0f, 0.0f));
world->SetAllowSleeping(NO);
_contactListener = new MyContactListener();
world->SetContactListener(_contactListener); 

この問題は、私の CCSprite が衝突するたびに (技術的には私の b2Body も衝突している)、各 CCSprite の b2Body は小さな力が当たったかのように少し動くように見えるため、意味がある場合は「反動」があります。力が関係していなくても、ヒットが発生すると、それらは互いに遠ざかります。

もう 1 つの例は、私の体の 1 つが別の体の上に座っている場合です。立っている体は、私がその端にいるときに少し傾いているように見えます。これは、スプライトを傾けていないため、奇妙です。

最後に、私の体はスプライトがその瞬間にどこにいるのか少し遅れているように見えます。それがこの問題に関連しているかどうかはわかりませんが、とにかくこれが起こる理由はありますか? ボディが力の影響を受けず、衝突のみに使用されるようにする方法はありますか?

ありがとう!

4

1 に答える 1

3

次のゲーム ティックで b2transforms を強制的にスプライトの位置/角度と同期させると、ボディは衝突時に衝突応答をトリガーしていると考えられます。

衝突検出のためだけに Box2D を使用しているため、フィクスチャ定義のisSensorプロパティを true に設定しましたか?

b2FixtureDef shapeDef;
shapeDef.isSensor = true;

フィクスチャをセンサーとして特別にマークすることにより、物理的に何かと衝突することはありませんが、ボディのオーバーラップが発生すると、コンタクト リスナーを介して通知されます。

于 2012-11-13T05:02:02.883 に答える