tmlib でひっかかった点

今日二回目の投稿です。
ここ2日ほど tmlib をいじくり回していたので、途中でひっかかった点を残しておこうかと思います。

・サンプルによっては動かない
結構いろんな場所でサンプルが公開されているのですが、tmlib のバージョン次第で動作しない場合があります。
バージョンが明示的に書いてあればいいのですが、無いとどれだか分からないという…
頑張ってクラスのネームスペース移動とかを修正すると動くかもしれません。

・Object2D では position が中央の位置を指す
分かってれば何という事もないのですが、たまに忘れて「あれ、半ブロックずれてる?」とかやるので、一応書いておきます。
ちなみに、どうやら中央以外になる事もある(origin の値しだい?)ようです。
あと、left、right、top、bottom でそれぞれの数値が取れます。

・アニメーションしたいスプライト
tm.asset.SpriteSheet を定義して tm.display.AnimationSprite に食わせれば使えます。
SpriteSheet の frame にある width と height は AnimationSprite のコンストラクタと同じにする必要があります。
あとは SpriteSheet の animations に定義してある名前を使って AnimationSprite の gotoAndPlay() や gotoAndStop() でアニメさせましょう。

・tiled によるマップ(tmx 形式)の利用
まずは tm.asset.MapSheet() でマップデータを読みます。(どうも、シーンの init で読ませると、うまく動かなかったので、グローバル変数にして最初に読ませてます)
その後、tm.display.MapSprite にチップサイズと一緒に食わせてから左上座標を position に設定すると表示してくれます。

・マップのデータを参照したい場合
MapSheet の layers に各レイヤが入っていて、その中の data 配列が左上からのパーツインデックスになっているようです。(複数レイヤ、複数マップチップでのチェックはまだ)
ちなみに、マップサイズ(チップを1とした縦横のサイズ = ピクセルじゃない方)も MapSheet の width と height に入ってます。

・スプライトの scale が衝突判定にうまく反映されてない感じ
Object2D に scale 値があって、拡大縮小に使えるようなんですが、どうも isHitElement() とかの衝突判定には反映されてないように感じました。
いちおう size の変更を試した時には、サイズ × scale という巨大イメージが表示されました。
というわけで、現在のところは拡大縮小しないようにして使ってます。
もしかすると collision あたりをゴニョゴニョするといいのかもしれません。誰か出来たら教えてください。

・子エレメントのグローバル座標を取るには
状況によっては、シーンの直下ではなく、あるオブジェクトの子としてエレメントを配置したい時があります。(例えば、キャラの周囲を回るモノとか)
この場合、子エレメントの座標を取ると親に対する相対座標が返ってきます。
よって、そのまま使うと画面上の期待する位置には合いません。
というわけで、こういう時には element.getParent().localToGlobal() に位置(x と y が取れるオブジェクトなら他のでも OK)を食わせると、名前の通りにグローバル座標になって(tm.geom.Vector2の形かも)返ってきます。
大事なのは localToGlobal() を呼んだオブジェクトを基準にして、引数にしたオブジェクトの座標が計算されるという事です。(だから、自分が localToGlobal() しても変化なし…のはず(未確認))
次のコードが自キャラの周囲にあるボックスを衝突判定用にグローバル座標化するものです。

function(elm) {
var pos = elm.getParent().localToGlobal(elm.position);
var shape = tm.app.Object2D();
shape.setPosition(pos.x, pos.y).setSize(elm.width, elm.height);
shape.setBoundingType("rect");
return shape;
};


その後、マップスクロールの時に色々やってみた結果、上は間違いでした。
どうやら一番上のエレメントまで遡って、それぞれの centerX と centerY が積算される模様です。
結局、順当に親の x、y を加算する事で落ち着きました。