• 締切済み

Fpsを増減させても一定のスピードで再生する方法

BlurFiltanの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

厳密な話なので良くわからない部分もありますが Timerクラスを利用すれば updateAfterEvent() が利用できるので解決することかもしれません。 メインタイムラインのフレーム1のステージ上には 仮に「fps4_btn」「fps8_btn」「fps12_btn」「fps16_btn」「fps20_btn」 というインスタンス名を付けた5つのボタンと 「mcA」と「mcB」というムービークリップがあるとします。 ※参考【添付図】↓ また, 「mcA」と「mcB」の内部は複数のフレームがあって, 「mcA」と「mcB」の中には何もスクリプトを書かないものとします。 (「mcB」の中には stop(); など一切書かないものとします。) その場合の メインタイムラインのフレーム1に書くスクリプト例です。 //------------------------------------ //***↓前置き(ボタンの動作)↓*** for (var i:int = 4; i <= 20; i+=4) { this["fps"+i+"_btn"].addEventListener(MouseEvent.CLICK,changeFPS(i)); } function changeFPS(fps:int):Function { return function():void { stage.frameRate = fps; } } //***↓本題(mcB 内の制御)↓*** //Timer インスタンス tm を作成(200ミリ秒毎,無限回数) var tm:Timer = new Timer(200,0); //指定ミリ秒毎に 関数 mc_Play を実行 tm.addEventListener(TimerEvent.TIMER,mc_Play); //タイマースタート tm.start(); function mc_Play(e:TimerEvent):void { //もし mcB 内が最終フレームであれば if (mcB.currentFrame == mcB.totalFrames) { //mcB 内を フレーム1 で停止 mcB.gotoAndStop(1); //それ以外は } else { //mcB 内を 次のフレーム で停止 mcB.nextFrame(); } //表示を即更新 e.updateAfterEvent(); } //------------------------------------ updateAfterEvent() は フレームレートに依存せず イベントが発生した時点で表示を更新するメソッドです。 ActionScript 3.0 の場合,この updateAfterEvent() は MouseEvent,KeyboardEvent,及び TimerEvent に対して使うことができます。 Timer クラスを使うにしても setInterval を使うにしても setTimeout を使うにしても ある程度誤差があるため正確な時間で動作をさせることはできませんが setInterval よりも setTimeout, setTimeout よりも Timer の方が管理しやすい(扱いやすい)ことは確かです。 (私は上記3者の中で, 戻り値 ID の管理が大変な setInterval が最も苦手(大嫌い)です。 setInterval を書いたフレームをループ再生させたり, setInterval の停止や開始を繰り返すと, ID がグチャグチャになります。) それと, > mcBの中の全フレームに stop();を記述し と書かれていますが Timer を使う使わないにかかわらず そういう面倒なことをする必要はりませんよ。 上のスクリプトにも書いた MovieClip.nextFrame() が「ムービークリップ内を次のフレームに進めて停止」いう意味のメソッドです。 また MovieClip.currentFrame プロパティで ムービークリップ内の現在表示中のフレーム数が取得できますから MovieClip.gotoAndStop(MovieClip.currentFrame + 1); と書いても 「ムービークリップ内を次のフレームに進めて停止」という意味になります。 またこちらの方が 「ムービークリップ内を3フレーム先に進めて停止」のようなこともできるので 汎用性は高いです。 しかしどちらにしても 行き止まりの最終フレームでは止まってしまうので, そうなるような場合に限って MovieClip.gotoAndStop(1); や MovieClip.play(); のようなことをする必要が出て来ますが。

Fawkes
質問者

お礼

