【cocos2dx】CCArray(配列)のオブジェクトを取り出す方法

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()を利用すると、オブジェクトが削除された瞬間に、配列の順番が変わってしまうので、正しくオブジェクトを取り出すことができないからです。

0801

このような不具合を防ぐためにも、配列を逆から取り出すという手段が必要となるのです。 個人的にもかなりハマったしまったことなので、配列のオブジェクトを削除する際には気をつけてください。