図1●今回作成するシューティング・ゲームの画面
図1●今回作成するシューティング・ゲームの画面
[画像のクリックで拡大表示]
図2●<b>リスト1</b>を実行しているところ。routineWork関数内の処理が,指定した時間間隔で繰り返し実行される
図2●<b>リスト1</b>を実行しているところ。routineWork関数内の処理が,指定した時間間隔で繰り返し実行される
[画像のクリックで拡大表示]
リスト1●タイマー処理の動作を確かめるコード
リスト1●タイマー処理の動作を確かめるコード
[画像のクリックで拡大表示]

 Flashが備えるスクリプト言語ActionScriptには,マウスやキーボードの入力を監視するためのクラスが用意されています。今回は,このクラスを利用して,ユーザーがキーボード操作で遊べるシューティング・ゲームを作ってみましょう。

 まずは作成するゲームの完成イメージを確認します(図1[拡大表示])。敵が画面の上の方から降ってきますので,自機をカーソル・キー(矢印キー)で上下左右に動かして敵を避けつつ,スペースバーで弾を発射するという,ちょっとなつかしいゲームです。このゲームの作成を通じて学習する項目は,以下の四つです。

(1)ActionScriptにおけるタイマー処理の方法
(2)インスタンスを画面上で移動させる方法
(3)キーボードからの入力を判定する方法
(4)インスタンス同士の重なり(衝突)を判定する方法
それでは,一つずつ確認をしていきましょう。

タイマーを使って
一定間隔で処理を繰り返す

 ゲームを作成する際には「一定時間ごとに処理を行いたい」というケースがよくあります。一定時間ごとに敵を移動させたり,弾を移動させたり,といった基本的な動き一つとっても,何かしらタイマーのようなものが必要なことがわかります。一定時間ごとにある処理を行わせることをここでは「タイマー処理」と呼ぶことにします。

 ActionScriptでタイマー処理を行う方法は,大きく二つあります。一つは,setInterval関数を利用して,指定したミリ秒単位で指定した処理を行わせる方法。もう一つは,MovieClipクラスに用意されているenterFrameイベントの仕組みを利用する方法です*1

 それぞれの方法を,実際にコードを書いて確かめてみましょう。新規のFlashドキュメントを開き,任意のフォルダ内に適当な名前で保存します。タイムラインの1フレーム目を選択し,メニューで[ウィンドウ]-[開発パネル]-[アクション]とたどり(あるいは[F9]キー),[アクション]パネルを表示してリスト1[拡大表示]のコードを記述してください。繰り返し実行する処理をroutineWork関数に定義して*2,setInterval関数を使って1000ミリ秒間隔でタイマー処理を実行しています。

 メニューで[制御]-[ムービープレビュー]とたどって(あるいはCtrl+Enter)ムービープレビューをしてみましょう。setIntervalの第1引数で指定したroutineWork関数が,第2引数に指定した値(1000ミリ秒)ごとに実行され,その結果として[出力]ウィンドウにテキストが書き出されるのを確認できます(図2[拡大表示])。

 次に,タイマー処理のもう一つの方法であるenterFrameイベントについて説明します。enterFrameイベントは,Flashムービーのフレーム・レート(1秒間に何フレーム再生するかを決定する値)に応じて発生するイベントです。デフォルトのフレーム・レートは12fps(フレーム毎秒)ですから,1秒間に12回イベントが発生します。フレーム・レートを高くすればイベントの発生間隔は短くなり,低くすればそれだけ発生間隔は長くなります*3

 Flashはフレーム・レートに応じて画面を書き換えます。今回のように「敵が移動するたびに」「弾が移動するたびに」というように,画面の更新に合わせて処理や判定を行いたい場合には,enterFrameイベントを使用した方が,相性が良さそうです。

 先ほどのムービープレビュー画面を閉じたら,リスト1の(1)のsetInterval関数をコメントアウトし(行の先頭に「//」と入力する),(2)の先頭の「//」を削除してください。すると,(1)の代わりに(2)のコードが実行されるようになります。(2)のコードはenterFrameイベントが発生したときに実行する処理を指定するもので,イベント・ハンドラ・メソッドという仕組みを利用しています*4

 イベント・ハンドラ・メソッドは,クラスごとに定義されている特定のイベントが発生したときに呼び出される特殊なメソッドです。例えばMovieClipクラスでは,enterFrameイベント発生時にonEnterFrameイベント・ハンドラ・メソッドが呼び出されます。Buttonクラスでは,ボタンをクリックしたときに発生するpressイベント発生時にonPressイベント・ハンドラ・メソッドが呼び出される,と言った具合です。

 これらのイベント・ハンドラ・メソッドの内容はデフォルトでは未定義です。すなわち,イベントが発生しても何も行いません。そこで(2)のように処理を指定すると,イベント発生時に指定した処理を実行するようになるわけです*5

 enterFrameイベントを利用した方法をムービープレビューで確認してみましょう。すると今度は,フレーム・レートに応じた時間間隔で処理が繰り返されていることを確認できますね。

下記のURLから、サンプル・プログラムを無償ダウンロードできます。
http://software.nikkeibp.co.jp/software/download/down04c.html#200412