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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     onEnterFrameを書く場所で挙動が違う?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
inu_kt
Åê¹ÆNo.24510
投稿日時: 2006-3-27 17:59
半人前
居住地:
投稿: 33
使用環境:
Flash 8 Pro
Windows XP
onEnterFrameを書く場所で挙動が違う?
質問ばかりで申し訳ございません。

以下のスクリプトを実行したのですが、
1フレーム目に書いたときと、2フレーム目に書いたときで
挙動が違います。

var mc2:MovieClip = _root.createEmptyMovieClip("mc2",1);
trace("start");
mc2.loadMovie("1.swf");
mc2.onEnterFrame = function () {
trace("ok");
}
stop();

1フレーム目に書いたときは、きちんとonEnterFrameに
来るのでokが表示されるのでよいのですが、

1フレーム目を空にして、2フレーム目に書くと、startは
表示されますが、onEnterFrameに来なくてokが表示されません。

他の部分に何もスクリプトがない新規の状態で試したので、
他の部分が影響しているのではないと思いますが、
どうして2フレーム目に書くとonEnterFrameに来ないのでしょうか?

どうかアドバイスいただければ幸いです。
よろしくお願い申し上げます。
nekoyuki
Åê¹ÆNo.24512
投稿日時: 2006-3-27 18:06
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: onEnterFrameを書く場所で挙動が違う?
1フレームに記述した時は
1度しかokがトレースされていないですよね?

1.swfがロードされた時点でonEnterFrameが
使えない状態になったんだと思いますが。
nekoyuki
Åê¹ÆNo.24513
投稿日時: 2006-3-27 18:10
半人前
居住地: 大阪府
投稿: 48
使用環境:
FLASH CS3 Professional
XP Pro(SP2)
Re: onEnterFrameを書く場所で挙動が違う?
ヘルプを読みましょう。

loadMovie (MovieClip.loadMovie メソッド)

イベントハンドラと MovieClip.loadMovie() を併用すると、
予期しない結果が生じる可能性があります。on() を使用して
イベントハンドラをボタンに割り当てるか、MovieClip.onPress() の
ようなイベントハンドラメソッドを使用してダイナミックハンドラを
作成した後、loadMovie() を呼び出すと、新しいコンテンツがロードされた後に
イベントハンドラが維持されません。一方、onClipEvent() または 
on() を使用してイベントハンドラをムービークリップに割り当てた後、そのムービークリップで loadMovie() を呼び出すと、
新しいコンテンツがロードされた後にイベントハンドラが維持されます。
ひろゆき
Åê¹ÆNo.24514
投稿日時: 2006-3-27 18:12
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onEnterFrameを書く場所で挙動が違う?
引用:
糸田謙一さんは書きました:
質問ばかりで申し訳ございません。

複数のフレームに同じボタンを表示させたい!
ActionScriptでパターンマッチ(正規表現)させたい!
については、レスをおつけにならないのでしょうか?

loadMovie と記述したからと言って、
すぐに外部swfが読み込まれるわけではありませんね。
#詳しくは、nekoyukiさんの投稿をどうぞ。

var mc2:MovieClip = _root.createEmptyMovieClip("mc2",1);
trace("start");
//mc2.loadMovie("1.swf");
mc2.onEnterFrame = function () {
	trace("ok");
}
stop();

FN0307007 - MovieClip.loadMovieで外部ファイルを読込む

外部ムービー読み込み時のプロパティ
も参考まで。

1フレーム目に記述した場合、外部swfを読み込み完了するのが若干遅いために、
"ok"が1回だけ表示されてしまうのではないでしょうか?


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

inu_kt
Åê¹ÆNo.24515
投稿日時: 2006-3-27 18:41
半人前
居住地:
投稿: 33
使用環境:
Flash 8 Pro
Windows XP
Re: onEnterFrameを書く場所で挙動が違う?
お世話になっております。

>1フレームに記述した時は
>1度しかokがトレースされていないですよね?
はい。一度しか表示されません。
2フレーム目に記述したときは一度も表示されません。

>1.swfがロードされた時点でonEnterFrameが
>使えない状態になったんだと思いますが。
loadMovie()してロードし始めると、必ずonEnterFrameに
来るものではないのでしょうか?
ロード状況を把握するために、onEnterFrame内でgetBytesLoaded()
などを取得しようと思っていたのですが、onEnterFrame()では
できないということですね?

