Table of Contents
Cocos2d-x(Cocos2d-js)で作成したアプリからサーバー上に保存されているJSONファイルを読み込む方法についてです。
基本的な処理の流れは、Webサイトで JavaScript の XMLHttpRequest を使用してデータを読み込む方法と同じです。
動作確認を行った Cocos2d-x のバージョンは 3.16 です。
サンプルプログラム
サーバー上に配置したJSONファイル(testfile.json)を読み込むサンプルです。
testfile.json の中身は以下のようであるとします。
{
"name": "JoyPlot",
"age": 20,
"message": "this is a test"
}
これを GET で読み込んでログに表示します。
var HelloWorldLayer = cc.Layer.extend({
ctor:function () {
this._super();
var xhr = cc.loader.getXMLHttpRequest();
// 第三引数は非同期通信かどうかのフラグ
xhr.open("GET", "https://joyplot.com/data/testfile.json", true);
xhr.onreadystatechange = function() {
cc.log(xhr.readyState);
cc.log(xhr.status);
if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status <= 206) {
var response = xhr.response;
// 読み込んだ各データを出力
cc.log(response.name);
cc.log(response.age);
cc.log(response.message);
} else {
cc.log("xhr has error");
}
};
xhr.send();
}
});
var HelloWorldScene = cc.Scene.extend({
onEnter:function () {
this._super();
this.addChild(new HelloWorldLayer());
}
});
Androidの実機でこのサンプルを実行し、そのログを確認すると、以下のように正しくJSONが読み取れていることが確認できます。
xhr.response にはパース(parse)が既に行われた後のデータが渡されます。したがって JSON.parse を行う必要はありません。
プログラムについて
Cocos2d-js で XMLHttpRequest を使用するには、クラス cc.loader が持つ以下のメソッドを使用します。
cc.loader.getXMLHttpRequest();
通常の JavaScript では、以下のように XMLHttpRequest を利用するため、若干書き方が異なるところに注意して下さい。
new XMLHttpRequest();
実際に読み込むファイルのURLを指定するのは open です。
xhr.open("GET", "https://joyplot.com/data/testfile.json", true);
この第二引数を、実際に読み込むファイルのパスに変更して下さい。
第一引数には取得する方法(GETまたはPOST)、第三引数には非同期通信であるかどうかのフラグを設定します。
ここで設定したURLへのアクセスはメソッド send によって発生します。
onreadystatechange には、変数 readyState の値が変化した際に呼び出されるコールバックメソッドを指定します。
今回のサンプルでは、サーバーからの返答が正常(readyState が 4 かつ status が 200代)であれば、実際にファイルのデータを読み込みログに出力しています。
以上がXMLHttpRequestでサーバー上のJSONファイルを読み込む方法です。

