- 締切済み
アクションスクリプト イベントメソッド
お願いします。教えていただきたいのですが、 root.onKeyDown = function() { trace("キーダウン"); } this.onMouseDown = function() { trace("マウスダウン"); } として実行すると マウスダウン と表示されますが、 キーダウン は表示されません。 一体なにがいけないんでしょうか? 参考になるURLとかあったら教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
ボタンとムービークリップが持っている 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)
詳しくは知りませんが、フォーカスが取れてないのではないでしょうか? ヘルプではonKey~イベントは「ムービークリップにフォーカスがあるときにキーを押すと、呼び出されます。」となっています。 root.onKeyDown の使用目的がわかりませんが、ステージと同サイズのMovieClipを配置して、フォーカスを得るようにするか、Key.addListener メソッドを用いた方が良いのではないでしょうか?