cheka.jp 超不定期で更新する写真達。お口直しにどうぞ。

【ゲームを作ろう】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);
}

次回は当たり判定を考えてみます。

Add a Comment

メールアドレスが公開されることはありません。