一定処理せずに待つアクションスクリプト

このQ&Aのポイント
  • Flash MXを使用している場合、getTimer関数を使用して一定の待ち時間を作ることはできます。
  • しかし、質問者が作成したプログラムではgetTimer関数を使った条件分岐が正しく機能していないようです。
  • これは、getTimer関数がフレームごとに呼び出されるため、条件式が一度しか評価されないためです。
回答を見る
  • ベストアンサー

一定処理せずに待つアクションスクリプトを教えて下さい。

こんにちは、 現在WinでFlash MXを使用してます。 getTimer関数を使用して待ち時間を作ってみたのですが動作しません。 現在作成したプログラムは ◆1フレーム目 startTime = getTimer(); timeOut = 3000; ◆2フレーム目 if( getTimer() > startTime + timeOut ){ gotoAndPlay(3); } else{ gotoAndPlay("lop"); } このようになっており、 ”3フレーム目”にジャンプしてほしいのですが、 ジャンプしません。 何故でしょうか?

  • ogoo
  • お礼率97% (68/70)
  • Flash
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

フレームアクションは、再生ヘッドがフレームに来た、その時1度しか実行されません。 また、Flash はリソースの過剰占有やシステムフリーズを避けるために、同一フレームに連続して再生ヘッドをセットできない設計になっています。 よって、変数の値の監視などのように繰り返しスクリプトを実行させたい場合は、複数のフレーム間を gotoAndPlay でループさせて再生ヘッドを何度もセットし直すか、あるいは、ムービークリップがステージに存在している間常に発生している enterFrame イベントを利用する必要があります。 フレーム1に、” lop ”というフレームラベルを付けていませんでしょうか? フレーム1にこのラベルが付いているとすると、フレーム1~2間をループするので、スクリプトはその都度実行されます。 if 文の条件が不成立の時はフレーム” lop ”(おそらくフレーム1だと思いますが)に戻り、再びフレーム1のスクリプトも実行されます。 となると、変数 startTime の値もフレーム1での getTimer の戻り値に更新されることになります。フレーム1から2への移動にかかる時間は、理論上はフレームレート分の1秒しかかからないのですから、startTime と timeOut との和が、フレーム2での getTimer の戻り値よりも小さくなることはまずありえません。従って、if 文の条件がいつまでも成立せず、フレーム3への移動は行われないことになります。 要するに、startTime の値が毎回更新されることが原因ではないかと思います。 フレームアクションで実現するのであれば、現在フレーム2に設定しているアクションをフレーム3に移し、フレーム2に空きフレームを作って、待ち時間が経過していないうちはフレーム2に戻り、経過後に先に進むようにしてはいかがでしょう。 ちなみに、フレーム間のループではなく、ムービークリップの enterFrame イベントと getTimer で待ち時間を実現する作り方は、以前、別の質問で紹介したことがあります。よろしければご参照ください。  ・○秒後にフレーム移動   http://okweb.jp/kotaeru.php3?q=793619 ------------------ Flash MX をお使いでしたら、setInterval というアクションを使う方法もあります。 setInterval は本来、一定時間ごとに繰り返し指定の関数を呼び出すアクションですが、任意のタイミングで呼び出しをキャンセルすることもできます。 この仕組みを利用し、一旦 setInterval でフレーム3に移動して、フレーム3で呼び出しをキャンセルすると、一定時間後にフレームを移動するという処理になります。 正式には関数を作って登録するところですが、関数を作るまでもない処理の場合は、呼び出す関数の指定である第1引数に、匿名の関数として直に関数を書いても構いません。 スクリプトにしますと、次のようになります。 (↓このスクリプトをコピーして使う場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)  ・フレーム1のスクリプト   //3秒後にフレーム3に移動   timer_ID = setInterval( function(){ gotoAndPlay( 3 ); } , 3000 );   //一定時間、ここで待機   stop();  ・フレーム3のスクリプト   //関数の呼び出しをキャンセルする   clearInterval( timer_ID ); 関数を呼び出す間隔(第2引数)はミリ秒で指定します。例えば3秒ごとであれば、3000 となります。 setInterval の戻り値はタイマーの識別番号です。この識別番号は clearInterval で関数の呼び出しをキャンセルする時に必要ですので、setInterval を実行した時に変数に保存しておきましょう。 長くなってすみませんでした。 不明な点がありましたら、補足してください。

