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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     gotoAndPlayで再生する場合としない場合がある
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
冬雪
Åê¹ÆNo.21482
投稿日時: 2005-11-15 13:59
半人前
居住地: 杜の都
投稿: 31
使用環境:
MacOSX10.4.6
FlashPro8
Firefox
gotoAndPlayで再生する場合としない場合がある
こんにちは。お世話になります。
やっと簡単なASを扱えるようになったレベルです。

gotoAndPlayをイベントによって実行した時と、単純に親フレームが読み込まれた時に実行するようにした時とで違う動きをすることが、なぜそうなるのかわからなくて以下の物を作ってみました。

ルートにキーフレームを1つ作成し、そこに同じシンボルからなるインスタンスを2つ(mc1_mcとmc2_mc)配置しています。

そのシンボルはフレーム数が3つで全てキーフレームのパラパラアニメになっています。
フレーム1のフレームアクションに

this.stop();

としています。

そしてルートのフレームアクションに

this.stop();
this.onMouseDown=function(){
	this.mc1_mc.gotoAndPlay(2);
}
this.mc2_mc.gotoAndPlay(2);

としています。

これをムービープレビューすると、mc2_mcのフレーム2が表示された状態で停止します。
ステージをクリックすると、mc1_mcがフレーム2→3→1とアニメして停止します。

gotoAndPlayは指定のフレームから再生するのだから、mc2_mcもmc1_mcと同じように動くと思っていたのですが、何故動かないのかがわからないのです。

ただし、シンボルのフレーム2に
this.play();
を記述してみると、mc2_mcもアニメするようになります。

でもgotoAndPlayしてるのにわざわざまたthis.playしないといけないのが納得いかず…。

スクリプトのミスや、そもそもgotoAndPlayの考え方に間違いがあれば指摘して下さると嬉しいです。
それとも、「そういうもの」なのでしょうか?(汗)
野中文雄
Åê¹ÆNo.21485
投稿日時: 2005-11-15 14:28
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: gotoAndPlayで再生する場合としない場合がある
「そういうもの」といえば、そういうものですね。でも、ブレーキを踏みながらアクセルを踏込むような処理は、避けた方がよいでしょう。
引用:
冬雪さんは書きました:
ルートにキーフレームを1つ作成し、そこに同じシンボルからなるインスタンスを2つ(mc1_mcとmc2_mc)配置しています。
...[中略]...
フレーム1のフレームアクションに
trace(this+" is stopping in frame "+_currentframe);  //【確認用】
this.stop();

としています。

そしてルートのフレームアクションに
this.stop();
// ...[中略]...
trace("frame action in "+this+" is executed");  //【確認用】
this.mc2_mc.gotoAndPlay(2);

としています。

これをムービープレビューすると、mc2_mcのフレーム2が表示された状態で停止します。


----------------
 

ひろゆき
Åê¹ÆNo.21486
投稿日時: 2005-11-15 14:32
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: gotoAndPlayで再生する場合としない場合がある
// mc1_mc, mc2_mc
// 第1フレーム
trace(this._name+":frame1");
this.stop();

// 第2フレーム
trace(this._name+":frame2");

// 第3フレーム
trace(this._name+":frame3");


// _root
// 第1フレーム
this.stop();
this.onMouseDown=function(){
	trace("onMouseDown");
	this.mc1_mc.gotoAndPlay(2);
}
trace("mc2_mc.gotoAndPlay(2)");
this.mc2_mc.gotoAndPlay(2);


以上で、ムービーピレビューの出力結果は、以下の通り。
mc2_mc.gotoAndPlay(2)
mc1_mc:frame1
mc2_mc:frame1
mc2_mc:frame2
onMouseDown
mc1_mc:frame2
mc1_mc:frame3
mc1_mc:frame1

つまり、mc1_mc, mc2_mc が読み込まれる前に、
mc2_mc.gotoAndPlay(2) を実行しようとしているので、動かない。

