【ゲームを作ろう】SpriteFrameCacheとSpriteBatchNode
|素材が増えるのは避けられないので、パフォーマンスを気にしながら進める必要が出てきます。
他の方の測定結果をみてもSpriteFrameCacheとSpriteBatchNodeを上手に利用する方がベストなようです。
ちょっと調べてみたところcocos2d-JS側のbindがcocos2d-xのAPIとほぼ同じ名前で統一されているようなので、cocos2d-JSの経験が活かせそうです。
SpriteFrameCacheでスプライトシートを利用する
ゲーム全体を通してスプライトシートを使う事を想定して、AppDelegate.cppにてスプライトシートの情報をキャッシュします。
スプライトシートを準備します。
- spritesheets.plist
- spritesheets.png
bool AppDelegate::applicationDidFinishLaunching() { ・・省略 //spriteシートのキャッシュ SpriteFrameCache::getInstance()->addSpriteFramesWithFile("spritesheets.plist"); ・・省略 director->runWithScene(scene); return true;
では利用してみましょう。
フレーム名はplistに設定されている名前です。
spritesheets.pngから、plist内のs_box0で設定されているrect情報で画像を切り取ります。
*s_box0の名称でフレームが設定されている前提のコードです
Rect rect = SpriteFrameCache::getInstance()->getSpriteFrameByName("s_box0")->getRect(); Sprite* sprite = Sprite::createWithSpriteFrame(SpriteFrame::create("spritesheets.png",rect));
簡単ですね。
ゲーム内で利用するコマアニメーション素材やちょっとした素材は出来るだけスプライトシートにまとめると、画像生成の手順が統一されて分かりやすくなります。
SpriteBatchNodeでメモリを節約する
spriteを1個づつlayerに登録すると、そのたびに初期処理などが処理されメモリが無駄に利用されるようです。
じっくり自分の手でパフォーマンステストを行ったわけではないので受け売りですが、SpriteBatchNodeにspriteを登録する方法がベストプラクティスのようです。
注意点は、SpriteBatchNodeに追加出来る画像は同じ素材のみということです。
よくあるサンプル
//直接Add for(int i=0;i<100;i++) { Sprite* sprite = Sprite::create("sprite.png"); this->addChild(sprite,1); } //SpriteBatchNodeへAdd可能 SpriteBatchNode* batchNode = SpriteBatchNode::create("sprite.png") this->addChild(batchNode,1); for(int i=0;i<100;i++) { Sprite* sprite = Sprite::createWithTexture(batchNode->getTexture()); batchNode->addChild(sprite,1); }
せっかくSpriteFrameCacheを利用するので、スプライトシートでやってみます。
SpriteBatchNode* batchNode = SpriteBatchNode::create("spritesheets.png"); for(int i=0;i<100;i++) { Rect rect = SpriteFrameCache::getInstance()->getSpriteFrameByName(StringUtils::format("s_box%d",i))->getRect(); Sprite* sprite = Sprite::createWithSpriteFrame(SpriteFrame::create("spritesheets.png",rect)); batchNode->addChild(sprite,1); }
次回は当たり判定を考えてみます。