トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     gotoAndStopでそのフレームのコードが2度実行される
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
gomomo
Åê¹ÆNo.38892
投稿日時: 2008-5-21 10:16
新米
居住地: 東京
投稿: 16
使用環境:
WinXP PRO
Flash CS3
gotoAndStopでそのフレームのコードが2度実行される
こんにちは
いつもお世話になってます。

CS3でスライドショーを作っていてどうも納得のいかない挙動をしたので質問させてください。

メインのタイムラインの1フレームに
this.stop();
そして、適当なMovieClipを置きます。(インスタンス名test_mc)
で、その置いたMovieClipには1フレーム目に
this.stop();
5フレーム目に
trace("test");

この状態でメインタイムラインの1フレーム目
this.stop()の後に
test_mc.gotoAndStop(5);
で実行するとtestが2回出力されます。

ちなみにtest_mcの5フレーム目にも
this.stop();
を書いて
test_mc.gotoAndPlay(4);
とすると思ったような挙動なのですが、厳密に言うと1フレーム時間が経過してるので、即時実行ではないですよね?

なぜこのような挙動になるのでしょうか?
お願いいたします。


----------------
GOMOMO

ひろゆき
Åê¹ÆNo.38894
投稿日時: 2008-5-21 11:06
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: gotoAndStopでそのフレームのコードが2度実行される
引用:
gomomoさんは書きました:
ちなみにtest_mcの5フレーム目にも
this.stop();
を書いて
test_mc.gotoAndPlay(4);
とすると思ったような挙動なのですが、

「思ったような挙動」とは、どのような挙動なのか、
第三者にも分かるように説明された方が良いように思いますが。


----------------
質問する際は、回答者に具体的な情報を与えてください。

とんび
Åê¹ÆNo.38896
投稿日時: 2008-5-21 13:44
Bak@Fla大巨匠
居住地: 佐賀県 杵島郡
投稿: 275
使用環境:
MX
CS3
:Flash CS6:CS6
.7.5
Re: gotoAndStopでそのフレームのコードが2度実行される
ActionScript3.0

 ウチの環境でも起きます。メインタイムラインのstop()はなくても2回です。

 ActionScript2.0だと同じスクリプトでも実行は1回ですね。それに、ステージに置いたムービークリップの最初のフレームのstop()を外すとこれまた1回になります。

 …バグ?


----------------
鳶嶋工房

ひろゆき
Åê¹ÆNo.38898
投稿日時: 2008-5-21 13:58
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: gotoAndStopでそのフレームのコードが2度実行される
こういうことですか?

AS2.0書き出し
// _root 第1フレーム
stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
stop();
// test_mc 第5フレーム
trace("test");	// 1回のみ


AS2.0書き出し
// _root 第1フレーム
//stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
stop();
// test_mc 第5フレーム
trace("test");	// 1回のみ


AS3.0書き出し
// _root 第1フレーム
stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
stop();
// test_mc 第5フレーム
trace("test");	// 2回


AS3.0書き出し
// _root 第1フレーム
//stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
stop();
// test_mc 第5フレーム
trace("test");	// 2回


AS3.0書き出し
// _root 第1フレーム
stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
//stop();
// test_mc 第5フレーム
trace("test");	// 1回のみ


----------------
質問する際は、回答者に具体的な情報を与えてください。

gomomo
Åê¹ÆNo.38900
投稿日時: 2008-5-21 16:50
新米
居住地: 東京
投稿: 16
使用環境:
WinXP PRO
Flash CS3
Re: gotoAndStopでそのフレームのコードが2度実行される
レスありがとうございます。
試したところひろゆきさんの一番下の

AS3.0書き出し
// _root 第1フレーム
stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
//stop();
// test_mc 第5フレーム
trace("test");	// 1回のみ


は2回表示されました。
AC3ではgotoAndStopで、そのフレームのスクリプトが2回実行されるようです。
とんびさんの言うようにAC2で書き出せば一回しか表示されません。

あと、

AS3.0書き出し
// _root 第1フレーム
stop();
test_mc.gotoAndPlay(4);

// test_mc 第1フレーム
stop();
// test_mc 第5フレーム
trace("test");	// 1回のみ


は一回ですが、最初の書き込みで書いたとおりこれだと1フレーム分遅れてしまいます。


----------------
GOMOMO

