プロが教える店舗&オフィスのセキュリティ対策術

こんにちは、
現在WinでFlash MXを使用してます。
getTimer関数を使用して待ち時間を作ってみたのですが動作しません。
現在作成したプログラムは

◆1フレーム目
startTime = getTimer();
timeOut = 3000;

◆2フレーム目
if( getTimer() > startTime + timeOut ){
gotoAndPlay(3);
}
else{
gotoAndPlay("lop");
}

このようになっており、
”3フレーム目”にジャンプしてほしいのですが、
ジャンプしません。
何故でしょうか?

A 回答 (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 を実行した時に変数に保存しておきましょう。


長くなってすみませんでした。
不明な点がありましたら、補足してください。
    • good
    • 0
この回答へのお礼

お礼が遅くなりましてすいません。
とても丁寧に詳しく教えていただきありがとうございました。

「フレーム1に、” lop ”というフレームラベルを付けていませんでしょうか?」
この質問ですが、フレーム2につけていました。
フレーム数を増加させ、この部分の修正をしたところ
動作しました。
本当に助かりました。ありがとうございます。

またsetIntervalも試してみましたが、動作しなかったので、そちらのほうはもう少し検証してみます。

お礼日時:2005/01/09 23:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!