tmlib.js には、AssetManager って言う素材を管理するクラスがあるです。(tmlib.js 0.1.8)
シングルトンぽい感じで、tm.asset.AssetManager にインスタンス化もされてるのでそのまま使うみたい。
tm.asset.AssetManager.load('windowskin','img/windowskin.png');
ロードしておいて
tm.asset.AssetManager.get('windowskin');
素材(この場合Texture)のインスタンスがもらえる。便利。
さらに思ったのが、json ファイル
とりあえず固定的なデータは、jsonファイルで置いておいて、あとで変更しやすいように設定とかは外だしに、json ファイルをロードして使う感じの処理ってするよね?きっと。
これもある意味、素材だよね~?ってことで
tm.asset.AssetManager.load('windowskin.config','data/windowskin.json');
tm.asset.AssetManager.get('windowskin.config');
なんて、すると json を読み込んでオブジェクトが取れれば、便利だな~と。
json の読み込みは全部これでOK~的な。
調べてみると、画像の場合は、
tm.asset.AssetManager.register("png", _textureFunc);
とかって登録されていて、register メソッドは、asset の path (上の例で言うと、'img/windowskin.png')の拡張子に対応した function (_textureFuncのこと)を設定しておいて、それによって、インスタンスを作成する。
ふむふむ、
tm.asset.AssetManager.register("json", jsonFunc);
こんなものがあれば良さそう?
ただ調べてみると、似たような事をしているクラスがありました。
tm.asset.AssetManager.register("tmx", _tmxFunc);
tm.asset.AssetManager.register("tmss", _tmssFunc);
_tmxFunc は、MapSheet クラスをインスタンス化してくれて path には、json ファイルを指定(拡張子は .tmx)
_tmssFunc は、SpriteSheetクラス(拡張子は .tmss)
拡張子で作るインスタンスを制御するのもいいけど、RPGだとこれからもデータの種類が増えそうだし拡張子がいろいろ増えるのは避けたいかな~と。
なので、中身が json なら .json でいきたい。
って、ことで作って見た。
# JsonWrapper クラス
# asset の Jsonファイル対応
tm.define 'tm.asset.JsonWrapper',
superClass: tm.event.EventDispatcher
# 初期化
init: (path) ->
@superInit()
@loaded = false
if typeof path == 'string'
self = @
tm.util.Ajax.load
url: path
dataType: 'json'
success: (o) ->
self.$extend o
self.loaded = true
self.dispatchEvent tm.event.Event('load')
else
@$extend path
@loaded = true
# AssetManager に json ファイル追加
tm.asset.AssetManager.register 'json', (path) -> tm.asset.JsonWrapper(path)
これで、json ファイルのロード処理は、書かなくてすむ!
ってことで
Windowクラスの素材は、いろいろあるのだけど、素材の仕様はさまざまに変更できるように、これを使って json にしました。
json ファイルを用意すればなんでもできるわ~って思って、やってたんだけど…
実際に json ファイルを作る段階になって、とある問題が…
json ファイル作るのめんどくさい><
まぁ~、coffee script で JavaObject を json ファイルに出力するのを作れば良いだけなんだけど
そのファイルを管理したりね?開発中は中身もいろいろかわるし、面倒だな~ってことで
tm.asset.AssetManager.load('windowskin', {image: 'windowskin.vxace', borderWidth: 16 .....});
と、やると、json ファイルを指定したのと同じ様に、json が取れれば、コード内に書いて置けるし、あとで、json ファイルにもできるな~っておもったのです。
使うほうは、get メソッドを使うだけなので、影響ないし。
なのでちょっと改造
# 元の _load を保存
tm.asset.AssetManager._original_load = tm.asset.AssetManager._load
# _load メソッドの書き直し
tm.asset.AssetManager._load = (key, path) ->
return if @contains(key)
if typeof path == 'string'
# path が string の場合は、元の _load を実行
@_original_load(key, path)
else
# string 以外は、hadh として、_type のキーを持つ関数を実行する
@assets[key] = @_funcs[path._type](path)
# 消してもいいよね。
delete path._type
# ロード処理が無いので、load イベントのつじつま合わせ、これでいいのかな?
@_checkLoadedFunc()
こんなんでどでしょ、動いているから、とりあえずこれで作業中…
(prototype 使うべきなんかな~?)
で、ついでに jsdo.it をつかってみたよ。
http://jsdo.it/YFukuyama/ucRu
jsdo.it も面白い。