ニノミヤ カズノリ
Åê¹ÆNo.38903
投稿日時: 2008-5-21 18:05
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: gotoAndStopでそのフレームのコードが2度実行される
// _root 第1フレーム
stop();
test_mc.gotoAndStop(5);

// test_mc 第1フレーム
stop();    // ←実行されない
// test_mc 第5フレーム
trace("test");

上記コードの場合、AS3.0 では test_mc の第1フレームのスクリプトは実行されないはずです。
なぜなら親のフレームスクリプトによって test_mc は第1フレームのスクリプトを実行する前に移動してしまっているからです。
この時点で AS2.0 との挙動に違いがあります。

以下勝手な憶測ですが、MovieClip は登場時、
必ず現在居るフレームのスクリプトを一回は実行するのではないでしょうか。
(それが例え親オブジェクトにより stop をかけられていても)
本来は第1フレームのスクリプトを実行するはずが、今回の場合その処理を行う前に

5フレーム目に移動
   ↓
5フレーム目のスクリプト実行
   ↓※ 前後しているかもしれませんが
初回行動(現在のフレーム、つまり5フレーム目のスクリプト実行)

と言う順序で2回同じ処理をしていると考えます。
(AS2.0 では移動前に初回行動するので2回処理を行わない)
gomomo
Åê¹ÆNo.38906
投稿日時: 2008-5-22 0:05
新米
居住地: 東京
投稿: 16
使用環境:
WinXP PRO
Flash CS3
Re: gotoAndStopでそのフレームのコードが2度実行される
レスありがとうございます

すいません。ちょっとわかりづらいのですが
つまりgotoAndStopは
gotoで一回実行
stopで一回実行
って感じでしょうか?
まさに、挙動はその通りだと思います。
実際、andというキーワードが気になって、ヘルプでgotoというメソッドが増えたのかと思って探しました。

バグっぽいとも思ったのですが、こんなわかりやすいものはとっくに修正されてる気もしますので、気づいてて仕様としてそうしてるような気もします。
反面、この挙動の方が好ましい局面はないような気もするのですがどうなんでしょうか?


----------------
GOMOMO

ニノミヤ カズノリ
Åê¹ÆNo.38907
投稿日時: 2008-5-22 2:20
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: gotoAndStopでそのフレームのコードが2度実行される
分かりやすく説明できるのか不安ですが、私の考えを細かく説明してみます。

まず最初に AS2.0 と AS3.0 で1フレーム目から処理が違うと言うのはお分かり頂けたでしょうか?
例えば下記を実行したらその違いが分かります。
ルート 第1フレーム
stop();
test_mc.gotoAndStop(5);

test_mc 第1フレーム
stop();
trace("1フレーム目です。");

test_mc 第5フレーム
trace("5フレーム目です。");


すると結果はこうなるはずです。
AS2.0
1フレーム目です。
5フレーム目です。

AS3.0
5フレーム目です。
5フレーム目です。

AS3.0 の場合、1フレーム目の処理が実行されていません。
この処理の違いを頭の片隅に入れておいてください。


次に下記について説明します。
MovieClip は登場時に必ず現在居るフレームのスクリプトを一回は実行するのではないでしょうか。

ルート
----------------------
フレーム数 | 1 | 2 |
----------------------
レイヤー  | ○ | ● |
----------------------
スクリプト | ○ | a |
----------------------
○=空のフレーム
●=MCがあるフレーム(仮にこのMCを上でも使った test_mc とします)
a=フレームスクリプト

test_mc 第1フレーム
trace("hoge!");

a(フレームスクリプト)
test_mc.stop();

例えば上の様にタイムラインの2フレーム目に MovieClip(test_mc) を配したとします。
この場合、2フレーム目に移動すると自動的に test_mc は再生を開始します。
再生と言う事は自動的に再生ヘッドにあるフレームスクリプトも実行される訳です。
これは test_mc に stop を掛けていても必ず一回は実行されます。
(この一回目の処理を適当に"初回行動"と名前を付けておきます)

結果(一回処理した後、ストップ)
hoge!

ここで冒頭で述べた処理の違いが出てきます。
AS3.0 での結果を見る限り、
初回行動をする前に gotoAndStop によって再生ヘッドが移動しているのではないでしょうか。
つまり処理としては下記の様な流れになります。

AS3.0
gotoAndStop により5フレーム目に移動
      ↓