ogoo
質問者

お礼

お礼が遅くなりましてすいません。 とても丁寧に詳しく教えていただきありがとうございました。 「フレーム1に、” lop ”というフレームラベルを付けていませんでしょうか?」 この質問ですが、フレーム2につけていました。 フレーム数を増加させ、この部分の修正をしたところ 動作しました。 本当に助かりました。ありがとうございます。 またsetIntervalも試してみましたが、動作しなかったので、そちらのほうはもう少し検証してみます。

関連するQ&A

  • FlashMXでウェイト処理

    数秒間のウェイトを入れたいとき、 [frame 1]--------------------------  start = getTimer();  limit = 2000; [frame 3]--------------------------  if( getTimer() > start + limit ){   gotoAndPlay( _currentFrame +1 );  }else{   gotoAndPlay( _currentFrame -1 );  } というようにぐるぐる回しているのですが、頻繁に使う処理なので サブルーチンにしようと思います。 ルートのタイムライン 1フレーム目に  function wait( start, limit, nowframe ){   if( getTimer() > start + limit ){    gotoAndPlay( nowframe +1 );   }else{    gotoAndPlay( nowframe -1 );   }  } と書きムービークリップの中から  wait( start(前のフレームで定義), 2000, _currentFrame ); 呼び出したのですが、goto先がムービークリップの中ではなく ルートタイムライン上のフレームになってしまいます。 よくよく考えれば当たり前です。 goto~をサブルーチン化して、呼び出し元のタイムラインに対し 処理させるということは出来ないのでしょうか。

  • 経過時間について

    こんにちは 経過時間を0から表示して、ボタンが押されたら経過時間の計測・表示をストップし次のフレームに行き、また0から経過時間を表示したいのですが、どうすればいいでしょうか? 時間を表示させるdisptime.textとbtnというボタンをステージに配置しています。↓いろいろ試してみたのですが、フレーム移動した際に経過時間を0から表示させる方法がわかりません。。 flash8を使っています。 stop(); startflag=true; this.onEnterFrame=function(){ if(startflag==true){ starttime=getTimer(); keika=getTimer();-starttime; disptime.text=Math.floor(keika/1000); } }; btn.onRelease = function(){ startflag=false; nextFrame(); };

    • ベストアンサー
    • Flash
  • Actionscriptでのフレーム間の移動

    // ここで実際に○を移動させる Pofmaru1(l); Pofmaru2(r); // maru1を移動させる関数Pofmaru1 function Pofmaru1(l) { if (l == 1) { gotoAndPlay("maru1",2); }else if (l == 2) { ・・・・・・ // maru2を移動させる関数Pofmaru2 function Pofmaru2(r) { if (r == 1) { gotoAndPlay("maru2",2); }else if (r == 2) { ........ maru1を移動させる処理を呼んで、gotoAndplayでmaru1レイヤーの2フレーム目へ飛び、2フレーム目が再生されたら、次にクイックソートのプログラムに戻り、関数 Pofmaru2(r); を処理するようにしたいのですが、うまくいきません。C言語であれば普通if文の処理がされたら自動でプログラムに戻ってきて、Pofmaru2(r);の処理へ移ると思うのですが....Actionscriptはそうならないのでしょうか? ネットや本などで色々調べてみたのですが解決策が見つからず行き詰ってしまって困っています。 flash mxでプログラム通りにフレーム間を移動するようにするのは無理なのでしょうか?

  • suzukaのスクリプトで

    suzukaでFlashを制作しております。 プログラムはさっぱりなので検索して出てきたactionscriptを切り貼りして試している状況です。 その1.フレームアクションにおいて、キーを押したら特定のフレームまで移動するスクリプトを入れたいので20フレーム目に以下のスクリプトを入れたのですが、どちらも使えませんでした。具体的な解決策はありますでしょうか。 ●[parse error]とエラーが出る this.stop(); on(keyPress ("a")){ _root.gotoAndPlay(21); } ●キーを押しても何も起こらない this.stop(); if(Key.isDown(Key.RIGHT)){ _root.gotoAndPlay(21); } else if(Key.isDown(Key.LEFT)){ _root.gotoAndPlay(31); } その2.フレームアクションの10フレーム目に this.stop(); buttonA.onPress=function(){ _root.gotoAndPlay(11); }; とボタンのスクリプトを入れると、 どこのフレームまで移動しようが 同じボタンへの命令で上書きするまで このボタンへの効果が持続されてしまうのですが、 押した瞬間に後に命令を引き継がせないスクリプトの記述はありますか?

    • ベストアンサー
    • Flash
  • gotoAndPlayされないです

    はじめてFlashを作ります。 "ATTACK1"と"ATTACK2"のフレームを0.2秒の間隔で10回交互に表示したあと、 "ATTACK3"と"ATTACK4"のフレームをenterが押されるまで交互に表示する というプログラムを作りたいのですが、 "ATTACK1"と"ATTACK2"のフレームを交互にずっと表示されるだけで、 ATTACK3へ移動しません。 "ATTACK1"というラベルのフレームに以下のように書きました。 ActionScript2.0でやっています。 どこが悪いのか教えてください。お願いします。 ATTACK1フレームのActionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; if( count >= 10 ){ gotoAndPlay("ATTACK3"); count=0; delete this.onEnterFrame(); } gotoAndPlay("ATTACK2"); count=count+1; delete this.onEnterFrame(); } } }; ATTACK2フレームのAcctionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; gotoAndPlay("ATTACK1"); delete this.onEnterFrame(); } } };

    • ベストアンサー
    • Flash
  • FLASH CS5でnow loadingでランダム再生を読み込みたい

    FLASH CS5でnow loadingでランダム再生を読み込みたい FLASH CS5で10枚の画像(表示されいるのは1枚で、左右に隣の画像が少し見える感じ)があり、その下に右、左のボタンがありを押していくと、画像が切り替わっていくアニメなのですが 開始のフレームをアクセスする度に変わるランダムにしたいです。(開始の画像が入るたびに変わる) そのためにnow loadingですべてを読み込ませてからスタートさせないとなのですが、 1フレーム目に以下のタグを入れました。 このやり方だと、エラーがでます。 //再生停止 stop(); //イベントリスナーを登録 //(毎フレーム時間で実行,実行関数 goRnandom) this.addEventListener(Event.ENTER_FRAME,goRnandom); //関数 goRnandom の定義 function goRnandom(evt:Event):void { //変数 per にロードされたパーセントを取得 var per:Number = this.loaderInfo.bytesLoaded / this.loaderInfo.bytesTotal * 100; // //もしロードパーセンテージが 100 に達すれば if (per >= 100) { //登録したイベントリスナーを削除 this.removeEventListener(Event.ENTER_FRAME, goRnandom); //変数 rnd_num に 0以上1未満 のランダムな数を代入 var rnd_num:Number = Math.random(); if (rnd_num < 10 / 100) { gotoAndPlay(2); } else if (rnd_num < 10/100) { gotoAndPlay(8); } else if (rnd_num < 10/100) { gotoAndPlay(14); } else if (rnd_num < 10/100) { gotoAndPlay(20); } else if (rnd_num < 10/100) { gotoAndPlay(26); } else if (rnd_num < 10/100) { gotoAndPlay(32); } else if (rnd_num < 10/100) { gotoAndPlay(38); } else if (rnd_num < 10/100) { gotoAndPlay(44); } else if (rnd_num < 10/100) { gotoAndPlay(50); } else { gotoAndPlay(57); } } } どこか間違っている箇所はあるのでしょうか? 教えてください。

    • ベストアンサー
    • Flash
  • flashのActionscriptでのムービーとのタイミング処理

    スクリプトの途中だけの部分ですが 再帰の中で // ここで実際に○を移動させる Pofmaru1(l); Pofmaru2(r); 再帰の外で // maru1を移動させる関数Pofmaru1 function Pofmaru1(l) { if (l == 1) { gotoAndPlay("maru1",2); }else if (l == 2) { ・・・・・・ // maru2を移動させる関数Pofmaru2 function Pofmaru2(r) { if (r == 1) { gotoAndPlay("maru2",2); }else if (r == 2) { ........ として、移動先のフレームにmaru1,maru2を目的の場所へ移動するムービーを呼び出して再生するようにしたいと思いました。 しかし、最後のムービーだけしか表示さえれない状態です。if文で指定のフレームへ移動してそのムービーが再生されてから、次のプログラムの動きへ移るようにしたいと思いました。そこでタイミング処理をすればいいのではないかと思ったのですが、いろいろ調べてみたのですが、プログラムがあまり得意では無く、再帰の中でフレーム移動の関数を呼び出しているので、どうしたらいいのかわからず行き詰ってしまい困っています。Actionscriptとムービー再生のタイミング処理はどうしたらいいのでしょうか? アドバイスください。お願いします。

  • FLASHのActionScriptについて

    すみません。どなたか教えてください。  風景の画像が時間が来たら、次の風景が移る様にしたいのです。 静止している様に見える"2"のフレームを2フレームにして、2フレーム目に gotoAndPlay("シーン 1", "02") を入れてループさせています。120秒後に"03"フレームに移動させるよう、隠しオブジェクトに以下のスクリプトを記入しました。 onClipEvent (load) { beforeTime = getTimer(); n = 0; } onClipEvent (enterFrame) { nowTime = getTimer(); n = n+nowTime-beforeTime; beforeTime = nowTime; if (n>120000) { gotoAndPlay("シーン 1", "03"); n = 0; } } しかし、初めのgotoが無視されたように、書き出してしまいます。ここを Stop() にするとずーととまったままです。何か方法はないのでしょうか?

  • flash mxで処理を待機させておく方法は.....?

    以前にも質問させていただいたのですが、非同期処理であるという事にも手こずって、どうしても解決できなく行き詰ってしまっています。 スクリプトの途中だけの部分ですが 再帰の中で // ここで実際に○を移動させる Pofmaru1(l); Pofmaru2(r); 再帰の外で // maru1を移動させる関数Pofmaru1 function Pofmaru1(l) { if (l == 1) { gotoAndPlay("maru1",2); }else if (l == 2) { ・・・・・・ // maru2を移動させる関数Pofmaru2 function Pofmaru2(r) { if (r == 1) { gotoAndPlay("maru2",2); }else if (r == 2) { ........ と書いてレイヤーmaru1とレイヤーmaru2の指定フレームへ移動しムービー再生後にソートプログラムへ戻り次の処理へ移るようにしたいのですがwhile文でflagを使い処理を待たせることを考えたのですがflashは非同期であるためflagの値のやり取りが上手く行きませんでした。 タイミング処理においてコールバック関数というものがあるという所に行き着いたのですがプログラムがあまり得意でなくイマイチ理解することができません・・。 flash mxで処理を待機させておくといったことを実現するにはどのように対処するといいのでしょうか? 何かアドバイスください。お願いします。

    • ベストアンサー
    • Flash
  • FLASH での基本的なアクションについて教えてください

    ご教授お願いします。 Flash CS3を使用しております。 1フレーム目で停止し、そこで表示されているボタン(b1というインスタンス名)をクリックすると2フレーム以降が再生されるファイルを 作成しようとしていますが、うまくアクションさせることができません。ボタンはちゃんと機能していると思います。 現在、私が1フレーム目に入力しているアクションは下記のとおりです。 this.stop() function gotoAndPlay(2); b1.addEventListener(MouseEvent.CLICK,gotoAndPlay); どのあたりが不適切なのでしょうか? 以前にFlash5を使用したことがあり、その際はボタンへのアクションも選択するだけで簡単にできたのですが、CS3はやはり高機能だけにやや難解です。 詳しい方には、あまりに基本的な質問かもしれませんが 格闘すること数時間、先に進まず困っております。 どなたかご教授いただけますと、大変ありがたいのですが・・・。

専門家に質問してみよう