我希望能够识别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标记损坏的瓶子。有没有办法做到这一点?因为当我尝试添加两个标签时它会失败。
答案 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;
因此,计算kTagValueBottle
和kTagValueBroken
的按位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快速找到的最有用的文章,尽管这可以从细长的选择中获得。