御回答ありがとうございます。 たしかにnextFrameのほうがいいですね。 updateAfterEventというのは知りませんでした。使ってみましたがこれがあるお陰で表示速度が一定になりました。ありがとうございます。 それと追加の質問をさせてください。 いま作成しているフラッシュなんですが、ルートのフレームが3フレームあります。そのルートに内部にアニメーションファイルを持ったムービークリップを複数配置している形になります。 更にルートの1フレームにstop();を記述し、フレーム移動用のボタンを配置しそのボタンを押すとルートのフレームが1-2-3-2-3-2-3...と移り変わるように設定しています。 ボタン用のスクリプトはこういう感じになります。 if(this.currentFrame ==1) { this.gotoAndStop(2); } else if(this.currentFrame ==2) { this.gotoAndStop(3); } else { this.gotoAndStop(2); } 更にルートの2フレーム目に教えていただいた、//***↓本題(mcB 内の制御)↓*** 以下のスクリプトを記述しているので、最初にボタンを押し2フレーム目に移動した時点で addEventListenerをし、タイマーをスタートさせる形にしていました。 ここで疑問に思ったのですが、3フレームから2フレームにボタンを押して移動した場合、 更にTimerオブジェクトにaddEventListenerをしていることになるんでしょうか?だとするとボタンを押してフレーム移動をするたびにaddEventLilstnerを実行していることになりフレーム移動をすればするほど処理が重くなってきたりしそうな気がするのですがどうなのでしょうか?何か別の処理を加えるべきでしょうか? それと、このままだと、1フレーム目から2フレーム目に移動するときはいいのですが、3フレーム目から2フレーム目に移動すると、すでにタイマーがスタートしているのに更にtm.start();が実行されてしまいます。 タイマー用の関数の中にtraceを入れて確かめましたが、3Fから2Fにフレームが移動する度にタイマーが起動されていました。なので、3フレームから2フレームに移動する前に一度タイマーを停止して、フレーム移動後に改めてタイマーを起動するようにしましたが、これだとタイマーが重複して起動されることがなくなりました。 変更したボタン用スクリプトはこういう感じになりました。 if(this.currentFrame ==1) { this.gotoAndStop(2); tm.start(); } else if(this.currentFrame ==2) { this.gotoAndStop(3); } else { tm.stop(); this.gotoAndStop(2); tm.start(); } ただここで疑問なんですが、最後のelse以下をこうしてしまうと、動いていたタイマーが停止できません。 else { this.gotoAndStop(2); tm.stop(); tm.start(); } 結果、タイマーが多重起動されてしまうのですが、これはなぜでしょうか?今まで動いていたタイマーイベントと、フレーム移動後に動き出すタイマーイベントは別もの扱いになるのでしょうか? それともう一つ疑問に思ったことがあります。 タイマーにcurrentCountをつけてタイマー実行回数を調べていたんですが、2フレーム目でタイマーをスタートし、2フレームから3フレームに移動する間は実行回数は増え続けていくんですが、3フレーム目から2フレーム目に移動した時点でcurrentCountが一度0にリセットされます。これはどうしてなんでしょうか?

