cocos2dxで、配列を利用する際にはCCArrayクラスを利用します。 今回は、この配列(CCArray)から、オブジェクトを取り出す方法を紹介します。
for文
オブジェクトを配列から取り出す際には、for文を利用します。 コードは以下のようになります。
[c]
CCArray *array = CCArray::create();
for(int i = 0; i < array->count(); i++){
CCObject *obj = array->objectAtIndex(i);
CCSprite *sprite = (CCSprite*)obj;
}
[/c]
CCArrayは、CCObjectクラスとして、オブジェクトを取り出すことができません。 その後に、必要とするクラスに変えて利用する必要があります。
便利なマクロ関数
cocos2dxでは、このfor文を利用する時に、便利なマクロ関数が定義されています。 CCARRAY_FOREACH()です。
コードは以下のようになります。
[c]
CCObject *obj = NULL; CCARRAY_FOREACH(array,obj){
CCSprite *sprite = (CCSprite*)obj;
}
[/c]
オブジェクトを、配列に格納された順番とは逆に取り出す
CCArrayクラスは配列です。 先ほどの記述したfor文は、配列に格納された順番のオブジェクトを取り出しています。 この順番を逆から取り出せることができます。
cocos2dxでは、この場合にも便利なマクロ関数があります。 CCARRAY_FOREACH_REVERSE()です。
[c]
CCObject *obj = NULL; CCARRAY_FOREACH_REVERSE(array,obj){
CCSprite *sprite = (CCSprite*)obj;
}
[/c]
逆から取り出す必要のある場面
これは、前回のエントリーにも通じているのですが、配列のfor文の中で、オブジェクトを削除する処理を行う際には、CCARRAY_FOREACH_REVERSE()を利用する必要があります。 通常のように、CCARRAY_FOREACH()を利用すると、オブジェクトが削除された瞬間に、配列の順番が変わってしまうので、正しくオブジェクトを取り出すことができないからです。
このような不具合を防ぐためにも、配列を逆から取り出すという手段が必要となるのです。 個人的にもかなりハマったしまったことなので、配列のオブジェクトを削除する際には気をつけてください。