【お題】絵本のタイトル

stopとgotoAndStopの違いについて、今ひとつ理解出来ていません。教えて頂けませんでしょうか。

gotoAndStopは、当該のフレームにジャンプして再生を止める、stopは再生中のSWFファイルを中止する、と言う抽象的な記述をHELPで見ましたが、

・gotoAndStopでジャンプしたフレームのフレームアクションに記述されているScriptは実行されるのですか?。

・stopが記述されているScriptの、stop文以降のStatementは実行されるのでしょうか?。

・再生ヘッドの関係とstopの関係、ムービーやボタン等のシンボルのアクションとの関係が整理出来ていません。

どうぞ宜しく御願い致します。

A 回答 (3件)

> 「当該のフレームが再生される」度に実行されると言う事ですか?。




再生されるというと、また、再生ヘッドが来た時とか何とかで語弊があるかと思い、「存在する間」と説明させていただきました。

#1でも書いた通り、stop でメインのタイムラインが止まっていても、ステージにあるムービークリップはそのまま消えずに残っており、onClipEvent や on は有効です。
enterFrame イベントもこれと同じで、ステージにムービークリップがある限り有効です。
ただ、press や release などのマウスイベントは、ステージにムービークリップやボタン(のインスタンス)があってもユーザーがマウスの操作をしなければ発生せず、従ってスクリプトも実行されません。
しかし enterFrame イベントは、ユーザーの操作に関わらず、ステージにムービークリップがあるだけで発生します。また、フレームアクションのように再生ヘッドが来たその時1度限りではなく、ステージにある間ずっと発生しています。
従って、enterFrame イベントを利用したスクリプトは、ムービークリップがステージにある間、定期的(フレームレート分の1秒ごと)に実行されます。
このような性質ですから、タイムラインを使わずにアニメを切り替えたり、フラグを監視したりするのに向くイベントなのです。

あまり難しく考えず、enterFrame を使うと、ムービークリップがステージに表示されている間、定期的にスクリプトが実行されると考えると、いいと思いますよ。
    • good
    • 0

> 「gotoAndPlay(2) ;」にすると永久ループになってしまいます。




永久ループというより、フレーム1→2→1で、2回目の1に来た時に止まる、というループではないでしょうか?
「ムービープレビュー」は、デフォルトではループ再生になっています。(「制御」→「ループ」のチェックを外すとループしなくなります)
このせいで、フレーム1から gotoAndPlay で2に行き、また1に戻って stop で止まるのかと思ったのですが、どうも、ループを解除しても1に戻ってしまうようです。
どういう理由でこうなるのか、よく分かりませんが。。。
続くフレームがないしループ再生もしていないから、gotoAndPlay にしても最後のフレームで自動的に止まるだろうとは思わないで、止めたい箇所ではきちんと stop や gotoAndStop を入れた方がよさそうです。
プログラムは上から順に実行されます。#1では説明のために stop を先頭に持ってきましたが、普段は最後に stop を入れると分かりやすいかと思います。


例えば、ボタンの操作でフラグの値が変わり、その値によって分岐したい場合などは、ボタンと同じフレームに設定した switch や if で値を監視していればいいような気がします。
しかし実際は、フレームアクションは、再生ヘッドが来たその直後に1回しか実行されません。
ですから、再生ヘッドが来たその時のフラグの値で条件判断が行われるきりで、stop で止まっていても、連続してフラグの参照と判断が行われるようなことはありません。”1回だけ”というのがクセモノと申したのは、そういう意味です。
もちろん、gotoAndPlay では再生ヘッドは止まらずに進みますので、これを利用して他のフレーム間を移動し続ければ、その度にフレームアクションは実行されます。
Flash では、gotoAndPlay で同じフレームに連続して再生ヘッドをセットし直すことはできないようです。例えばフレームが1つしかなく、ここで gotoAndPlay( 1 ); を実行しても、フレーム1に設定したフレームアクションは1度しか実行されません。

フラグを監視するような処理は、フレーム間をループして再生ヘッドを何回もセットし直す(違うフレームに行き、また戻ってくるようにしておけば、その都度フレームアクションが実行されます)か、あるいは、ムービークリップがステージに存在している間常に発生している enterFrame イベントを利用して作るのがオススメです。
enterFrame イベントはフレームレート分の1秒ごとに発生します。インスタンスのイベントですので、フラグを監視したり、タイムラインを使わずに一定時間ごとに処理をするなど、様々なことに利用できます。
外部ファイルの読み込みが終わるまで待つ処理はフレーム間の方が作りやすいのですが、ボタンが押された時のフラグの監視などは、enterFrame イベントを利用した方がボタンの反応が良くなります。フレーム間をループしていると、ダミーフレームが再生されている間はボタンが反応しなくなる場合があります。
    • good
    • 0
この回答へのお礼

そうですね。止めたい時は意図的にstop()を入れるクセをつけることですね。
enterframeイベントって、あまり使った事が無いと言うかちゃんと理解していないので使えないと言った方が良いかも知れません。
「ステージに存在する」=「当該のフレームが再生される」度に実行されると言う事ですか?。
当該と言うのは、そのムービークリップが置かれているという意味です。

ところでDPEさん、「Now Loading・・・・」の件、良いお知恵はありませんか?。


どうぞ宜しく御願い致します。

お礼日時:2004/09/15 17:11

簡単なサンプルを作って実験してみてはいかがでしょう。




例えば、フレーム1に trace("A");、フレーム2に

 trace("B");
 stop();
 trace("C");

