cocos2dアプリ開発 – タグの使い方.
前回、アクションの部分でタグの話が少し出たので、この際に書いておきます。
cocos2dではスプライトなどのノードオブジェクトや、アクションオブジェクトにタグを付けておくことができます。そして、そのタグを使って、他のメソッドやクラス内でそのオブジェクトを呼だし、使うことができるようになっています。
したがって、他のクラスやオブジェクトで使うために、わざわざインスタンス変数として持っておく必要がありません。
タグの付け方
タグを付ける際は次のような構文で指定します。
/*ノードにタグをつける*/ [self addChild:(CCNode *) z:(NSInteger) tag:(NSInteger)]; //or circle1.tag = (NSInteger); /*アクションにタグを付ける*/ CCMoveTo* move = [...]; move.tag = (NSInteger);
cocos2dのtagは文字列でなく、NSInteger型です。つまり整数です。上のcircle1に1番というタグを付けるときは「circle1.tag = 1;」のように記述します。
ノードにタグ付けする際はaddChildするときか、ノードを作成後に直接’tag’プロパティに代入します。アクションの時も同じように’tag’プロパティに記述します。
次は逆に、タグを使ってオブジェクトを参照する方法です。次の様なメソッドが用意されています。
[self getChildByTag:(NSInteger)]; [self getActionByTag:(NSInteger)]; [self stopActionByTag:(NSInteger)];
一つ目はノードの参照です。CCNode*型を返します。残りの2つはアクションの参照です。CCAction*型を返します。
前回説明した、アクションをストップする方法もこのメソッドを使っています。
例えば、先ほど1番に指定した’circle1′を他のメソッドで参照する場合は、次のように記述することで参照できます。’self’はcircle1を子ノードに持つ親ノードです。
CCSprite* circle = (CCSprite*)[self getChildByTag:1];
この時「getChildByTag:」メソッドはCCNode型を返します。circleをCCSpriteとして扱いたいときは上記のようにキャストでCCSprite型に変換してやれば大丈夫です。
複雑なプログラム中でのタグ付け
プログラムが複雑になりオブジェクトの数が増えてくると、タグを管理しきれなくなり、重複してしまう可能性が出てきます。
そのようなときに用いる手法として一般的なのが列挙型enumを用いたタグの列挙です。
Objective-Cでは定数のリストを定義することができる特別な変数enumがあります。定義の仕方はいろいろあるようですが以下の様な文で定義できます。
typedef enum nodeTags { Circle, Square, Triangle, } tag;
インターフェース部や実装部の外側で定義してやります。中の3つのリストCircle、Square、Triangleが定数となり、0、1、2…と整数が順番に割り当てられます。’nodeTags’は型名です。”#define”でいうマクロ名に当たる部分です。’tag’は定数を操作する変数です。型名、変数ともに省略可能です。
通常、enumを使用するときは以下のように記述します。
enum nodeTags tag = Circle; NSLog(@"tag %d", tag); tag = Square; NSLog(@"tag %d", tag); tag = Triangle; NSLog(@"tag %d", tag);
1行目でどのタイプのenumかを定義し、変数tagにCircleに割り当てられている整数を入れています。その後は順番に定数リストを表示指定ます。
出力は0、1、2になります。
これをcocosで使う場合は、次のように書きます。
/*ノードを追加するとき*/ [self addChild:circle1 z:0 tag:Circle]; /*追加したcircle1を他の場所で参照するとき*/ CCSprite* circle = (CCSprite*)[self getChildByTag:Circle];
ノードを追加するときにtagとしてCircleを割り当てておきます。そして、次にそれを参照したいときに、同じCircleというタグで呼び出してやれば、circle1を扱うことができます。列挙型の型名や変数を気にする必要はあまりありません。
このように列挙子でタグを管理してやることで、複雑なプログラムになっても、安全にキレイにプログラムを書くことができます。