« ほむほむジャンプをHaxeに移植してみた話 | メイン

Tween24のバグ見つけたのと対処法について

トゥイーンによるアニメーション制御をメソッドチェーンでがんがん書けることで有名なTween24ですが、なんか
アニメがズレるなあと思ってテストコード書いてみたら途中でマニュアルモードが勝手に解除されてた件。

ちなみにマニュアルモードとは、任意のタイミングでupdateをかけることができる超便利な機能です。
特にゲームだとポーズ中はアニメーションを止めたりと同期に手間がかかることが多いので、必須機能だと思っています。

話を戻して、loopとserialの末端で強制解除食らってたようなのでコード追っかけたところ Tween24.as の816行目、removeTweensが呼ばれた時に _isManual = false が実行されているのですが、これがルートのTween24インスタンスで実行されるとまずい。
つまり manualPlay を実行したTween24インスタンスがloopもしくはserialの時に限って後始末の巻き添え食らってモード解除される感じです。

マニュアル駆動でしか使わないのであれば、該当部分を削除してしまえばOK。
ただ一度マニュアルで動かした後でオート再生でも動かしたいみたいな使い回しができなくなるのと、ライブラリのコードを書き換えるのがためらわれるというのがあるので、とにかくルートで解除されることを避けるためにparallelをかましてしまいましょう。


具体的には以下のコードを

var tween:Tween24 = Tween24.serial(
  Tween24.waitCount(2),
  Tween24.traceLog("hoge")
);
tween.manualPlay();

以下のように変更すれば大丈夫です。

var tween:Tween24 = Tween24.parallel(
  Tween24.serial(
    Tween24.waitCount(2),
    Tween24.traaceLog("hoge")
  )
);
tween.manualPlay();


最近ではFlashコンテンツも目減りして、AIRアプリくらいでしか使われなくなってるかもしれませんがバッドノウハウとして共有しておきます。
プルリク投げてもよかったんだけど、Tweenライブラリってただでさえ複雑で下手なことして副作用出ても責任持てないので運用でカバーする方向でひとつ。


(12/01 追記)
もっとシャレにならないバグがあったので、本家にプルリク投げておきました。
loopやserialでカウントのタイミングがずれるバグのため、アニメーションの同期が正しくとれない状況が起こります。

トラックバック

このエントリーのトラックバックURL:
http://void.heteml.jp/mt/mt-tb.cgi/156

コメントを投稿

あわせて読みたい