図1●ステージ上に配置されたインスタンス
図1●ステージ上に配置されたインスタンス
[画像のクリックで拡大表示]
図2●シンボルに識別子を付けるダイアログ
図2●シンボルに識別子を付けるダイアログ
[画像のクリックで拡大表示]
リスト1●自機を動的にステージに配置するコード
リスト1●自機を動的にステージに配置するコード
[画像のクリックで拡大表示]
リスト2●敵を動的にステージに配置するコード
リスト2●敵を動的にステージに配置するコード
[画像のクリックで拡大表示]

 前回シューティング・ゲームを作ったときには,図1[拡大表示]のようにすでにステージに配置されているインスタンスをキーボードを使って移動させる方法や,弾や敵の当たり判定の方法を紹介しました。Flashを使えば,動きのある画面を簡単に作成できることがご理解いただけたかと思います。

 しかし,シューティング系のゲームには,ゲーム開始時には画面に現れていない敵がだんだん現れたり,弾を発射して敵を撃墜したりといった動きがないと物足りません。そこで今回は,コードから動的にインスタンスを配置して,敵や弾を制御する方法について説明します。

コードからシンボルを呼び出す

 前回作成したFlashドキュメントは図1のように,250×400の大きさのステージ上に,シンボル「enemy」のインスタンスが四つと,シンボル「myShip」のインスタンスが一つ,そして「score_txt」というインスタンス名のテキストフィールドが一つ配置されています。前回はenemyとmyShipのインスタンスをあらかじめステージ上に配置しておきましたが,今回はこれらをコードから動的に配置してみましょう*1

 まず,ステージ上から二つのシンボルのインスタンスをすべて消去してください。次に,コードから動的に任意のシンボルのインスタンスを作成できるようにするために,シンボルに「識別子」と呼ばれる名前を付けます。

 メニューより,[ウィンドウ]-[ライブラリ]とたどり(または,[Ctrl]+[l]),[ライブラリ]パネルを表示します。ライブラリの中から「myShip」を右クリックし,ポップアップメニューを表示します。メニューの中から,[リンケージ]を選択すると,[リンケージプロパティ]ダイアログボックスが表示されます。[リンケージ]欄の,[ActionScriptに書き出し]チェックボックスにチェックを入れ,[識別子]欄に「SMyShip」と入力し,[OK]ボタンを押します(図2[拡大表示])*2。これで,シンボル「myShip」は,コード中では「SMyShip」という識別子*3で使用できるようになりました。同じように,シンボル「enemy」には,「SEnemy」という識別子を付けます。

 この識別子を使って,任意のシンボルのインスタンスを動的にステージ上に配置するには,MovieClipクラスのattachMovieメソッドを使用します。このメソッドは,「シンボル名」「インスタンス名」「深度」の三つの引数を持ち,作成したインスタンスへの参照を戻り値として返します。

 スクリプトを記述するためのレイヤーを一つ作成し,リスト1[拡大表示]のコードを記述します。メニューより,[制御]-[ムービープレビュー]とたどり(または,[Ctrl]+[Enter]),ムービープレビュー画面で確認してみると,ステージ上の指定した座標に自機が表示されることが確認できます。

 リスト1では,(1)で_root上にシンボル「SMyShip」の新規インスタンスを,インスタンス名「myShip」として,「深度が1」の位置に作成します。そして(2)で,作成したインスタンスのx座標とy座標を設定しています。ここに出てきた「深度」は,Flashのムービークリップにおいてインスタンスの「重なり合わせ」を管理するための仕組みです。この深度の値によって,ムービークリップ内でオブジェクト同士がどのように重なり合うかが決まります。

 深度は−16384から1048575の整数で指定し,深度の値が大きいオブジェクトほど前面に表示されます。レイヤーに似ていますが,一つの深度には一つのオブジェクトしか配置できません。同じ深度に新しいオブジェクトを配置すると,以前配置されたオブジェクトは上書き消去されます。

 attachMovieメソッドの仕組みがわかったところで,敵のインスタンスを動的に配置する関数を書き加えましょう(リスト2[拡大表示])。まず,敵の数を管理する変数を宣言し,初期化します。次に,複数の敵インスタンスへの参照を,まとめて管理できるようにするためにObject型の変数「enemyTable」を宣言し,初期化しておきます(1)。Objectクラスは,すべてのクラスの基礎となるクラスです。連想配列*4としての使用に特化したクラスではありませんが,動的にプロパティを追加/削除できる「ダイナミッククラス」であるため,ここでは連想配列の代わりとして使用します。

 リスト2のforループでは,シンボル「SEnemy」から,インスタンス名「enemy1」~「enemy4」の四つの敵インスタンスを作成して,それぞれ深度101~104に配置しています(2)。さらに,配置したインスタンス名と参照が,そのまま連想配列になるように,テーブルに名前と参照を追加して(3),敵の数を+1します。

 リスト2を入力して[ムービープレビュー]で確認してください。自機インスタンスと敵インスタンスが所定の位置に配置されます。これで任意の位置に自機と敵のインスタンスをコードから動的に配置する方法がわかりましたね。

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