夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d】CCSpriteBatchNode? CCSpriteFrame? CCSpriteFrameCache? テクスチャアトラス?

何やらいろいろ難しくなってきました。

まともなゲームを作ろうとすると、単純にスプライトをイメージファイルから作って親ノードにaddしていくだけでは済まなそうな感じです。

 

CCSpriteBatchNode, CCSpriteFrame, CCSpriteFrameCache, Texture Atlasなどの機能を使いメモリ効率や描画速度の向上を図る必要がありそうです。

 

CCSpriteBatchNode(のインスタンス)は親ノードとスプライトの間に挿入して使います。つまり、CCSpriteBatchNodeを本来の親ノードにaddChildでくっつけて、スプライトをスプライトバッチノードにaddします。

スプライトが1個では高速化になりませんが、例えば弾など大量にあるスプライトをスプライトバッチノードにaddする事でそれらのスプライトの描画処理を一度に済ませる事ができるので大幅な高速化となります。runActionでアニメーションを指定したスプライトもaddする事が可能です。(アニメーションで動く速度が速くなる訳ではありません)

ただし、CCSpriteBatchNodeに指定したテクスチャを使用しているスプライトしかaddする事ができません。

様々なテクスチャのスプライトをCCSpriteBatchNodeにくっつけるにはテクスチャアトラスを使用します。テクスチャアトラスは複数のテクスチャファイルをまとめて一つの画像ファイルにした物です。複数のテクスチャをまとめた大きなテクスチャの画像ファイルとそのファイル名の拡張子を.plistにしたファイルの2つのファイルがセットになります。これらのファイルはZwoptexやTexture Packerといった外部ツールで生成できます。

スプライトバッチノードに異なるテクスチャのスプライトを登録するため以外にもテクスチャアトラスを使うべき理由があります。それはRAM使用効率の向上です。iPhoneのRAMにテクスチャが読み込まれると、自動的に縦、横のサイズが2の乗数となる領域が確保されてしまいます。例えば縦150 x 横300というサイズのテクスチャは内部的には縦256 x 横512分のRAM領域を消費します。複数のテクスチャファイルを1つの大きな(縦横2の乗数のサイズの)画像ファイルに隙間なく詰め込む事でiPhoneの限りあるRAM資源を有効に活用できるのです。ZwoptexやTexture Packerは効率的にテクスチャを配置してくれます。

 

さて、テクスチャアトラスをアプリでつかうにはどうすればいいでしょうか。そこで登場するのがCCSpriteFrameCacheです。

CCSpriteFrameCacheはシングルトンで、addSpriteFrameswithFileメソッドのパラメーターとして.plistファイルを指定します。このとき自動的にテクスチャファイルも読み込んでTextureCacheに登録してくれるようです。

読み込んだテクスチャはテクスチャアトラスを作る元になった画像ファイルのファイル名でアクセスできます。

CCSpriteのインスタンスを作るときにスプライトフレームのテクスチャを指定する場合は、[CCSprite spriteWithSpriteFrameName:@"xxx.png"];などとします。

すでにあるスプライトのオブジェクトの画像として指定する場合は、CCSpriteのsetDisplayFrameメソッドを使います。

アニメーションのフレームとしてNSMutableArrayにaddObjectする場合は、CCSpriteFrameCacheのspriteFrameByNameメソッドを使用します。

 

かなりややこしいので、プロトタイププログラムを作って使い方を覚えたいと思います。