関連するQ&A

  • 同じMCが連続で再生されないようにランダム再生

    Flash CS6 でAS3を使っています。 質問ですが、同じムービークリップが連続で再生されないようにランダム再生を続けるにはどうすればよいでしょうか? 例えば  mcA、mcB、mcCと3つのムービークリップがあるとして 最初にmcAが再生されたら次はmcBかmcCが再生されるようにし、そこでmcBが再生されたら次はmcAかmcCが再生されるようにし、そこでmcCが再生されれば次はmcAかmcBが再生されるようにする、といった具合にランダムでムービークリップの連続再生をしたいのです。 それと同じムービークリップが連続で再生される確率を下げてランダム再生を続ける方法はありませんでしょうか? 例えば最初の質問と同じように mcA、mcB、mcCと3つのムービークリップがあるとして 最初にmcAが再生されたら次はmcAが連続で再生される確率を下げ、mcAかmcBかmcCが再生されるようにし(確率でいうと、次はmcAは10%、mcBとmcCは45%の確率で再生されるようにする、といった感じです。)、そこでmcBが再生されたら次はmcBが連続で再生される確率を下げ、mcAかmcBかmcCが再生されるようにするといった具合に連続再生をしたいのです。 質問は以上の2つです。宜しくお願いします。

    • ベストアンサー
    • Flash
  • ムービークリップを特定の組み合わせでランダム再生

    Adobe Flash Pro CS6 でAction Script 3を使っています。 今現在複数あるループムービーを特定の組み合わせでランダム再生する方法を考えています。 使用するムービークリップの数は全部で5つです。 mcA,mcB,mcC,mcD,mcEと5つあります。クリップの再生時間はmcDのみが20フレームでほかはすべて10フレームです。これらのムービークリップをある程度のランダム性を持たせて特定の順番で再生したいのです。特定の順番は以下のとおりです。 mcA - mcB mcA - mcB - mcB mcC - mcD - mcE mcC - mcD - mcD - mcE mcC - mcD - mcD - mcD - mcE この四通りの再生方法でムービークリップをランダムで再生し続けたいのです。 それぞれのクリップはループになっているのでmcBからmcA or mcC、mcEからmcA or mcCに繋がってもシームレスに再生し続けられる感じになっています。 どういった方法を用いるのが最善でしょうか? 今現在一つのレイヤーに (mcA - mcB)( mcA - mcB - mcB )(mcC - mcD - mcE)(mcC - mcD - mcD - mcE)(mcC - mcD - mcD - mcD - mcE) と言った感じにすべてのムービークリップを再生する順番に配置して、それぞれの区切りでフレームラベルを用意して、配列にフレームラベルをすべて入れて、その配列とMath.randomを組み合わせてフレームラベルをランダムで選び、再生位置を飛ばして再生し続けていますが、これだとレイヤーの管理がしにくいのでいまいちしっくりきません。

    • ベストアンサー
    • Flash
  • ビットマップデータのメモリ使用量について

    Adobe Flash CS6 AS3を使用しています。 ライブラリにpng連番画像を読み込みそれをムービークリップ内に配置し、そのムービークリップをメインのタイムラインにおくという形でフラッシュを作っているのですが、これではメモリ使用量が大きくなりすぎるのでなんとかしたいと思っています。 例えばmcAというムービークリップの内部にライブラリにインポートしたA01からA10という10枚の連番png画像を10フレーム分並べます。そして同じくムービークリップmcBの内部にライブラリにあるB01からB10という10枚の連番png画像を同じく10フレーム分並べます。その二つのmcをメインのタイムラインに配置します。これでmcAとmcBの10フレーム分のアニメが再生されますが、mcAかmcBどちらか片方だけを表示するようボタン操作ができるようにしています。ここで問題なのですが、例えばmcAを表示しているときにmcBは可視性を切って非表示にしていますが、メモリ使用量が減りません。こういった時に非表示にしているムービークリップのために確保したメモリーを開放する、といったことはできないのでしょうか?removeChildなどを実行してもメモリ使用量はまったく減りませんでした。 連番画像とそれを収めるムービークリップの数が増えれば増えるほどメモリ消費量が増えていってしまうので困っています。表示されていない内部にビットマップデータを配置してあるムービークリップのメモリーを開放するよい解決策がありましたら教えてください。 それと少し話がそれますが、ライブラリにあるビットマップイメージををリンケージしそのビットマップイメージをaddChildでステージに読み、そのビットマップイメージをdisposeで削除した場合にメモリーが開放されるのを確認しましたが、今の自分のやりかたよりこういった別の方法からフラッシュを作っていったほうがメモリー使用量を抑えられたりするのでしょうか?もっと効率の良い方法がありましたらそちらも教えてていただけると助かります。宜しくお願いします。

  • fps テキスト入力・またはボタンで変更

    今、フラッシュ暗算のコンテンツを作っています。 一つ目のフレームで足す桁数や個数、再生速度を指定したいと思っています。 桁数などは一応指定できたのですが、fpsについてはお手上げでした。 あるHPで、fpsを後から変更する事はできない。という説明を見たのですが、それは、私がやろうとしている事ができないという意味でしょうか?それとも、あるムービーを作っていて、それを後からfps変更すると不具合が生じると言う事なのでしょうか?

    • ベストアンサー
    • Flash
  • ムービークリップ再生順序 制御について

    はじめて質問します。Flash初心者ゆえつたない説明ですいませんが、よろしくお願いします! Flash:ActionScript2.0 [現状] メインフレームにABCというムービークリップを配置しています。 それぞれ「mc1」「mc2」「mc3」というインスタンス名がついています。 各ムービークリップにはそれぞれ動きが設定しており、”moving”というフレームラベルをつけています。 [どう動作してほしいか] まずAのムービークリップが再生。Aのムービークリップ再生終了。 ↓ Bのムービークリップ再生開始。Bのムービークリップ再生終了。 ↓ Cのムービークリップ再生開始。Cのムービークリップ再生終了。 ↓ Aに戻る。 上記の動きをタイムラインを利用するのではなく、メインフレームに1つactionScriptを書くことで動作させるにはどうしたらいいでしょうか? ちなみに今は以下のように記述しており、実行すると3つのムービークリップが全て同時に動いてしまいます。 var list:Array = new Array(); for(var i=1; i < 4; i++) { var mcname = "mc" + i ; list[i] = eval(mcname); list[i].gotoAndPlay("moving"); } よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ムービークリップの再生速度

    はじめまして。 2週間程前から初めてFLASHを製作をしているのですが、フレームレートの件で行き詰まったので質問させていただきます。 30fpsのタイムライン上に、17fpsで動くムービークリップ(内容は6枚のコマアニメ?です)を置きたいんですが、このような場合はどのようにすれば良いのでしょうか。 アクションスクリプト等でムービークリップの再生速度を変更する事は可能なのでしょうか。 環境はWinXP・FLASH MXです。宜しくお願い致します。

  • FLASHの同一タイムラインで、複数のムービークリップを順に再生したい

    ムービークリップを複数作成しました。(名前を仮にa_mc, b_mc, c_mcとします。) このムービークリップを順に再生していきたいので、同一タイムライン上の 1フレーム目にa_mc 2フレーム目にb_mc 3フレーム目にc_mc と配置し、タイムラインの最後のフレームに this.stop(); とスクリプトを書きましたが、a_mcの再生が終わったところ(=1フレーム目)で停まってしまいます。 1フレーム目の後、2フレーム目以降(b_mcとc_mc)を続けて再生するには、どのようにすれば良いのでしょうか?

    • ベストアンサー
    • Flash
  • 7秒後にフレーム5へ移動してムービークリップを再生

    はじめまして。 FLASH初心者です。 レイヤー1~5の5フレームごとにムービークリップを配置しています。 レイヤー1の1フレーム目に配置してあるムービークリップが再生されて、7秒後にレイヤー2の5フレーム目に配置してあるムービークリップを再生し、(レイヤー3~5も同様に…)レイヤー5に配置してあるムービークリップの再生が終わったら、また7秒後にレイヤー1のムービークリップが再生される…といったように繰り返すにはどのようなActionScriptにすればよいのでしょう? 色々、試行錯誤したのですがうまくいきません。 どなたか教えて頂けませんか? よろしくお願いします。

    • ベストアンサー
    • Flash
  • 【新】超初心者です。思うように動いてくれません。

    たびたび申し訳ありません。勘違いがありましたので再投稿いたします。 下記の同タイトル質問はご放念ください。 「シーン1」にムービークリップ「MC01~10」を作成し、MC01から順に再生してゆくFLASHを作成しています。 それぞれのムービークリップの中に早送りボタン配置し、これを押すと次のムービークリップの指定したフレームに移動して再生してほしいのですが、思うように動いてくれません。 _root.mc##.gotoAndPlay(*); もダメでしたし、 _root.nextFrame(*); もダメでした。 (*=該当フレームの数) _root.nextFrame(); で指定すると、次のムービークリップの一番初めから再生はしてくれるのですが、 そのムービークリップ内の指定したフレームから開始したいのです…。 (そもそも、_root.nextFrame(*);が正しいのかどうかもよくわかっていません…) 使用しているのはAdobe Flash CS3 Progessional、Vistaにて作業しています。 まったくの初心者のため、説明不足・意味不明な表現がありましたらご指摘いただければと思います。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • AS3でムービークリップ再生・早送り・巻き戻し

    フラッシュ AS3 初心者です。 シーン1に配置されたムービークリップ(mc)を、再生・早送り・巻き戻し・停止ボタンでコントロールしたいのですがよくわかりません。 早送り・巻き戻しは速度を設定で変えられるとうれしいです。

    • ベストアンサー
    • Flash