ActionScript 3.0で始めるオブジェクト指向スクリプティング
第13回 キーボードによる操作
今回は新しいお題として,キーボードのキーでインスタンスを操作してみたい。上下左右の矢印キーで,MovieClipインスタンスをその方向に移動させる。そのためには,キーが押される操作をイベントとして受取り,それが何のキーかを判別して処理することになる。
キーイベントを受取る
まず,キーボードのキーを押した操作はどう受取ればよいか。ActionScript 3.0では,イベントはつねにイベントリスナーの仕組みを使って処理する。キーを押すイベントは,InteractiveObject.keyDown(KeyboardEvent.KEY_DOWN定数)だ(※1)。
InteractiveObjectは, DisplayObjectクラスのスーパークラスである。マウスやキーボードの操作を扱う。MovieClipクラスはDisplayObjectクラスを継承するので,そのスーパークラスであるInteractiveObjectのイベントも当然受取れる(スーパークラスや継承については,第9回「座標の天動説と地動説」の「インスタンスとマウスポインタの座標」参照)。
もっとも,今回キーイベントInteractiveObject.keyDownのリスナーは,Stageオブジェクトをターゲットとして登録しなければならない。StageクラスもまたDisplayObjectクラスを継承するので,キーイベントは受取れる。しかし,なぜキー操作で動かそうとするMovieClipインスタンスを,ターゲットにできないのか。
MovieClipインスタンスに対してキーイベント(InteractiveObject.keyDownなど)のリスナーを登録すると,そのインスタンスにフォーカスを当てていないと(※2),イベントが受取れないのだ。またフォーカスを当てても,インスタンス外のステージ上をマウスクリックでもすれば,フォーカスが外れてイベントを受取らなくなってしまう。
したがって,フォーカスに関わりなくキーイベントInteractiveObject.keyDownを処理するには,キー操作で移動するMovieClipシンボルに以下のようなフレームアクション(スクリプト001)を記述する。なお,リスナー関数xKeyDown()はテスト用に,引数として受取ったイベントオブジェクトeventObjectをtrace()関数で[出力]パネルに表示することとした。
スクリプト1 キーを押すとイベントオブジェクトの情報を[出力]する
// MovieClip: キー操作で動かすインスタンス
stage.addEventListener(KeyboardEvent.KEY_DOWN, xKeyDown);
function xKeyDown(eventObject:KeyboardEvent):void {
trace(eventObject);
}
[ムービープレビュー]を実行して,キーボードからキーを押すと,そのキーイベントの情報が[出力]パネルに表示される(図1)。ところが,[Enter]または[return]などいくつかのキーは,いくら押しても何も[出力]されない。つまり,KeyboardEvent.KEY_DOWNイベントが発生しないのだ。
[ムービープレビュー]のモードには,いくつかのキーにショートカットが割当てられている。たとえば,[Enter]または[return]キーなら,[制御]メニューの[再生]だ。ショートカットキーを押すと, FlashのSWFコンテンツでなく,メニューがそのキー入力を先に奪ってしまう。これを避けるためには,[制御]メニューで[キーボードショートカットを無効]にしておく必要がある(図2)。
- ※1)
- 押したキーを放すイベントは,
InteractiveObject.keyUp(KeyboardEvent.KEY_UP)である。今回のインターフェースでは,キーを押したままにしたときに動き続けるようにしたいので,InteractiveObject.keyDown(KeyboardEvent.KEY_DOWN)イベントが適している。 - ※2)
- インスタンスにフォーカスを当てるには,
Stage.focusプロパティにその対象となるインスタンスを代入する。


