[Cocos2dx V3] Cocos2d-jsでテキストをファイルに保存する方法

2016年11月7日

Cocos2d-xCocos2d-js)で、ファイルとしてテキストを保存する方法についてです。

jsb.fileUtilsを用いる

cocos2d-js を利用する場合、ファイルの読み書きはクラス jsb.fileUtils を使うのが一般的かと思います。実際にコードを書いて試してみました。

jsb.fileUtils | JsDoc Reference

サンプルコード

cocos2d-x のプロジェクトを新規作成し、app.js をクラス jsb.fileUtils のメソッドを使うだけの簡単なプログラムに書き換えます。最終的なコードの形は以下のようになります。

var HelloWorldLayer = cc.Layer.extend({
    sprite: null,
    ctor: function() {
        this._super();
        this.jsbTest();
    },
    jsbTest: function() {

        if (!cc.sys.isNative || !jsb.fileUtils) {
            // jsb.fileUtilsが使えない環境下では処理を行わない
            return;
        }

        // データを保存できるディレクトリのパスを取得
        var writablePath = jsb.fileUtils.getWritablePath();
        cc.log("writable path: " + writablePath);

        // 保存ファイル名
        var fileName = "testFile";

        // 保存するテキストをKey-Value形式で
        var data = {
            name: "Cocos2d-x js save text.",
            description: "This is only a test."
        };

        if (jsb.fileUtils.writeToFile(data, writablePath + fileName)) {
            // ファイル書き込みに成功
            cc.log("Succeeded to write string");
            var string = jsb.fileUtils.getValueMapFromFile(writablePath + fileName);
            // 保存されたテキストの表示
            cc.log('name: ' + string.name);
            cc.log('description: ' + string.description);
        } else {
            // ファイル書き込みに失敗
            cc.log("Failed to write string");
        }
    },
});
var HelloWorldScene = cc.Scene.extend({
    onEnter: function() {
        this._super();
        var layer = new HelloWorldLayer();
        this.addChild(layer);
    }
});

初めから書かれているコンストラクタ(ctor)の中身を全て消して、今回作ったテキスト保存用のメソッドを呼び出すだけにしています。

サンプルソースコードの解説

保存先のディレクトリを取得 - getWritablePath

以下のメソッドで、iOSやAndroid端末上でファイルを保存可能なディレクトリのパスを知ることができます。

jsb.fileUtils.getWritablePath()

例えば、iOSであれば、以下のようにアプリの Documentディレクトリ のパスが文字列で返されます。

/var/mobile/Containers/Data/Application/A7DE73A6-B23D-4533-8F65-2B12C16CBE5A/Documents/

ファイルの書き込み - writeToFile

実際にデータをファイルに書き込むメソッドは writeToFile です。引数は以下のようです。

jsb.fileUtils.writeToFile(書き込むマップオブジェクトデータ, ファイルの絶対パス)

この例では、変数 data に保存したいテキストを、キーと値のペアで設定しています。

var data = {
  name: "Cocos2d-x js save text.",
  description: "This is only a test."
};

保存するファイルは絶対パスで指定します。保存したマップオブジェクトデータは、内部的には plist となっています。

このメソッドは、ファイルの保存に成功した場合 true を返すので、成功した場合のみ中身を取り出す処理を行うようにしています。

ちなみに、単純な文字列を保存する場合は writeStringToFile を使用します。

保存したオブジェクトを取得 - getValueMapFromFile

以下のメソッドで、保存したオブジェクトを取り出せます。引数は、ファイルの絶対パスを表す文字列です。

jsb.fileUtils.getValueMapFromFile(ファイルの絶対パス);

実行結果

iOSアプリとAndroidアプリで実行した結果です。

iOS

Cocos2d-js で iOSアプリにテキストを保存

Android

Cocos2d-js で Androidアプリにテキストを保存

name と description が無事取り出せています。以上でオブジェクト形式でテキストの保存ができました。

参考

Jsb.fileUtils.writeToFile crash Android - Cocos2d-x Forum

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です