[JSFL]座標の小数点を丸めるJSFL使用時の注意(Windows FlashCS4,CS5で確認)
ステージ上のオブジェクトの座標を整数に丸めてくれる便利JSFLに罠があることに気づきました。
CS5で気づいて、CS4でも同じことになったから既知の現象でしょう。
丸めるJSFLはいろんな方が公開してくれてるのでボクもどこかで拾ったものを使ってます。
↓こんなの
var doc = fl.getDocumentDOM();
if (doc.selection.length) {
for (var i = 0 ; i < doc.selection.length ; i++){
var mat = doc.selection[i].matrix;
mat.tx = Math.round(mat.tx);
mat.ty = Math.round(mat.ty);
doc.selection[i].matrix = mat;
}
}
[/sourcecode]
選択したオブジェクトを一括でバーンと変換してくれて便利なんですが、保存時に結果を変換後の座標を保持してくれないことがあるようだということに気づき、なんとなく原因と対策っぽいこともわかったのでメモしときます。
まず、座標を保持しない再現手順を書きます。
(うちでの再現率:100%)
■手順(準備編)
- 1.新規flaファイルを作成
- 2.何でもいいから四角いシェイプを書いてMC化(シンボル1とする)
- 3.シンボル1をさらにMC化(シンボル2とする)
- 4.シンボル2の中に入り、シンボル1のx座標を0.5にする(プロパティパネルから数値変更)
- 5.保存して、ファイルを閉じる。
- 6.再度ファイルを開き、シンボル2の中のシンボル1の座標を確認するとx座標は0.5となっている。
→ここまでは何の問題もない
■手順(不具合発生編)
- 7.シンボル1を選択した状態で上記JSFLを実行する。
- 8.プロパティパネル上では0.5が1となっているはず。
- 9.ファイルを上書き保存して閉じる。
- 10.ファイルを開いて、シンボル2の中のシンボル1の座標を確認するとx座標は0.5となっている。
→なにこれ、ばかなの、しぬの
ちなみにJSFLを使わずに手動でプロパティパネルの数値を0.5→1に変更した場合は保存は反映されます。
(当たり前か)
では何が問題か。
ここからは推測ですが、上記JSFLでの結果ではflaファイル的には「変更扱いにされていない」っぽいようです。
ためしに上記手順8まで実行した状態でファイルを保存するまえにシンボル2の中のタイムラインのレイヤーをひとつふやしてから保存して開き直してみると、こんどはちゃんとシンボル1座標変更が反映されているのが確認できます。
ここで注意が必要なのは、シンボル2の中のタイムラインをいじったということ。
シンボル2のタイムラインではなく、メインタイムラインのレイヤーをひとつふやしてもシンボル1の座標変更は反映されません。
つまりはFlashはMC単位で変更があったかなかったかを判断して、状態を保存するかしないかを決めてるっぽいので関係ないタイムラインに変更を加えても意味がない、ということになりそうです。
というわけで、対策
確実に「MCに変更を加えたぞ」と判らせてあげるために、上記JSFLを改造。
var doc = fl.getDocumentDOM();
if (doc.selection.length) {
for (var i = 0 ; i < doc.selection.length ; i++){
var mat = doc.selection[i].matrix;
mat.tx = Math.round(mat.tx);
mat.ty = Math.round(mat.ty);
doc.selection[i].matrix = mat;
}
}
//追加:レイヤーを追加して、追加したレイヤーを消す
doc.getTimeline().addNewLayer();
doc.getTimeline().deleteLayer();
[/sourcecode]
最後に2行追加しただけです。
レイヤーを追加してすぐにその追加したレイヤーを削除する。
結果的には何の変化もない意味のない処理ですが、これで「MCに変更を加えたぞ」とflaに判らせてあげることができるようになります。
このJSFLを用いて上記手順を実行すると小数点丸めは確実に保存時に反映されるようなりました。
かなり力技な感じですが、もっとマシな方法がありました教えてくださいませ。
(果たしてCS5.5では直ってるのか?・・・まぁ直ってないだろうな。。)