如何获得当前CCSprite的b2Body

时间:2013-07-19 16:23:09

标签: cocos2d-iphone box2d ccsprite user-data

在我的代码中,我一直使用spriteA = (__bridge CCSprite *) bodyA->GetUserData(); //where spriteA is a CCSprite and bodyA is a b2Body.我用它来获取与bodyA相关联的精灵。我的问题是,我该怎么做呢?我有一个精灵,我想知道b2Body与它有什么联系。我该怎么做?

修改

我不知道我是否正确设置它,但是我试图在没有更多蓝色对象(row4BlueArray中的对象)中删除名为row4的数组中的所有b2bodies(和sprite) 以下是我的tick方法中代码的一部分:

//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)`
                }

            }
        }

1 个答案:

答案 0 :(得分:0)

一种简单的方法是将主体缓存为类的属性。

您可以使用名为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。

希望这有帮助