読者です 読者をやめる 読者になる 読者になる

apressのcocos2d本を読む - 第4章のメモ

iOS cocos2d

apressの"Learn iPhone and iPad cocos2d Game Development"を読みながらcocos2dを勉強していくメモ。今日は第4章。この章は、加速度センサーを使ってプレーヤーを動かし上から落ちてくるクモを避けるというゲームを作っていきながら、cocos2dプロジェクトでのクラスやメソッドの追加の仕方を学習していくという内容になっている。画面イメージはこんな感じ。

書籍に乗っているコードだけではとりあえず動きましたって程度の動きしかしないが、サポートサイトで配布されているサンプルコードはなかなかそれっぽい動きをするので面白い。

CCRANDOM_0_1

第4章だけではないが、この本のサンプルではCCRANDOM_0_1というマクロを使っている箇所が多々ある。これは名前の通り、0から1までのランダムな数値(float)を返すマクロで、ccMacro.hに定義されている。

/** @def CCRANDOM_0_1
 returns a random float between 0 and 1
 */
#define CCRANDOM_0_1() ((random() / (float)0x7fffffff ))

ラジアンと度を変換するマクロ

ccMacro.hには結構理にかなったマクロが定義されているなぁと見ていたら、やはりあると思っていた、ラジアンから度、度からラジアンに変換するマクロも定義されていた。まあ、当然ありますよね。

/** @def CC_DEGREES_TO_RADIANS
 converts degrees to radians
 */
#define CC_DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) * 0.01745329252f) // PI / 180

/** @def CC_RADIANS_TO_DEGREES
 converts radians to degrees
 */
#define CC_RADIANS_TO_DEGREES(__ANGLE__) ((__ANGLE__) * 57.29577951f) // PI * 180

CCArray

サンプルコードでは、複数のCCSpriteを管理するのにNSArrayやNSMutableArrayではなく、CCArrayというcocos2dが定義するクラスを使っている。インターフェイスを引用するのは省略するけど、NSArrayとほとんど同じく使えるんじゃないかな。わざわざ独自のArrayクラスを定義しているのはパフォーマンスを追求してという理由らしい。

ccArray is a faster alternative to NSMutableArray, it does pretty much the
same thing (stores NSObjects and retains/releases them appropriately). It's
faster because:
- it uses a plain C interface so it doesn't incur Objective-c messaging overhead
- it assumes you know what you're doing, so it doesn't spend time on safety checks
(index out of bounds, required capacity etc.)
- comparisons are done using pointer equality instead of isEqual

CCArrayの要素はCCARRAY_FOREACHを使って次のように列挙できる。

CCNode* node;
CCARRAY_FOREACH([self children], node) {
    [node stopAllActions];
}

コードも見てみたがわざわざ車輪の再発明っぽいことをやる必然性があったのかどうかは判断できない。