2011-09-15 11 views
0

私は、CCSpriteBatchNodeのオブジェクトのグループを特定できるだけでなく、そのグループのサブグループを特定できるようにしたいと考えています。例では、このCocos2dでは、単一のオブジェクトに複数のタグを使用できますか?

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というタグを付ける必要があります。これを行うには離れていますか?なぜなら2つのタグを追加しようとすると失敗するからです。

答えて

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

私はCocos2dを実際には知りませんが、急速な読書に基づいて、GameObject、どんなロータリールートによって降伏したと思いますか?CCNode?その場合、tagフィールドは整数です。複数の値を格納することはできませんが、ビットフィールドとして使用できます。あなたはその後、例えば、としてタイプを割り当てると思います

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

:たとえば

object.tag = kTagValueBottle | kTagValueBroken; 

は、だから、新しいタグとしてビット単位のOR kTagValueBottlekTagValueBroken、および格納のを計算します。

object.tag |= kTagValueBroken; 

またはビット単位を使用することによって、逆マスクを削除します:あなたはまた、ビット単位のORを使用して、いつでもプロパティを追加することができ

object.tag &= ~kTagValueBroken; 

あなたがテストであなたの直接の比較テストを交換したいです個々のビット単位経由のビットAND:

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

これはAppleがUIViewautoresizingFlagsのような性質のために使用するシステムと同じ種類です。

Objective-CではなくPHPでサンプルコードを読むことができるのであれば、このseemedは、細身のピッキングからはわかりますが、Googleをすばやく見つけることができる最も役立つ記事です。

2

ビットマスクの使用は過剰です。タグプロパティを乱用する必要はありません。

プロパティといえば、:クラスにブール値プロパティを追加し、最初のロジックゲートにif ([tempObject isClass:[BottleClass class]])を使用できます。

関連する問題