プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

cocos2d スプライトの詳細。テクスチャアトラス、スプライトバッチ

cocos2dで作るiPhone&iPadゲームプログラミング6章

移植中にスプライト用テクスチャがfile not foundになってコンパイルが通らないことがあった。
とりあえず画像をPNGで再保存して、プロジェクトに追加し直したら通った。ひょっとしたらプロジェクトに追加し直すだけで良かったかもしれない。
同じエラーが出た時はもう少し原因を探ってみよう。
※ひょっとしたら、AddToTargetにチェックがついていなかったせいかもしれない。

サンプルプログラムから移植したら、background.pngのサイズが微妙にあってないのかずれてるのか、変な表示になってた。エラーが出てたのもこの画像だし、どういうこっちゃ。
とりあえずそのへんは今のところ気にせず本を読み進めてみる。

6章ではスプライトの操作にスポットを当てるらしい。
テクスチャアトラス・・・複数の画像で構成される標準的なテクスチャ
スプライトバッチ・・・描画を高速化。テクスチャアトラスを使うときに本領発揮。

CCSpriteBatchNodeクラス

テクスチャのレンダリングにはオーバーヘッドが生じる。同じテクスチャを多数レンダリングする場合にはCCSpriteBatchNodeクラスを使うとオーバーヘッドを減らせる。
追加できるノードはCCSpriteのみ。

CCSpriteBatchNode *batch = [CCSpriteBatchNode batchNodeWithFile:@"bullet.png"];
[self addChild:batch];
for (int i = 0; i < 100; i++){
  CCSprite *sprite = [CCSprite spriteWithFile:@"bullet.png"];
  [batch addChild:sprite];
}

弱点はZオーダーが同じになってしまうことと、同じテクスチャを使わなければいけないこと。

子ノードから親ノードへのアイテム追加

[[self parent] addChild:〜];

tagを変数で管理するのもいいかもしれない。
現在のやり方ではtagがプロジェクト全体で一意になるように自分で管理する必要があるが、
たとえばSQLのidのようにauto incrementできるメソッドがあれば自動的にtagを付けられる。
ただしその場合はすべてauto incrementメソッドでtagを管理する必要が出てくるだろう。

hogeNodeTag = [self addChildAndGetTag:hoge];//tagにMAX(tag)+1をつけて返す。

あるいは一箇所のenumで全てのタグを管理する。こうすれば数字はかぶらない。

スプライトアニメーション

1.テクスチャを読み込んで

CCTexture2D *tex = [[CCTextureCache sharedTextureCache] addImage:file];

2.アニメーションフレームをセットして

CCSpriteFrame *frame = [CCSpriteFrame  frameWithTexture:tex rect:rect];

3.アニメーションを作成して

CCAnimation *anim = [[[CCAnimation alloc] initWithFrames:frames delay:0.08f] autorelease];

4.アニメーションのアクションにループアクションをつけて実行

CCAnimate* animate = [CCAnimate actionWithAnimation:anim];
CCRepeatForever *repeat = [CCRepeatForever actionWithAction:animate];
[self runAction:repeat];
[self scheduleUpdate];

特定のアニメーションに名前をつける。

[[CCAnimationCache sharedAnimationCache] addAnimation:anim name:@"move"];

キャッシュから取り出す

CCAnimation* moveAnim = [[CCAnimationCache sharedAnimationCache] animationByName:@"move"];

アニメーションヘルパー

アニメーションを作成する手順をカプセル化する。本の例ではカテゴリでCCAnimationにメソッドを追加していた。

テクスチャアトラス

現時点ではTexturePackerProのほうがおすすめらしい。ZwopTexは24.95ドル。機能制限Flashバージョンは無料。
3GS以前で扱えるテクスチャの最大サイズは1024*1024
前述のアニメーション作成手順もテクスチャアトラスを使うことで簡略化できる。

cocos2dの画像キャッシュを削除

[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCTextureCache sharedTextureCache] removeUnusedTextures];

シーンのLoadingScene時に使うといい。
メモリからテクスチャを完全に削除

[CCSpriteFrameCache purgeSharedSpriteFrameCache];
[CCTextureCache purgeSharedTextureCache];

参考:

cocos2dで作る iPhone&iPadゲームプログラミング

cocos2dで作る iPhone&iPadゲームプログラミング