というアクションを設定しますと、「出力」ウィンドウに

 A
 B
 C

と表示されます。
つまり、stop(); 以降のアクションも実行されています。

では、もう1つのパターン。
フレーム1に

 stop();
 trace("A");

ボタンを1つ置いて、そのボタンにオブジェクトアクションで gotoAndStop( 2 ); を設定します。フレーム2のアクションは先述のまま使います。
「ムービープレビュー」で見ると、「出力」ウィンドウには最初、Aが表示されます。ボタンを押すと再生ヘッドが移動し、残るBとCが表示されます。


フレームアクションは、”そのフレームに再生ヘッドが到達した時”に実行されるアクションです。
gotoAndStop で移動すると、移動先のフレームに再生ヘッドが到達し、そこでタイムラインが止まります。
再生ヘッドが到達した時にフレームアクションが実行されるのですから、移動先のフレームにあったフレームアクションは全て実行されますが、その時1度だけしか実行されません。
この、”1度だけ”というのがクセモノです。
例えば、フレーム1で

 stop();
 test = "AAA";

ボタンを置いて、ボタンが押された時に gotoAndStop( 2 ); 、フレーム2に trace( test ); 、フレーム2にもボタンを1つ置いて、ボタンが押された時に test に "BBB" を入れるとします。
フレーム1では、stop(); でメインのタイムラインは止まっていますが、test = "AAA"; は実行されるため、test には "AAA" が入っています。
フレーム1のボタンが押されると、再生ヘッドはフレーム2に移動して止まります。
フレーム2に再生ヘッドが来た時点で、フレームアクションである trace( test ); は実行されます。test の中身は "AAA" ですので、「出力」ウィンドウに AAA が表示されます。ここまでは問題ありませんよね。
では、フレーム2のボタンを押すとどうなるでしょうか?
フレーム2のボタンが押された時、test の中身は "BBB" に変わります。しかし、「出力」ウィンドウに test の中身は出力されません。
つまり、フレーム2の trace が実行されるのは、再生ヘッドが移動してきた、その時1度だけということです。
stop と gotoAndStop の違いは再生ヘッドが移動するかしないかの違いだけで、考え方は同じです。
stop を設定したフレームでも、再生ヘッドが来た時にはフレームアクションは実行されますから、stop 以降のスクリプトも実行されます。


メインのタイムラインが stop や gotoAndStop で止まっていても、ボタンが機能するのはなぜでしょうか?
インスタンスに設定する onClipEvent や on アクションは、”インスタンスに何かが起こった時”に実行されます。メインのタイムライン、もしくはインスタンスの元になっているムービークリップ自身のタイムラインが動いているかどうかは全く関係なく、インスタンスがステージに存在していて、インスタンスがアクティブ(有効)である限り実行されます。
Flash MX から加わった onPress や onRollOver などのイベントハンドラを使って、文法上、onClipEvent や on を使えない場所(フレームなど)にも、ムービークリップやボタンにイベントが起きた場合に実行する処理を定義しておけるようになりました。
これらは書き方が違うだけで、スクリプトが実行されるタイミングや原理は onClipEvent や on と同じです。

ビデオデッキで一時停止ボタンを押すと、動きは止まりますが、画面は消えずに残っています。
Flash もこれと似ていて、メインのタイムラインは止まっても、ステージに置かれた絵やインスタンスはそのまま残っています。
ステージに残っていれば、onClipEvent や on は有効です。
ただし、やはり Flash MX から導入された enabled プロパティを false にすると、ボタンとしての機能が無効になります。
以前もちょっと紹介しましたが、enabled を false にすると、ムービークリップやボタンが非アクティブになります。この状態では、インスタンスがステージに存在していて、onPress などのイベントを設定していても、クリックやロールオーバーなど、ボタンとしてのイベントは検出されなくなります。


文章で見るより、実際にやってみるのが一番分かりやすいかと思います。
先に紹介した例で、ボタンの代わりに簡単なアニメのムービークリップを置いて、いろいろ試してみてください。

この回答への補足

いつも丁寧にありがとうございます。

お陰様で少しづつ判って来ました。
アクションには、フレームアクション・ボタンアクション・ムービークリップアクションの3つがある事、その各々に何か起ったときにスクリプトが実行される事。

上記で述べられておられます「、”1度だけ”というのがクセモノ」と言うのと私が下記に書いているのとは違うものまのでしょうか?。

2つ目のパターンで、1フレームに
stop();
trace(”A");

2フレームの
trace(”B");
と入れておいて、1フレームに「gotoAndStop(2) ;」と記述すると、結果は「A」、「B」と表示されて止まりますが、「gotoAndPlay(2) ;」にすると永久ループになってしまいます。


パラメータを読み込んでのシーンの移動が出来ない件、何とか分かりました。テスト的に作成したファイルでは簡単に出来てしまうのに、既存ファイルにScriptを追加すると動きがおかしくなるのは、画像による処理の遅さが起因していました。

試しに、テストファイルに1枚のJPEGファイルを貼り付けた途端、既存のファイルと同じ現象が現れ、JPEGを削除すると何事もなかったかのように正常に動きます。
外部ファイルの読込みでは、タイムラグを考慮したロジックを教えて頂きましたが、まさかHTMLからのパラメータの受け渡し程度ではそのような必要は無いものと思っていました。しかしタイムラインを使って受け渡しの完了を確認してから条件文を処理すると、正しく動く事が出来ました。

ありがとうございます。
 

補足日時:2004/09/14 22:06
    • good
    • 0

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