メイン コーダーズルーム【スクリプト系】 イベントハンドラの定義方法 | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
malulun | Åê¹ÆNo.30543 投稿日時: 2006-12-5 19:40 |
新米 居住地: 投稿: 6
使用環境:
WindowsXP, Flash8 |
イベントハンドラの定義方法 はじめました。はじめて投稿させていただきます。
初歩的な質問かもしれませんが、イベントハンドラをどう定義すればうまく登録されるのかがいまいちわかりません。 以下のスクリプトはイメージをロードしてドラッグして動かすというものですが、 うまく動くサンプル
うまく動かないサンプル
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さんは書きました: うまく動かない方のサンプルでは、イベントハンドラを設定した ムービークリップ「mc」に外部画像をloadMovieしてるわけですが、 これをするとmcにあらかじめ設定していたユーザー定義のプロパティやら関数やらは 下記の「3. MovieClip.loadMovieで外部ファイルを読込む際の注意」をご参照ください↓ FN0307007 - MovieClip.loadMovieで外部ファイルを読込む - Flash : テクニカルノート 【追記】 malulunさんのスクリプトでは、onReleaseなどの記述はloadMovieの 後方にしているわけですが、実際にはloadMovieが開始してから 終了するまでのほんのわずかなタイムラグの間にonReleaseなどが 設定されてしまっているんだと思います。この方式でイベントハンドラを 設定するのであれば、mcに画像が完全にロードされるのを待って、 その後にonReleaseなどをセットすればいけるのではないでしょうか。 【さらに追記】 一部記述(下線部および打ち消し線部)を修正しました(汗)。
|
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してしまっても適用されたものには影響ありません。
|
malulun | Åê¹ÆNo.30555 投稿日時: 2006-12-6 9:07 |
新米 居住地: 投稿: 6
使用環境:
WindowsXP, Flash8 |
Re: イベントハンドラの定義方法 ご返信ありがとうございます!
なるほど、原因がわかりました。 ロード待ちをしないといけないのですね。 ちなみに、loadMovieを待つ場合は、onClipEventが有用そうですが、MovieClipにスクリプトを書かずに、フレームアクションで記述した場合、どうやってonClipEventを実現したらいいのかが素朴な疑問となってしまいました。 これでは怒られてしまいますね
|
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クラスを使われればよいと思います。
引用: malulunさんは書きました: MovieClip.onLoadイベントハンドラメソッドは、MovieClipを継承するサブクラスで使われることが主眼と考えられます。 MovieClipクラスに直接デフォルト定義する場合は、他のインスタンスやタイムラインに与える影響には注意する必要があるでしょう。
上記テスト用フレームアクションを、以下の条件で試した結果です。 [1]フレームアクションをメインタイムライン第1フレームに設定した場合 [出力]パネルより引用: イベントハンドラメソッドは、_level0で呼出されました [2]そのフレームで新しく配置したインスタンスにMovieClipアクションがある場合(フレーム番号は任意、インスタンス名をmy_mcとします) [出力]パネルより引用: イベントハンドラメソッドは、_level0.my_mcで呼出されました 引用: malulunさんは書きました: |
malulun | Åê¹ÆNo.30564 投稿日時: 2006-12-6 13:56 |
新米 居住地: 投稿: 6
使用環境:
WindowsXP, Flash8 |
Re: イベントハンドラの定義方法 野中文雄さんご返信ありがとうございます!
MovieClipLoaderを使うやりかたはわかり易くて良いですね。 とてもためになります。 いろいろなやり方がありますね(予想はしておりましたが…)。 使い方にあった方法を見つけていきたいと思います。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
投稿するにはまず登録を | |