« 強制バージョンアップ | メイン | ボタン作成のためのイベントフロー制御 »

マウス入力とキーボード入力

ActionScript3.0ではキーボード入力の検出に枷が嵌められています。
それは検出を行うインスタンスがフォーカス状態でなければいけないということです。

キー押下を検出するには、適当なインスタンス(ドキュメントルートでも可)にイベントリスナを登録してさらにフォーカスさせておく必要があります。

stage.focus = this;
addEventListener( KeyboardEvent.KEY_DOWN, onKeyDownHandler );


ここまではまだいいのですが実はこのフォーカス、ボタン押下時に奪われます。
たとえばシンボルの移動にキーボードを割り当てて、あるキーを押している間だけ動き続けるようにします。
これは Keyboard.KEY_DOWN と Keyboard.KEY_UP のそれぞれについてリスナー登録すれば実現できます。

このとき画質変更ボタンを画面に配置していたりなんかすると、ボタンを押した瞬間フォーカスがそのボタンに移るのでキーボード入力が検出できなくなります。
さらにひどいことに、キー押下だけならまだしもキー押上まで拾えなくなるため、キー押下中にボタンを押してしまうとシンボルの移動が止まらないなんてことに!!

これを解決するにはフォーカス移動を強制的にキャンセルすることです。
ボタン btn が押下された瞬間に、フォーカスをキーボード入力検出用インスタンスに戻すためには

public コンストラクタ() {
 stage.focus = this;
 addEventListener( KeyboardEvent.KEY_DOWN, onKeyDownHandler );
 addEventListener( KeyboardEvent.KEY_UP, onKeyUpHandler );
 btn.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDownHandler );
}

private function onKeyDownHandler( e:KeyboardEvent ):void {
 // 移動開始処理
}
private function onKeyUpHandler( e:KeyboardEvent ):void {
 // 移動終了処理
}
private function onMouseDownHandler ( e:MouseEvent ):void {
 stage.focus = this;
}

といった具合に、ボタンに対して MouseEvent.MOUSE_DOWN のイベントリスナを登録して、メソッドでフォーカスを戻す処理を記述しておきます。
これで一応はキーボード入力が奪われずに済みます。

が、これが本当に正しいやり方なのかは試行錯誤中なのでよく分からず・・・
もっと賢いやり方があれば誰か教えてください。

トラックバック

このエントリーのトラックバックURL:
http://void.heteml.jp/mt/mt-tb.cgi/17

コメントを投稿

あわせて読みたい