引用されたヘルプは、難しくて、よく分かりませんでした。。
inu_kt
Åê¹ÆNo.24517
投稿日時: 2006-3-27 18:53
半人前
居住地:
投稿: 33
使用環境:
Flash 8 Pro
Windows XP
Re: onEnterFrameを書く場所で挙動が違う?
onEnterFrameは、ロードが完了するとイベントが発生しないのですね。
勘違いしていました。
Flash MXなので、ロード中にgetBytesLoaded()を表示するのは、
フレームのループを使って解決しようと思います。
フレームのループだとスクリプトが長くなるので
あまり使いたくなかったのですが、仕方ないのですね。。
ありがとうございました。
ひろゆき
Åê¹ÆNo.24521
投稿日時: 2006-3-27 19:32
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: onEnterFrameを書く場所で挙動が違う?
引用:
糸田謙一さんは書きました:
onEnterFrameは、ロードが完了するとイベントが発生しないのですね。

外部ムービー読み込み時のプロパティ
は、お読みになりましたか?

イベントが発生しないのではなくて、
イベントハンドラメソッドがクリアされてしまうのだと思いますが。

引用:
Flash MXなので、ロード中にgetBytesLoaded()を表示するのは、
フレームのループを使って解決しようと思います。
フレームのループだとスクリプトが長くなるので
あまり使いたくなかったのですが、仕方ないのですね。。

フレームのループを使わずとも、できますよ。

load_mc.loadMovie("test.swf");
とした場合、
load_mc に設定したプロパティの一部やイベントハンドラメソッドが使えなくなるというだけですから。

読み込み状況を調べるムービークリップを別に用意してやれば、
onEnterFrame を使うことはできます。



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

inu_kt
Åê¹ÆNo.24526
投稿日時: 2006-3-27 19:56
半人前
居住地:
投稿: 33
使用環境:
Flash 8 Pro
Windows XP
Re: onEnterFrameを書く場所で挙動が違う?
お世話になっております。

loadMovieのときはそのMCでメソッドが使えないのですね。

>読み込み状況を調べるムービークリップを別に用意してやれば、
>onEnterFrame を使うことはできます。

なるほどです。

早速、

dt = new Date();
var mc1:MovieClip = _root.createEmptyMovieClip("mc1",1);
var mc2:MovieClip = _root.createEmptyMovieClip("mc2",2);
_root.mc1.loadMovie("1.swf?time=" + parseInt(Math.floor(dt.getTime())));
_root.mc2.onEnterFrame = function(){
trace(_root.mc1.getBytesLoaded());
}
stop();

というように、読み込み用のMCと、読み込み状況監視用のMCを分けたら
正しく取得することができました。
これならフレームループを使わないので、スクリプトが
すっきりしていいですね。

どうもありがとうございました。
inu_kt
Åê¹ÆNo.24530
投稿日時: 2006-3-27 22:58
半人前
居住地:
投稿: 33
使用環境:
Flash 8 Pro
Windows XP
Re: onEnterFrameを書く場所で挙動が違う?

本題とは関係ないのですが、onEnterFrameの関数は
戻り値を取れないのですね。

if((_root.mc2.onEnterFrame = _root.func1) == false){
//戻り値が-1だったときの処理
}

こんな風に戻り値が取れるといいなと思いました。

onEnterFrameは、そのフレームで実行されるというより、
フレームが再生されるたびに毎回実行されるので、
戻り値を返しても仕方ないのかもしれませんが、、
野中文雄
Åê¹ÆNo.24556
投稿日時: 2006-3-28 19:11
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: onEnterFrameを書く場所で挙動が違う?
イベントハンドラメソッドまたは関数について、理解の十分でない点があるのではないでしょうか?

戻り値が取れない訳ではありません。すべての関数は、呼出しを行わないかぎり、戻り値は取れません。イベントハンドラメソッドは、通常スクリプトで呼出しを行わないので、戻り値を利用することができないだけです。
引用:
糸田謙一さんは書きました:
本題とは関係ないのですが、onEnterFrameの関数は
戻り値を取れないのですね。

以下のスクリプトは、MovieClip.onEnterFrameメソッドへの代入値を調べているだけで、戻り値は取得していません。
if((_root.mc2.onEnterFrame = _root.func1) == false){
    //戻り値が-1だったときの処理
}

代入文を評価するシンタックスとしては有効ですので、エラーもなく仕様にしたがった動作はします。
function func1() {
	return 123;
}
if ((_root.mc2.onEnterFrame=_root.func1) == false) {  // 代入値を調べる
	// ...[中略]...
} else {
	trace(_root.mc2.onEnterFrame);  // 出力: [type Function]
	var returnedValue = _root.mc2.onEnterFrame();  // メソッドを呼出す
	if (returnedValue == 123) {  // 戻り値を調べる
		delete _root.mc2.onEnterFrame;
		trace(returnedValue);  // 出力: 123
	}
}


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

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

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