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

フニゲの開発日記

Electronとか...

cc.Loderを使う

cocos2d-html5


前回のステージ毎のテクスチャの初期化をcc.Loaderで書き直し。
勉強しながら書いていると、どうしても同じ処理の書き直しが多くなる。前の記事はいらなくなっちゃうんだけど、消すのも何だかもったいないし。

// resource.js

var g_stage0 = [{src:"res/stage0.png"}, {src:"res/stage0.plist"}];
var g_stage1 = [{src:"res/stage1.png"}, {src:"res/stage1.plist"}];
...

var g_ressources = [
...

resource.jsに各ステージのテクスチャを定義しておいて、

  • cc.Loader.preload()またはcc.Loader.preloadAsync()で読み込み。
  • cc.Loader.purgeCacheData()でメモリを解放。

なんとなくpreload()はゲームの途中で何回も呼んだらだめだと思い込んでいたのだが、そんなことはなかった。

// title.js
    stages:[ g_stage0, g_stage1, ... ],

    // ステージnoが選択されたとき
    stageSelected:function (no) {
        var spriteFrameCache = cc.SpriteFrameCache.getInstance();
        if (Title.currentStage) {
            // まあspriteFrameは削除しなくてもいいと思うんだけど
            spriteFrameCache.removeSpriteFramesFromFile(
                Title.currentStage[1].src);
            cc.Loader.purgeCachedData(Title.currentStage);
        }
        Title.currentStage = this.stages[no];
        cc.Loader.preload(Title.currentStage, function () {
            spriteFrameCache.addSpriteFrames(
                Title.currentStage[1].src, 
                Title.currentStage[0].src);

            // ちゃんと読み込み・解放できたか確認しておこう
            var textureCache = cc.TextureCache.getInstance();
            textureCache.dumpCachedTextureInfo();

            // ステージ開始
            cc.Director.getInstance().replaceScene(Game.scene());
        }, this);
    },
    ...
});

Title.currentStage = null;
広告を非表示にする