2013-07-19 48 views
1

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

编辑

我不知道阉我把它正确与否,但我试图删除所有b2bodies(和精灵)在名为ROW4一旦阵中还有没有更多的蓝色物体(在row4BlueArray对象) 这里是我的蜱方法的代码的一部分:

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

      } 
     } 

回答

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。

希望这可以帮助

+0

这可能工作!那么如何用CCSprite访问b2Body? – evanlws

+0

有可能替代扩展CCSprite。如果你不喜欢这种模式,让我知道,我会尝试拿出别的东西 –

+0

是的,我一直在“Box2dSprite”类型的对象上找不到“Property”主体。在抱歉之前,我从未扩展CCSprite。有没有像我提到的方式? – evanlws