リスト4●衝突判定などを付け加えたコード
リスト4●衝突判定などを付け加えたコード
[画像のクリックで拡大表示]
リスト5●移動,衝突,スコア更新用の関数
リスト5●移動,衝突,スコア更新用の関数
[画像のクリックで拡大表示]
リスト6●効果音を鳴らすコード
リスト6●効果音を鳴らすコード
[画像のクリックで拡大表示]
図4●爆発の絵を描いて,シンボルに変換して識別子を付ける
図4●爆発の絵を描いて,シンボルに変換して識別子を付ける
[画像のクリックで拡大表示]
図5●鳴らしたい音声ファイル(se01.wave)をライブラリ・パネルで選んだところ
図5●鳴らしたい音声ファイル(se01.wave)をライブラリ・パネルで選んだところ
[画像のクリックで拡大表示]
リスト3●弾の発射と移動を行う関数を加えたコード
リスト3●弾の発射と移動を行う関数を加えたコード
[画像のクリックで拡大表示]

敵の移動処理と
衝突判定処理を作成する

 弾を発射できるようになったので,敵の移動と衝突判定の処理を追加しましょう。コードを記述する前に,弾と敵が衝突した際に,爆発のアニメーションを表示するためのシンボルを準備をします。

 ステージ上に適当に爆発を表すような円を描き,シンボル化したうえで,シンボル名「explosion」,リンケージ識別子「SExplosion」という名前を付けます(図4[拡大表示])。次に,ステージ上のシンボル「explosion」のインスタンスをダブルクリックして,シンボル「explosion」のムービークリップのアニメーションを作成します*8。5フレーム目にキーフレームを作成し,1~5フレームに爆発の円を配置します*9。次に,コードを記述するレイヤーを一つ追加し,5フレーム目にキーフレームを作成し,そこに次のコードを記述します。

//自分を消去
this.removeMovieClip();

これで,シンボルexplosionから作成されたインスタンスは,5フレーム目まで爆発の絵を表示し,最後に消去されます。シンボルの最終フレームにremoveMovieClipメソッドを記述するのは,コードから動的に画面エフェクトを割り当てたいときによく使われる方法ですから覚えておきましょう。爆発用のシンボルの作成が済んだところで,メインのタイムラインに戻り,ステージから爆発エフェクト用のインスタンスを消去します。

 次に,リスト4[拡大表示]のように敵の移動と衝突判定の処理を関数「routineWork」に追加します。敵を管理するテーブルを利用してループ処理によって敵を移動させ,移動が済んだらループ処理で衝突判定を行っています。

 (1)(2)(3)の三つの個所ではそれぞれ,敵の移動用,敵と自機の衝突時用,敵と弾の衝突用の対応する関数を呼び出しています。対応する三つの関数のコード,および衝突時にスコアを更新する関数「showScore」はリスト5[拡大表示]のようになります。

 関数「moveEnemy」は,引数として受け取った敵のインスタンスを移動しています。関数「showExplosion」は,引数として衝突判定の起きた敵インスタンスと,弾のインスタンスの二つを受け取ります。敵インスタンスのあった位置に,先ほど作成した爆発エフェクト用のシンボル「SExplosion」のインスタンスを配置し,併せて敵インスタンスと弾のインスタンスに対して消去処理を行います。

 ここで,(1)の個所に注目すると,「if(beam != undefined)」という条件式が記述してあります*10。これは文字通り,「引数beamが未定義(undefined)で無い場合」つまり,引数beamに何かしらの値や参照が存在する場合に処理を実行する,といった条件式です。衝突用の処理は,「敵と弾の衝突」と「敵と自機の衝突」の2パターンがあります。この条件式によって,敵と自機が衝突した場合には,関数showExplosionに引数enemyのみを渡すことで(3),弾の消去処理を実行しないようにしています*11。一連の消去処理が終わったところで,すべての敵が消去されている場合には,あらためて敵を再配置します(2)。

 関数「getCollision」は,敵と自機が衝突した場合の処理を行っています。引数としてうけとった敵インスタンスを,そのまま前述の関数「showExplosion」に渡して衝突時の処理を行い,スコアを減算しています。関数「showScore」は,引数として受け取った値を元に,変数scoreの値を更新し,ダイナミックテキスト「score_txt」を更新します。

 リスト3[拡大表示]にリスト4リスト5の部分を書き加え,[ムービープレビュー]で確認をしてみましょう。敵・弾・自機の衝突判定が行われていることが確認できます。だいぶゲームらしくなりましたね。

効果音を鳴らす

 最後に,効果音をコードから鳴らす方法を紹介します。まず,効果音として鳴らしたいwavファイルやmp3ファイルを用意します。ここでは,「se01.wav」という音声ファイルを例にとってみましょう*12

 メニューより,[ファイル]-[読み込み]-[ライブラリに読み込み]とたどり,ファイル選択ダイアログから読み込みたいファイルを指定して,ライブラリに音声ファイルを読み込みます(図5[拡大表示])。ライブラリに読み込んだら,シンボルのときと同じように,リンケージ識別子を指定します。ここでは,「SEShot」と名前を付けてみましょう。

 任意の音声ファイルを鳴らす場合には,Soundクラスを使用します。識別子「SEShot」をSoundクラスを使って鳴らすには,次のように記述します。

var ch1:Sound = new Sound();
ch1.attachSound("SEShot");
ch1.start();

newで新規サウンドオブジェクトを作成し,attachSoundメソッドを使って識別子のサウンドを割り当てて,startメソッドで再生する,という手順になります。

 弾を発射した時と,衝突時に効果音を付けてみましょう(リスト6[拡大表示])。発射時の効果音は「SEShot」,衝突時の効果音は「SEExplosion」とリンケージ識別子がつけられているものとします。[ムービープレビュー]で確認してみると,弾の発射時と衝突時に効果音が鳴ることが確認できます。

 シューティング・ゲームはこれで完成です。ゲームを作成する際に基本的な知識となる,インスタンスやサウンドの動的な配置と,複数のインスタンスの管理方法についてご理解いただけたでしょうか。あとは,敵の出現パターンや移動パターンを変えたり,自機の武器の種類を増やしたり,耐久度を付け加えたりと,自分なりにカスタマイズをしてオリジナルのゲームに仕上げていきましょう。なお,今回作成したFlashドキュメントは,http://software.nikkeibp.co.jp/software/からダウンロードできます。

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