- 締切済み
【AS3.0】Timerとタイムライン
現在、10秒経過すると画像が切り替わって1秒経過するとまた元に戻り、また10秒経過すると同じように切り替わるというループアニメーションを作成しています。 しかし、フレームを使ったタイムラインアニメーションとtimerを使ったスクリプトで上手く同期しません。 タイムラインの作りはフレームレート30で レイヤー上:mc01 mc02と同じ1秒(30フレーム)ごと画像が切り替わっていくだけのループアニメーション(下の画像と連動していて10秒経過で切り替わるアニメーション) レイヤー下:mc02 mc01と同じ1秒(30フレーム)ごと画像が切り替わっていくだけのループアニメーション mc01とmc02は画像が違うだけで同じ動きをしています。mc01をvisible=false;で消しています。10秒経過したら1秒間true;になるように下記スクリプトに記述しています。 ■スクリプト-------------------------------------- var myTimer:Timer = new Timer(10000, 0); myTimer.addEventListener("timer", timerHandler); myTimer.start(); function timerHandler(event:TimerEvent):void { trace( "UP") mc01.visible = true; myTimer.reset(); myTimer.start(); } var myTimer2:Timer = new Timer(11000, 0); myTimer2.addEventListener("timer", timerHandler2); myTimer2.start(); function timerHandler2(event:TimerEvent):void { trace( "down") mc01.visible = false; myTimer.reset(); myTimer.start(); }*/ ■------------------------------------------------ はじめの何回かは上手く同期するのですが、段々ズレが激しくなっていきます。 そもそもタイムラインを使ったアニメーションとタイマーは上手く同期しないものなのでしょうか? 他によい方法がありましたらご助力願います。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BlurFiltan
- ベストアンサー率91% (1611/1754)
タイムラインを使ったアニメーションがあって それに何かの動作を合わせるのでしたら Event.ENTER_FRAME でカウントをとって そのカウント数によって mc01 の 表示/非表示 を切り替えるのが1つの方法だと思います。 例えば 30fps で 11秒間 だと 331フレーム のタイムラインアニメーションがあった場合, フレーム1(経過時間0秒) に次のように書くのが1つの方法です。 //---------------------------------------- //カウンタにする変数の宣言 var cnt:int; //1フレーム進む時間ごとに毎回 関数「changeMc01」を実行 this.addEventListener(Event.ENTER_FRAME,changeMc01); //関数「changeMc01」の定義 function changeMc01(evt:Event):void { //カウントを 1 を加算 cnt++; //もしカウントが 301 になれば if (cnt == 301) { //"UP" を出力 trace("UP"); //「mc01」 を表示する mc01.visible = true; //もしカウントが 331 になれば } else if (cnt == 331) { //"down" を出力 trace( "down"); //「mc01」 を非表示にする mc01.visible = false; //カウントを 0 に戻す cnt = 0; } } //---------------------------------------- 各行に注釈行を入れているので見た目の分量は多く見えますが, 元のスクリプトよりは短いですし,単純シンプルだと思います。 === === === > なるべくタイムラインを使わないで作成したいと > おもっているのですが、 そのタイムラインアニメーションの部分の動きがどんなものかわからないので何とも言えませんが Tweenクラスを使えば モーショントゥイーン や クラシックトゥイーン に近い動きを "だいたいの" 秒単位で指定できますから,それを使うのも1つの手かもしれません。 (ただしシェイプトゥイーン的な動きはTweenクラスでは無理です。) また Tween の終了時に motionFinish イベントも得られるので 「Tween が終わったときに ○○ する」という同期もとれます。 ◎検索例 ・Google検索「fl.transitions.easing」 http://www.google.co.jp/search?q=fl.transitions.easing&hl=ja&num=10&lr=lang_ja ・Google検索「fl.transitions.Tween」 http://www.google.co.jp/search?q=fl.transitions.Tween&hl=ja&num=10&lr=lang_ja ・Google検索「Tween motionFinish」 http://www.google.co.jp/search?q=Tween+motionFinish&hl=ja&num=10&lr=lang_ja
- aspnet
- ベストアンサー率79% (72/91)
Flashのタイムラインアニメーションは、「ベスト・エフォート」タイプで、時間軸に同期しません。 フレームレートをあわせても、程度の差こそあれ、必ず遅延します。 (フェードなどをかけると一発で遅れます) したがって、タイムラインを使うならば全部タイムライン、Timerクラスを使うならすべてTimerと、統一すること。 Timerクラスが使えるなら、あえてタイムラインアニメーションを使う理由もないと思いますが。
補足
早々のご回答誠にありがとうございます。 やはり、そうでしたか…。。 スクリプトに関しては、まだ初歩的な位置にいますので未熟であまり高度なことはできません。 Timerクラスで作成の仕方もなんとなく解っているのですが、 スクリプトで形にできずタイムラインを使ってしまうこととなっていしまいました。 なるべくタイムラインを使わないで作成したいとおもっているのですが、 まず1秒ごとに画像を切り替えるにはどうしたらよいのか。10秒経過したら別の画像の表示後1秒経過後に消え、 また最初からループするにはどうすればよいのか?といった出だしの部分で躓いております。 大変、恐縮なのですが簡単に教えていただきたいのですが。。 無知で大変申し訳ございません。