では、どうするか。
_root のスクリプトを第1フレームから第2フレームへ。
mc1_mc:frame1
mc2_mc:frame1
mc2_mc.gotoAndPlay(2)
mc2_mc:frame2
mc2_mc:frame3
mc2_mc:frame1
onMouseDown
mc1_mc:frame2
mc1_mc:frame3
mc1_mc:frame1


サンプル
#分かりやすいように、2fpsに設定。

----
あうっ。かぶっちゃった。


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

冬雪
Åê¹ÆNo.21488
投稿日時: 2005-11-15 15:27
半人前
居住地: 杜の都
投稿: 31
使用環境:
MacOSX10.4.6
FlashPro8
Firefox
Re: gotoAndPlayで再生する場合としない場合がある
理解しました!

引用:
野中文雄さんは書きました:
ブレーキを踏みながらアクセルを踏込むような処理は、避けた方がよいでしょう

そうですよね。
試しにシンボルのthis.stop();を削除してみたら、mc2_mcも停止せずにアニメしました。

引用:
ひろゆきさんは書きました:
つまり、mc1_mc, mc2_mc が読み込まれる前に、
mc2_mc.gotoAndPlay(2) を実行しようとしているので、動かない。

なるほど! そういうことだったのですね…。
その辺のイメージが頭の中から抜けておりました。
そういえばフレームアクションはそのフレームの描画より先に行われるのだから、その時点のルートから見たら「mc2_mcなんて無いからフレーム移動しろとか言われても困るよ」ってことなのですね。
納得しました。
サンプルまで作って頂いて、ありがとうございますっ。
とてもわかりやすく教えて下さって感謝です。

野中さん、ひろゆきさん、ありがとうございました!

trace()も今まで変数の表示くらいしか利用してなかったのですが、カレントフレームや処理される順番を確認するのにも役立つのですね。
野中文雄
Åê¹ÆNo.21490
投稿日時: 2005-11-15 15:46
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: gotoAndPlayで再生する場合としない場合がある
MovieClipの存在やフレームは、認識されていますよ(されていなければ、第1フレームで停止しているはずです)。
引用:
冬雪さんは書きました:
そういえばフレームアクションはそのフレームの描画より先に行われるのだから、その時点のルートから見たら「mc2_mcなんて無いからフレーム移動しろとか言われても困るよ」ってことなのですね。

trace()結果は、確認されていますか?
引用:
野中文雄は書きました:
引用:
冬雪さんは書きました:
ルートにキーフレームを1つ作成し、そこに同じシンボルからなるインスタンスを2つ(mc1_mcとmc2_mc)配置しています。
...[中略]...
フレーム1のフレームアクションに
trace(this+" is stopping in frame "+_currentframe);  //【確認用】
this.stop();

としています。

[出力]パネルより引用:
_level0.mc2_mc is stopping in frame 2


----------------
 

冬雪
Åê¹ÆNo.21491
投稿日時: 2005-11-15 16:25
半人前
居住地: 杜の都
投稿: 31
使用環境:
MacOSX10.4.6
FlashPro8
Firefox
Re: gotoAndPlayで再生する場合としない場合がある
引用:
野中文雄さんは書きました:
MovieClipの存在やフレームは、認識されていますよ(されていなければ、第1フレームで停止しているはずです)。
trace()結果は、確認されていますか?

大変失礼致しました。
trace()結果は確認したのですが、その結果の

_level0.mc2_mc is stopping in frame 2

を見て、「なんでフレーム2になるんだろう?」とうんうん考えているうちにひろゆきさんの投稿を読んで、勝手に納得してしまいました。
おそらくひろゆきさんも野中さんと同じようなことを別の書き方で教えて下さったんだと思うのに、私が勝手な解釈をしてしまったようです。すみません。

