一人もくもく会 α verでサービス開始しました。

cocos2d-jsでAssets Managerを使用する

cocos2d-jsでAssets Managerを使用しようと思ったのだが、
どうもドキュメントもサンプルも説明が少なく、
ネット上にも情報が少ないので色々試さなければならなくなったのでメモ。

公式のマニュアルは下記。
http://www.cocos2d-x.org/docs/manual/framework/html5/v3/assets-manager/en
(githubかなんかのどこかに日本語もあった)

この情報に加え、ライブラリのサンプルに入っている
samples/js-tests/src/ExtensionsTest/AssetsManagerTest/AssetsManagerTest.js
を見ることで対応できるのだが、どうも上手くいかなかった。

上記の情報を元にすると、Assets Managerはそもそも下記のような動作をする。

・まず、アプリのmanifestとサーバー上のmanifestを比較し、更新されたものをダウンロードして端末に保存。
・保存後、cc.game.restartでリスタートする。
・次回からのアプリ起動時、main.jsにてjsb.fileUtils.setSearchPathsを呼び出して
端末内に保存されているjsやリソースを読み込むように変更する。

上記で試してみたのだが、更新された際にcc.game.restartして再起動してからのプレイは、
途中でフリーズしてしまう。
一度アプリを完全に終了してから再度起動してみるとうまくいくのだが、
更新時に毎回フリーズはさすがにまずいのでこの方法はダメだった。

cc.game.restartのかわりにcc.director.restartやrestartVM等を試してみたがどれもダメ。
そもそもcc.game.restartが内部的にどうなっているのかすぐにはよくわからないので、
この命令を使うこと自体がちょっと怖い。
せっかくAssetsManager自体は上手く動いているのにほんとうにもったいない。

結局成功法はどうもダメのようなので、
http://galapagosit.hatenablog.com/entry/2014/10/08/162819
にかかれているように、jsListを別にして別途読み込む形で対応することにした。

この方法だとリスタートができないので、アプリ起動中にデータ更新が行われると
一度ゲームを中断して再起動してもらうしかない。
そのため、それを避けるには一つ前のバージョンのサーバーやりとりにも対応して
中断せずプレイできるように運用していく必要がある。

あと、AndroidiOSコンパイルした人は気づいただろうが
アプリ内に含まれるjsファイルは、iOSはjsのままなのだがAndroidはjscに変換したもの。
そのためAndroid側でもjsで対応しているとプログラムが書き換えられないので注意が必要。
面倒だ。
大した容量じゃないが、気になる場合はmanifestも別にしなければならない。
(jsListのファイル名は同じで良い)

あと、manifestのsearchPathsが、結局良く分からなかった。
例えばres/をrespathにしてリソースをロードする場合、
manifestのsearchPathsの方にもresを入れておいたほうが良さげ。
問題はそんな起きないと思うので、気になるパスはとりあえず入れておくと良い。


その他。
・miproj等、サイズ0のファイルが混じっているとサーバーによってはエラーになることも。
・開発中で保存されているデータがぐちゃぐちゃになってると、正しくてもエラーになる場合があるので
そういう時は一度アプリを削除したほうがいい。