• 締切済み

アクションスクリプト イベントメソッド

お願いします。教えていただきたいのですが、 root.onKeyDown = function() { trace("キーダウン"); } this.onMouseDown = function() { trace("マウスダウン"); } として実行すると マウスダウン と表示されますが、          キーダウン  は表示されません。 一体なにがいけないんでしょうか? 参考になるURLとかあったら教えてください。

みんなの回答

  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

ボタンとムービークリップが持っている onKeyDown および onKeyUp イベントハンドラを利用して定義した処理は、指定したボタンまたはムービークリップにフォーカスがある時にキー操作をした場合にのみ、呼び出されます。 ActionScript ではムービーそのものも1つのムービークリップとして扱い、通常は _root という名前で識別します。 _root でもムービークリップを制御する MovieClip クラス( Flash MX ではオブジェクト)のメソッドやイベント・プロパティの殆どが使用できますが、実はムービークリップと全く同じではありません。 例えば、ムービークリップに強制的にフォーカスを当てる要領で (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  _root.focusEnabled = true;  _root.tabEnabled = true;  Selection.setFocus( _root ); として _root にフォーカスを与えようとしても、フォーカスのあるオブジェクトを取得する Selection.getFocus メソッドで見てみると、結果は null (どのオブジェクトにもフォーカスが当たっていない)になってしまいます。 他にも、_root.onPress = function ・・・としてムービー全体をボタン化しようとしても、ボタンイベントを利用したスクリプトは機能しません。 (ちなみに onMouse*** イベントハンドラはもともとムービークリップのイベントですので、_root で使用できても不思議ではありません) _root は基本的にはムービークリップと同じなのですが、普通のムービークリップとは少し違う性質がある、特殊なムービークリップです。 先述の通り、ムービークリップの onKeyDown と onKeyUp は”ムービークリップにフォーカスがある時だけ”有効で、フォーカスが外れると呼び出されなくなります。 つまり、_root の onKey*** イベントハンドラを使っても、そもそも _root にはフォーカスを与えられないために何も起こりません。 ****************************** 普通のボタンやムービークリップ等であれば、スクリプトで強制的にフォーカスを当てることができます。 しかし、こうして設定したフォーカスは一時的なもので、閲覧者がマウスを動かしたり Tab キーを押してフォーカスを操作すると外れてしまいます。 フォーカスが外れると、そのムービークリップでの onKey*** イベントは検出されなくなってしまいますから、常にキー入力を監視して「あるキーが押された時に何かの処理を実行する」といった作品を作りたい場合はとても不便です。 そんな時のために、キー入力関連の仕事を専門に扱う Key というクラスが用意されています。 キー入力状況を常時監視するような場合は、こちらを利用する方が一般的だと思います。 Key クラスにも、ムービークリップと同様に onKeyDown と onKeyUp イベントハンドラが用意されています。 しかし、Key クラスの設計上、Key.onKeyDown = function ・・・という書き方ができないようになっています。 Key クラスを使用したキー入力処理は、イベントの情報を代理で受け取る”リスナーオブジェクト”という変数を登録して作ります。 例えば、キー入力を監視し、何かキーが押されるたびにメッセージを出力するスクリプトは、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください)  //リスナーオブジェクトを作成  key_obj = new Object();  //キー押下時の処理を定義  key_obj.onKeyDown = function()  {   trace( "キーダウン" );  };  //リスナーオブジェクトを登録  Key.addListener( key_obj ); 「ムービープレビュー」では、ショートカットキーが有効になっていると反応しません。 「制御」メニューの「キーボードショートカットを無効」を選択して、ショートカットキーを無効にしてください。 なお、Tab キーや Enter キーなどプレイヤーの操作に関わるキーは反応が鈍いことがあります。 Key クラスによるキー入力の監視は、登録されたリスナーオブジェクトが存在している限り有効です。 不要になった時は  //リスナーオブジェクトを削除  Key.removeListener( key_obj ); として、リスナーオブジェクトを削除してください。イベント処理が解除されます。

  • kuri627
  • ベストアンサー率85% (6/7)
回答No.1

詳しくは知りませんが、フォーカスが取れてないのではないでしょうか? ヘルプではonKey~イベントは「ムービークリップにフォーカスがあるときにキーを押すと、呼び出されます。」となっています。 root.onKeyDown の使用目的がわかりませんが、ステージと同サイズのMovieClipを配置して、フォーカスを得るようにするか、Key.addListener メソッドを用いた方が良いのではないでしょうか?

参考URL:
http://livedocs.macromedia.com/flash/8_jp/main/00002491.html

関連するQ&A