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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     イベントハンドラの定義方法
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
malulun
Åê¹ÆNo.30543
投稿日時: 2006-12-5 19:40
新米
居住地:
投稿: 6
使用環境:
WindowsXP, Flash8
イベントハンドラの定義方法
はじめました。はじめて投稿させていただきます。

初歩的な質問かもしれませんが、イベントハンドラをどう定義すればうまく登録されるのかがいまいちわかりません。

以下のスクリプトはイメージをロードしてドラッグして動かすというものですが、

うまく動くサンプル
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
var image:MovieClip = mc.createEmptyMovieClip("image", mc.getNextHighestDepth());
image.loadMovie("test.png");
mc.onRelease = function():Void {
	stopDrag();
}
mc.onPress = function():Void {
 	startDrag(mc, 0, 0, 0, 300, 300);
}

うまく動かないサンプル
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.loadMovie("test.png");
mc.onRelease = function():Void {
	stopDrag();
}
mc.onPress = function():Void {
 	startDrag(mc, 0, 0, 0, 300, 300);
}

2重にcreateEmptyMovieClip()しなくてはイベントハンドラがうまく動きませんでしたが、どうなんでしょうか?
Tonpoo (gaienboy改め)
Åê¹ÆNo.30544
投稿日時: 2006-12-5 19:54
職人
居住地: 東京・神宮前
投稿: 717
使用環境:
Windows 7 Professional,
Flash CS5 Pro,
Flash Player 10,1,102,64
Re: イベントハンドラの定義方法
こんにちは。gaienboyといいます。
引用:
malulunさんは書きました:
2重にcreateEmptyMovieClip()しなくてはイベントハンドラがうまく動きませんでしたが、どうなんでしょうか?

うまく動かない方のサンプルでは、イベントハンドラを設定した
ムービークリップ「mc」に外部画像をloadMovieしてるわけですが、
これをするとmcにあらかじめ設定していたユーザー定義のプロパティやら関数やらは
すべてクリアされてしまいます。
下記の「3. MovieClip.loadMovieで外部ファイルを読込む際の注意」をご参照ください↓

FN0307007 - MovieClip.loadMovieで外部ファイルを読込む - Flash : テクニカルノート

【追記】
malulunさんのスクリプトでは、onReleaseなどの記述はloadMovieの
後方にしているわけですが、実際にはloadMovieが開始してから
終了するまでのほんのわずかなタイムラグの間にonReleaseなどが
設定されてしまっているんだと思います。この方式でイベントハンドラを
設定するのであれば、mcに画像が完全にロードされるのを待って、
その後にonReleaseなどをセットすればいけるのではないでしょうか。

【さらに追記】
一部記述(下線部および打ち消し線部)を修正しました(汗)。


----------------
Tonpoo (a.k.a. gaienboy)
Tonpoo.com / TONPOOBLOG / twitter@tonpootwit

Fla4man
Åê¹ÆNo.30554
投稿日時: 2006-12-6 0:01
職人
居住地: かまくら
投稿: 517
使用環境:
WinMe,Win2000,
Flash4,アズさん,大仏、delphi
Re: イベントハンドラの定義方法
あまり使われない
MovieClip.prototype.onLoad で初期化する形にすれば
わりとシンプルにできます。

基本的にイベントハンドラは直接書かずに
関数を別に定義してプロパティとして代入する形の方が
再利用やライブラリー化、デバッグがしやすいです。

無論MovieClip.prototype.onLoadも直接定義せず
ルートに記述したメンバーを代入します。

var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
loadMovie("mc","test.png");
_root.Refunc = function():Void {
stopDrag();
}
_root.Prefunc = function():Void {
this.startDrag(FALSE, 0, 0, 300, 300);
}
this.Asgfunc = function():Void {
this.onRelease =_root.Refunc;
this.onPress =_root.Prefunc;
}
//※this.Asgfuncとしているのはコンパイルミスの可能性を減らすため実質的に_root.Asgfuncです。

MovieClip.prototype.onLoad =_root.Asgfunc;

私はASを使わずに直接コーディングしているので微妙に文法が違うかも知れませんが
だいたいこんなもんでしょう。
stopdragが関数なのはコードが短いから
startdragも「メソッド」でなくて関数にしてもよかったのですが表記がすんなりするから

この例ではロードの時間差よりもコードの終了が速いので
最初にloadMovieをやってもうまくいきましたが
MovieClip.prototype.onLoad =_root.Asgfunc;

