ActionScript 3.0で始めるオブジェクト指向スクリプティング

第13回 キーボードによる操作

この記事を読むのに必要な時間:およそ 3 分

今回は新しいお題として,キーボードのキーでインスタンスを操作してみたい。上下左右の矢印キーで,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イベントが発生しないのだ。

図1 StageオブジェクトにキーイベントInteractiveObject.keyDownのリスナーを登録

図1 StageオブジェクトにキーイベントInteractiveObject.keyDownのリスナーを登録

[ムービープレビュー]のモードには,いくつかのキーにショートカットが割当てられている。たとえば,[Enter]または[return]キーなら,[制御]メニューの[再生]だ。ショートカットキーを押すと, FlashのSWFコンテンツでなく,メニューがそのキー入力を先に奪ってしまう。これを避けるためには,[制御]メニューで[キーボードショートカットを無効]にしておく必要がある図2)。

図2 [制御]メニューで[キーボードショートカットを無効]

図2 [制御]メニューで[キーボードショートカットを無効]

※1)
押したキーを放すイベントは,InteractiveObject.keyUp(KeyboardEvent.KEY_UP)である。今回のインターフェースでは,キーを押したままにしたときに動き続けるようにしたいので,InteractiveObject.keyDown(KeyboardEvent.KEY_DOWN)イベントが適している。
※2)
インスタンスにフォーカスを当てるには,Stage.focusプロパティにその対象となるインスタンスを代入する。

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書

コメント

  • InteractiveObjectはDisplayObjectのサブクラスではないですか?

    いつも拝見させていただいております。
    とてもためになる講座ありがとうございます。

    『第13回 キーボードによる操作』


    のところで、疑問に感じたところがありました。
    Flashを勉強しはじめてまだ知らないことも多いですが、
    Adobeのコンポーネントリファレンスガイドで、DisplayObjectのサブクラスに InteractiveObjectと記載されていますが、
    本章では

    >>nteractiveObjectは, DisplayObjectクラスのスーパークラスである。

    と書いてあります。
    僕の勘違いでしたら申し訳ありません。

    Commented : #1  根岸 (2010/11/13, 23:25)

コメントの記入