サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

UI Componentsがon ()ハンドラからキーイベントを奪う

ID: FN0412001 Product: Flash

Platform: All
Version: MX 2004

問題
Flash MX 2004のUI Componentsを使用すると、on ()イベントハンドラメソッドでキーイベントが受取れなくなります。

たとえば、新規のFlashムービーを作成して、ステージにMovieClipかButtonインスタンスをひとつ配置します。以下のスクリプト001を、そのMovieClipまたはButtonインスタンスに設定しましょう。[ムービープレビュー]で確認すると、スペースバーを押したとき、[出力]パネルにキーコード(32)が表示されます。

スクリプト001■キーイベントを受取るMovieClip/Buttonアクション

// MovieClip/Buttonアクション
on (keyPress "<space>") {
   trace(Key.getCode());
}

ここで、[コンポーネント]パネルのUI Componentsからひとつ、たとえばButtonコンポーネントをステージにドラッグ&ドロップします。コンポーネントは、ステージに配置してある必要はありません。ですから、確認のため、ステージ上のButtonコンポーネントのインスタンスを削除します。これで、ムービーの[ライブラリ]にのみ、Buttonコンポーネントが格納されます(図001)。

図001■[ライブラリ]に格納されたButtonコンポーネント

確認のため、ステージ上のコンポーネントインスタンスは削除しておく

[ムービープレビュー]で、スペースバーを押して、動作を確認してみましょう。[出力]パネルには、何も表示されなくなります。

原因
UI Componentsが、on ()ハンドラに対するキーイベントの受渡しを阻んでしまうようです。Flash 8のヘルプには、「FocusManagerクラス」の項に「フォーカスマネージャのサポートにより、on(keyPress)グローバルハンドラの使用は無効化されます」と明記されました。

UI Componentsは、タイムラインで使用されているかどうかに関わりなく、シンボルも定義されているクラスもデフォルトではメインタイムライン第1フレーム前に書出されます(図002および003)。したがって、コンポーネントが[ライブラリ]内に存在するだけで、この問題が発生してしまいます。

図002■Buttonコンポーネントのリンケージプロパティ

[最初のフレームに書き出し]がオン

図003■[パブリッシュ設定]ダイアログボックスの[ActionScript設定]

[クラス用のフレームの書き出し]は第1フレームに設定

対処法
onClipEvent (keyDown)イベントハンドラアクションは、UI Componentsが[ライブラリ]に存在しても、キーイベントを受取ることができます。したがって、MovieClipインスタンスにこのハンドラを設定して、押されたキーの処理を行えばよいでしょう[*1]。onClipEvent (keyDown)ハンドラ自身には、直接キーの指定ができません。ですから、ハンドラ内にifステートメントを記述して、押されたキーの判定を行う必要があります(スクリプト002)。

スクリプト002■onClipEvent (keyDown)ハンドラで押されたキーの判定をして処理

// MovieClipアクション
onClipEvent (keyDown) {
   if (Key.getCode() == Key.SPACE) {
     trace(Key.getCode());
   }
}

ifステートメントで押されたキーのキーコードを判定

[*1] Key.addListener()メソッドでKeyクラスにリスナーを登録する方法でも、このUI Componentsの問題を回避して、キーイベントを受取ることが可能です。本稿では、on (keyDown)イベントハンドラメソッドが比較的スクリプト初心者に使われると判断したため、同じインスタンスに記述するonClipEvent (keyDown)ハンドラによる手法をご紹介しました。ご参考までに、Keyクラスにリスナーを登録するサンプルスクリプト(ActionScript 2.0シンタックス)を掲載します。

// フレームアクション
var oListener:Object = new Object();
oListener.onKeyDown = function() {
   if (Key.getCode() == Key.SPACE) {
     trace(Key.getCode());
   }
};
Key.addListener(oListener);

_____

作成者: 野中文雄
更新日: 2005年10月22日 Flash 8ヘルプに加わった注記を追加
作成日: 2004年12月24日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.