のあとにloadMovieをもってくるのが本筋です。
load後MovieClip.prototype.onLoadはdeleteしてしまっても適用されたものには影響ありません。


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

malulun
Åê¹ÆNo.30555
投稿日時: 2006-12-6 9:07
新米
居住地:
投稿: 6
使用環境:
WindowsXP, Flash8
Re: イベントハンドラの定義方法
ご返信ありがとうございます!
なるほど、原因がわかりました。
ロード待ちをしないといけないのですね。

ちなみに、loadMovieを待つ場合は、onClipEventが有用そうですが、MovieClipにスクリプトを書かずに、フレームアクションで記述した場合、どうやってonClipEventを実現したらいいのかが素朴な疑問となってしまいました。

これでは怒られてしまいますね
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.loadMovie("test.png");
mc.onClipEvent (load) { //←コンパイルエラー	
	this.onRelease = function():Void {
		stopDrag();
	}
	this.onPress = function():Void {
		startDrag(mc, 0, 0, 0, 300, 300);
	}
}
malulun
Åê¹ÆNo.30556
投稿日時: 2006-12-6 9:14
新米
居住地:
投稿: 6
使用環境:
WindowsXP, Flash8
Re: イベントハンドラの定義方法
Fla4manさんご返信ありがとうございます!

初心者には
引用:
MovieClip.prototype.onLoad =_root.Asgfunc;

というあたりがなかなか掴みづらいところですが、これでやったらうまく動きました!
prototype扱いの勉強をしてみたいと思います。
野中文雄
Åê¹ÆNo.30560
投稿日時: 2006-12-6 12:38
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: イベントハンドラの定義方法
Flash Player 7以降でしたら、gaienboyさんにご紹介いただいたノートでも触れているMovieClipLoaderクラスを使われればよいと思います。
var mc:MovieClip = 
this.createEmptyMovieClip("mc", this.getNextHighestDepth());
var _mcl:MovieClipLoader = new MovieClipLoader();
var oListener:Object = new Object();
_mcl.addListener(oListener);
oListener.onLoadInit = function(_mc:MovieClip):Void  {
	_mc.onRelease = function():Void  {
		this.stopDrag();
	};
	_mc.onPress = function():Void  {
		this.startDrag(false, 0, 0, 300, 300);
	};
};
_mcl.loadClip("test.png", mc);

引用:
malulunさんは書きました:
ちなみに、loadMovieを待つ場合は、onClipEventが有用そうですが、MovieClipにスクリプトを書かずに、フレームアクションで記述した場合、どうやってonClipEventを実現したらいいのかが素朴な疑問となってしまいました。

MovieClip.onLoadイベントハンドラメソッドは、MovieClipを継承するサブクラスで使われることが主眼と考えられます。

MovieClipクラスに直接デフォルト定義する場合は、他のインスタンスやタイムラインに与える影響には注意する必要があるでしょう。
MovieClip.prototype.onLoad = function() {
	trace("イベントハンドラメソッドは、"+this+"で呼出されました");
};
var mc:MovieClip = 
this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.loadMovie("test.png");

上記テスト用フレームアクションを、以下の条件で試した結果です。

[1]フレームアクションをメインタイムライン第1フレームに設定した場合
[出力]パネルより引用:
イベントハンドラメソッドは、_level0で呼出されました
イベントハンドラメソッドは、_level0.mcで呼出されました

[2]そのフレームで新しく配置したインスタンスにMovieClipアクションがある場合(フレーム番号は任意、インスタンス名をmy_mcとします)
[出力]パネルより引用:
イベントハンドラメソッドは、_level0.my_mcで呼出されました
イベントハンドラメソッドは、_level0.mcで呼出されました

引用:
malulunさんは書きました:
初心者には
引用:
MovieClip.prototype.onLoad =_root.Asgfunc;

というあたりがなかなか掴みづらいところですが、これでやったらうまく動きました!
prototype扱いの勉強をしてみたいと思います。


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

malulun
Åê¹ÆNo.30564
投稿日時: 2006-12-6 13:56
新米
居住地:
投稿: 6
使用環境:
WindowsXP, Flash8
Re: イベントハンドラの定義方法
野中文雄さんご返信ありがとうございます!

MovieClipLoaderを使うやりかたはわかり易くて良いですね。
とてもためになります。
いろいろなやり方がありますね(予想はしておりましたが…)。
使い方にあった方法を見つけていきたいと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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