5フレーム目のスクリプトを実行
      ↓ ※ 前後しているかもしれませんが
初回行動:再生ヘッド(5フレーム目)のスクリプトを実行

初回行動は必ず実行される訳ですから、
gotoAndStop によって5フレーム目で処理を止めようとしても意味がありません。
その結果、2回同じ処理を繰り返すのだと予想します。

本来であれば AS2.0 の動きが望ましいところです。

AS2.0
初回行動:再生ヘッド(1フレーム目)のスクリプトを実行
      ↓
gotoAndStop により5フレーム目に移動
      ↓
5フレーム目のスクリプトを実行


防ぐ方法として

ルート
----------------------
フレーム数 | 1 | 2 |
----------------------
レイヤー  | ● ● |
----------------------
スクリプト | ○ | a |
----------------------
○=空のフレーム
●=MCがあるフレーム(仮にこのMCを上でも使った test_mc とします)
a=フレームスクリプト

フレームスクリプトで test_mc を操作する1フレーム前に既に配置しておきます。
配置の仕方はどんな形でも良いです。見えなくても良いでしょう。
MovieClip に初回行動させてあげる余裕を持たせてあげれば
2回同じ処理をする不具合はなくなると思います。

引用:
gomomoさんは書きました:
つまりgotoAndStopは
gotoで一回実行
stopで一回実行
って感じでしょうか?

そう言うわけではありません。
これだと常に2回処理を実行する事になってしまいます。

引用:
gomomoさんは書きました:
バグっぽいとも思ったのですが、こんなわかりやすいものはとっくに修正されてる気もしますので、気づいてて仕様としてそうしてるような気もします。
反面、この挙動の方が好ましい局面はないような気もするのですがどうなんでしょうか?

私自身はイレギュラー、バグだと思っています。

以上です。
私の考えが伝わったでしょうか。
では長々と失礼致しました。
gomomo
Åê¹ÆNo.38910
投稿日時: 2008-5-22 14:33
新米
居住地: 東京
投稿: 16
使用環境:
WinXP PRO
Flash CS3
Re: gotoAndStopでそのフレームのコードが2度実行される
ありがとうございます。
たぶん?わかりました!

インスタンス化>初回行動>外部からのフレームの移動
であるべきところが
インスタンス化>外部からのフレームの移動>初回行動
になってるって感じでしょうか?

提示していただいた
引用:

防ぐ方法として

ルート
----------------------
フレーム数 | 1 | 2 |
----------------------
レイヤー  | ● | ● |
----------------------
スクリプト | ○ | a |
----------------------
○=空のフレーム
●=MCがあるフレーム(仮にこのMCを上でも使った test_mc とします)
a=フレームスクリプト

か、
フレームを使わないでスクリプトのみでやるか、
1フレーム分の時差に目をつむるかしかなさそうですね。

ちょっと実験をしてみました。
引用:

root1フレーム目
this.stop();
test_mc.gotoAndStop(1);
test_mc.gotoAndStop(2);
test_mc.gotoAndStop(3);
test_mc.gotoAndStop(4);
test_mc.gotoAndStop(5);

test_mcの1?5フレームにそれぞれ
trace(1);?trace(5);


これで実行するとAC2では
1
2
3
4
5
AC3では
5
5
5
5
5
になります。
gotoAndStopのヘルプを見ると

引用:

このムービークリップの指定されたフレームに再生ヘッドを送り、そこで停止させます。この処理は、フレーム内のすべての残存アクションが実行を完了した後に行われます。

となっています。
上のバグ?とヘルプの説明を合わせると
1
2
3
4
5
5
となりそうなもんですが・・・
微妙に一貫性がないというか、やっぱりバグっぽいですね。

どうもありがとうございました。


----------------
GOMOMO

ニノミヤ カズノリ
Åê¹ÆNo.38911
投稿日時: 2008-5-22 14:50
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: gotoAndStopでそのフレームのコードが2度実行される
引用:
gomomoさんは書きました:
インスタンス化>初回行動>外部からのフレームの移動
であるべきところが
インスタンス化>外部からのフレームの移動>初回行動
になってるって感じでしょうか?

はい、その通りです。
2回処理する理由は、内部処理が分かりませんので推測でしか語る事が出来ません。
恐らくこう言う事だろうと私は考えます。
また、親から処理を受けている点がその処理の順序に影響を与えている可能性もあります。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops