在Cocos2d中,是否可以为单个对象使用多个标签?

时间:2011-09-15 15:58:52

标签: iphone objective-c ios cocos2d-iphone

我希望能够识别CCSpriteBatchNode的一组对象,但也能识别该组的子组。做类似的事情

CCArray *listOfGameObjects = [sceneSpriteBatchNode children]; 

for (GameObject *tempObject in listOfGameObjects) { 

    if ([tempObject tag] == kBottleTagValue) {

          //make bottle yellow

          if ([tempObject tag] == kBrokenBottleTagValue) {
               //also make bottle smaller
          }
     }
}

在这个例子中,所有瓶子都会变成黄色,如果瓶子也被标记为破碎,那么它就会变小​​。因此需要使用kBottleTagValue和kBrokenBottleTagValue标记损坏的瓶子。有没有办法做到这一点?因为当我尝试添加两个标签时它会失败。

3 个答案:

答案 0 :(得分:5)

是的,你可以使用位掩码来做到这一点。 例如,像这样定义你的标签:

enum
{
   kBottleTagValue = 1 << 0;
   kBrokenBottleTagValue = 1 << 1;
};

然后标记你的精灵:

[yoursprite setTag:kBottleTagValue|kBrokenBottleTagValue];

要完成,您可以通过执行以下操作来检查您的精灵是否是破碎的瓶子:

CCArray *listOfGameObjects = [sceneSpriteBatchNode children]; 
for (GameObject *tempObject in listOfGameObjects)
{ 
    if ([tempObject tag] & kBottleTagValue)
    {
          //make bottle yellow
          if ([tempObject tag] & kBrokenBottleTagValue)
          {
               //also make bottle smaller
          }
     }
}

我希望它会对你有所帮助。

答案 1 :(得分:2)

使用bitmasking是过度的,不需要滥用标记属性。

说到属性:您可以在类中添加布尔属性,并使用if ([tempObject isClass:[BottleClass class]])作为第一个逻辑门。

答案 2 :(得分:1)

我实际上并不知道Cocos2d,但基于快速阅读,我猜你从GameObject以任何迂回路线降落CCNode?在这种情况下,tag字段是整数。您不能存储多个值,但可以将其用作位字段。例如:

#define kTagValueBottle           0x0001
#define kTagValueBroken           0x0002
#define kTagValueAnotherAttribute 0x0004
#define kTagValueAThirdAttribute  0x0008
#define kTagValueAFourthAttribute 0x0010
/* etc */

然后您将类型指定为,例如:

object.tag = kTagValueBottle | kTagValueBroken;

因此,计算kTagValueBottlekTagValueBroken的按位OR,并将其存储为新标记。您也可以使用按位OR:

随时添加属性
object.tag |= kTagValueBroken;

或者使用带反向掩码的按位AND删除:

object.tag &= ~kTagValueBroken;

您可以通过按位AND测试单个位来替换直接比较测试:

// if ([tempObject tag] == kBottleTagValue) // old test
if ([tempObject tag] & kBottleTagValue) // new test

这与Apple在autoresizingFlags上用于UIView等属性的系统相同。

如果您可以使用PHP而不是Objective-C来处理示例代码,那么seemed是我可以通过Google快速找到的最有用的文章,尽管这可以从细长的选择中获得。