図3●弾を描いて,シンボルに変換してリンケージ識別子を付ける
図3●弾を描いて,シンボルに変換してリンケージ識別子を付ける
[画像のクリックで拡大表示]
リスト3●弾の発射と移動を行う関数を加えたコード
リスト3●弾の発射と移動を行う関数を加えたコード
[画像のクリックで拡大表示]

自機から弾を発射する

 次に,スペースバーを押したときに,自機から弾を発射するようにしましょう。ステージ上に適当に弾(ビーム)の絵を描き(図3[拡大表示]),シンボル化したうえで,リンケージ識別子として「SBeam」という名前を付けます。シンボルとしてライブラリに登録されたら,ステージ上から絵(SBeamのインスタンス)を消してしまいます。

 次に,リスト2のコードに,enterFrameイベント*5のイベント・ハンドラであるonEnterFrameを利用したタイマー処理を使って,自機の移動,スペースバーが押されていた場合に弾を発射する処理を加えます。さらに,弾を発射する関数と,発射された弾の移動を管理する関数や変数を加えると,リスト3[拡大表示]のようなコードになります*6。[ムービープレビュー]をして結果を見てみましょう。スペースバーを押すと,自機インスタンスの先に弾のインスタンスが作成され,上方向に向かって移動していくことが確認できます。

 リスト3の内容を見てみましょう。まず,タイマー処理である関数「routineWork」内で,KeyクラスのisDownメソッドを使って任意のキーボードの状態をチェックし,スペースバーが押されている場合は,関数「shotBeam」を呼びだします(1)。次に,発射中の弾への参照を管理しているbeamTableに対してfor..inステートメント*7を使って,テーブル中に格納されている参照先すべて(つまり「表示されている弾すべて」)に対して,関数「moveBeam」を使って移動を行う処理を実行しています(2)。

 関数「shotBeam」には,引数として受け取った自機のインスタンスから弾を発射する処理がまとめられています。自機や敵のときと同じように,シンボル「SBeam」からattachMovieメソッドを使ってインスタンスを作成するのですが,今回はインスタンスを配置する深度を決めるのに,getNextHighestDepthメソッドを使用しています(3)。このメソッドは,任意のムービークリップにおいて,「現在,最前面に表示できる深度」を返します。取得した戻り値を使用することで,同じ深度にインスタンスを配置して,前に配置してあったインスタンスを上書き消去してしまうといった事態を防ぐことができます。弾のインスタンスを配置したら,beamTableテーブルにインスタンス名と参照を,連想配列風に登録し(4),弾数管理用の変数beamCountに1を加算します。

 関数「moveBeam」には,引数として受け取った弾のインスタンスを移動させる処理がまとめられています。上方向に移動するので,インスタンスの_yプロパティの値を15ずつ減らし,0以下になった場合には,ステージ外へと移動したと判断して消去処理を行います(5)。消去の処理では,beamTableテーブルから,弾のインスタンス名と同じプロパティを削除することでテーブルから削除しています。次に,動的に任意のインスタンスを消去するremoveMovieClipメソッドを使用して,弾のインスタンスを消去。最後に,弾数管理用の変数beamCountから1を減算して完了です。

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