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

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

iOS cocos2d

apressの"Learn iPhone and iPad cocos2d Game Development"という本を読んでいる。ざっと眺めた感じでは、cocos2dのサイトにあるドキュメントよりは包括的で、ずっと良い参考資料だなという印象がある。apressのサイトからサンプルコードもダウンロードできる。

Learn iPhone and iPad cocos2d Game Development

Learn iPhone and iPad cocos2d Game Development

以下、第3章を読んで知った個人的なメモ。

CCLOGとは?

サンプルプログラムの中でCCLOGというマクロを使っているので、これは何者かを調べてみた。ccMacros.hに以下のような内容で定義されている。

/*
 * if COCOS2D_DEBUG is not defined, or if it is 0 then
 * all CCLOGXXX macros will be disabled
 *
 * if COCOS2D_DEBUG==1 then:
 *    CCLOG() will be enabled
 *            CCLOGERROR() will be enabled
 *                         CCLOGINFO()  will be disabled
 *
 * if COCOS2D_DEBUG==2 or higher then:
 *    CCLOG() will be enabled
 *            CCLOGERROR() will be enabled
 *                         CCLOGINFO()  will be enabled
 */
#if !defined(COCOS2D_DEBUG) || COCOS2D_DEBUG == 0
#define CCLOG(...) do {} while (0)
#define CCLOGINFO(...) do {} while (0)
#define CCLOGERROR(...) do {} while (0)

#elif COCOS2D_DEBUG == 1
#define CCLOG(...) NSLog(__VA_ARGS__)
#define CCLOGERROR(...) NSLog(__VA_ARGS__)
#define CCLOGINFO(...) do {} while (0)

#elif COCOS2D_DEBUG > 1
#define CCLOG(...) NSLog(__VA_ARGS__)
#define CCLOGERROR(...) NSLog(__VA_ARGS__)
#define CCLOGINFO(...) NSLog(__VA_ARGS__)
#endif // COCOS2D_DEBUG

つまり、COCOS2D_DEBUGで定義したデバッグレベルに応じて、

  • CCLOG
  • CCLOGINFO
  • CCLOGERROR

のログ出力を実際に出力するかどうかを制御できるようにしているってわけだな。

scheduleしたメソッドを削除する

schedule:SEL interval:int でスケジュールしたメソッドは、呼び出されたメソッド側で [self unschedule:_cmd]; を呼べば削除できる。

- (void)scheduleUpdates
{
    [self schedule:@selector(doSomething:) interval:1];
}

- (void)doSomething:(ccTime)delta
{
    [self unschedule:_cmd];
}

Anchor Pointを変更する

nodeのデフォルトのanchorPointは(0.5, 0.5)だが次のようにすれば、(0, 0)にも変更できる。次のコード例ではspriteは左下の隅に配置される。

CCSprite* sprite = [CCSPrite spriteWithFile:@"Default.png"];
sprite.anchorPoint = CGPointMake(0, 0);
[self addChild:sprite];

ただし、

もし自分が親しんできた別のゲームエンジンがそうだったからという理由で、すべてのスプライトのアンカーポイントを(0, 0)に変更したいという誘惑にかきたてられたとしても、絶対に行わないでください!そのように変更すると、後で困ることになります。アンカーポイントをすべて変更してしまうと、回転や拡大、子ノードの相対座標の取得、距離の判定や衝突判定といった、何もかもがぎこちなくなってしまいます。今その理由が分からないとしても、アンカーポイントはテクスチャの中心にあってほしいと本当に、本当に思うはずです。私を信じてください!(P57)

という注釈がついているので、あまりやるべきではない操作ということだろう。