1

私のコードspriteA = (__bridge CCSprite *) bodyA->GetUserData(); //where spriteA is a CCSprite and bodyA is a b2Body.では、bodyA にリンクされているスプライトを取得するために常に使用しています。私の問題は、どうすればこれを逆に行うことができるかということです。スプライトがあり、それにリンクされている b2Body を知りたいです。どうすればいいですか?

編集

正しく設定したかどうかはわかりませんが、青いオブジェクト (row4BlueArray 内のオブジェクト) がなくなったら、row4 という配列内のすべての b2bodies (およびスプライト) を削除しようとしています。私のティックメソッドで:

//Find the sprite for the b2Bodies
 else if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
        spriteA = (__bridge CCSprite *) bodyA->GetUserData();
        spriteB = (__bridge CCSprite *) bodyB->GetUserData();
        contactPositionX = spriteA.position.x;
        contactPositionY = spriteB.position.y;
        //If sprite is a member of row 4 (tag 400)
        if (spriteA.tag == 400 && spriteB.tag == 8)
        {
            [self createExplosionBlue];
            [self addTileScore];
            [self removeChild:spriteA cleanup:YES];
            [self removeChild:spriteB cleanup:YES];
            NSLog(@"row 4 count: %d",row4BlueArray.count);
            //Remove object from another array
            [row4BlueArray removeLastObject];
            toDestroy.insert(bodyA);
            toDestroy.insert(bodyB);
            [self unschedule:@selector(tick:)];
            ballCount = 0;
            //if that array is empty, then remove all objects from this array (row4)
            if (row4BlueArray.count == 0) {
                for (b2Body * b = _world->GetBodyList(); b != NULL; b = b->GetNext()) {
                    Box2DSprite * sprite = (__bridge Box2DSprite*) b->GetUserData();
                    b2Body * spriteBody = sprite.body;
                    //not sure how to remove all bodies in an array (row4)`
                }

            }
        }
4

1 に答える 1

0

これを行う簡単な方法の 1 つは、本体をクラスのプロパティとしてキャッシュすることです。

Box2DSprite というクラスを使用して CCSprite クラスを拡張できます。Box2DSprite では、スプライトの物理演算を作成するために使用した b2Body * のプロパティを含めます。必要になると思われる場合は、ワールドへの参照を保存することもできます。

@interface Box2DSprite : CCSprite {


b2Body * body;
b2World * world;

} // end ivars

@property (readwrite) b2Body * body;
@property (readwrite) b2World * world;

また、.m ファイルの名前を .mm ファイルに変更することを忘れないでください

編集

ゲーム ループで Box2DSprite を取得するには、Box2DSprite にキャストするだけです。

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

    Box2DSprite * sprite = (__bridge Box2DSprite*) b->GetUserData();
    b2Body * spriteBody = sprite.body;
    // Do stuff with body here
}

物理ボディを持つスプライトを作成するときは常に、Box2DSprite を作成していることを確認する必要があります。

お役に立てれば

于 2013-07-19T16:30:27.327 に答える