ええと、そうするとやっぱり何故mc2_mcがフレーム2で停止するのかがわかりません。
想像なのですが、まずルートがmc2_mc.gotoAndPlay(2)をしてmc2_mcの再生ヘッドがフレーム2に移動して、再生しようとするんだけどもまだmc2_mcはステージに読み込まれていないために再生されない。しかし再生ヘッドは既にフレーム2に移動しているので、ステージに配置された時はフレーム2で停止していることになる。
…ということなのかな?と考えたのですが…。
野中文雄
Åê¹ÆNo.21500
投稿日時: 2005-11-15 18:23
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: gotoAndPlayで再生する場合としない場合がある
「まずルートがmc2_mc.gotoAndPlay(2)をしてmc2_mcの再生ヘッドがフレーム2に移動」します。だからといって、第1フレームアクションを割愛する訳にはいきませんので、再生ヘッドを第2フレームに置いたまま第1フレームアクションを実行します。したがって、第2フレームでstop()することになります。
引用:
冬雪さんは書きました:
trace()結果は確認したのですが、その結果の
_level0.mc2_mc is stopping in frame 2

想像なのですが、まずルートがmc2_mc.gotoAndPlay(2)をしてmc2_mcの再生ヘッドがフレーム2に移動して、再生しようとするんだけどもまだmc2_mcはステージに読み込まれていないために再生されない。しかし再生ヘッドは既にフレーム2に移動しているので、ステージに配置された時はフレーム2で停止していることになる。
…ということなのかな?と考えたのですが…。


----------------
 

冬雪
Åê¹ÆNo.21501
投稿日時: 2005-11-15 20:19
半人前
居住地: 杜の都
投稿: 31
使用環境:
MacOSX10.4.6
FlashPro8
Firefox
Re: gotoAndPlayで再生する場合としない場合がある
引用:
野中文雄さんは書きました:
「まずルートがmc2_mc.gotoAndPlay(2)をしてmc2_mcの再生ヘッドがフレーム2に移動」します。だからといって、第1フレームアクションを割愛する訳にはいきませんので、再生ヘッドを第2フレームに置いたまま第1フレームアクションを実行します。

なるほど。そうか、そういうことだったのか!

だから、フレーム1で現在のカレントフレームをtrace()しているのに、結果が2、となってしまうのですね。

よく考えたら先程自分でシンボルフレーム1のthis.stop()を消してみたらmc2_mcもアニメ再生されたのだから、私の想像の後半は成り立ちませんでした。

今度こそ正しく理解できました。
ここまで導いて下さりありがとうございました。
ひろゆき
Åê¹ÆNo.21504
投稿日時: 2005-11-15 20:41
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: gotoAndPlayで再生する場合としない場合がある
引用:
つまり、mc1_mc, mc2_mc が読み込まれる前に、
mc2_mc.gotoAndPlay(2) を実行しようとしているので、動かない。

間違いですね。失礼しました。

サンプル2
// mc1_mc, mc2_mc
// 第1フレーム
trace(this._name+":"+this._currentframe);
trace(this._name+":frame1");
this.stop();

// 第2フレーム
trace(this._name+":"+this._currentframe);
trace(this._name+":frame2");

// 第3フレーム
trace(this._name+":"+this._currentframe);
trace(this._name+":frame3");
とすると、
mc2_mc.gotoAndPlay(2)
mc1_mc:1
mc1_mc:frame1
mc2_mc:2
mc2_mc:frame1
mc2_mc:2
mc2_mc:frame2
onMouseDown
mc1_mc:2
mc1_mc:frame2
mc1_mc:3
mc1_mc:frame3
mc1_mc:1
mc1_mc:frame1
となって、
再生ヘッドは第2フレームに入っていながら、
第1フレームのスクリプトをその後に実行しています。

これが「ブレーキを踏みながらアクセルを踏込むような処理」なんですね。
loadMovieとgotoAndPlay


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

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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