図1●今回作成するRPGのマップ(移動画面)。左下がプレーヤ(自機)
図1●今回作成するRPGのマップ(移動画面)。左下がプレーヤ(自機)
[画像のクリックで拡大表示]
図2●マップの情報を2次元の配列で管理する
図2●マップの情報を2次元の配列で管理する
[画像のクリックで拡大表示]
図3●パネルとして使うムービークリップ・シンボルmapChipの内容
図3●パネルとして使うムービークリップ・シンボルmapChipの内容
[画像のクリックで拡大表示]
図4●attachMovieメソッドでmapChipのインスタンスを配置できるように識別子を付ける
図4●attachMovieメソッドでmapChipのインスタンスを配置できるように識別子を付ける
[画像のクリックで拡大表示]
図5●<b>リスト1(8)</b>の実行結果
図5●<b>リスト1(8)</b>の実行結果
[画像のクリックで拡大表示]
リスト1●マップにパネルを敷き詰めるコード
リスト1●マップにパネルを敷き詰めるコード
[画像のクリックで拡大表示]

 今回から2回にわたってRPG(ロール・プレイング・ゲーム)を作成してみましょう。今回は移動画面(図1[拡大表示])を作成し,次回に戦闘画面を作成します。移動画面は,グリッド(格子)状にパネルを敷き詰め,個々のパネルの上をプレーヤが移動できる形式とします。これは2次元のマップ情報を扱う際の基本的な形式で,落ち物パズル・ゲームや戦闘シミュレーション・ゲームにも応用できます。今回はこの2次元マップ情報をActionScriptの2次元配列*1で実装してみます。

マップ情報を2次元配列で管理する

 新規Flashドキュメントを作成し,RPG.flaという名前で適当なフォルダに保存します。マップの情報は,図2[拡大表示]のような6行×10列のグリッドにパネルを敷き詰めるようなイメージで管理してみましょう。左上のパネルが(0,0),右下が(5,9)で,縦6×横10で60枚のパネルを敷き詰めます*2

 パネルを敷き詰める方法はいろいろありますが,今回は個々のパネルに,図3[拡大表示]のように1フレームごとにマップの絵を描いたムービークリップ・シンボル(以下,シンボル)mapChipを配置していきます*3。全部で60個のインスタンスを作成し,それをきっちりと並べる処理となります。

 シンボルmapChipのインスタンスをActionScriptのスクリプトで作成するには,「リンケージ識別子」を付けてattachMovieメソッドを使用します(前回の連載を参照してください)。メニューより[ウィンドウ]-[ライブラリ]とたどり(あるいは[Ctrl]+[l]),[ライブラリ]パネルを表示し,シンボルmapChipの右クリックで表示されるメニューで[リンケージ]を選択します。すると[リンケージプロパティ]ダイアログボックスが表示されるので,[識別子]欄にSMapChipと入力し,[OK]ボタンを押します(図4[拡大表示])。これでシンボルをスクリプトから作成する準備ができました。あとは60回attachMovieメソッドを繰り返し実行すればOKです。

 作成したインスタンスは2次元配列fieldsで管理しましょう。ActionScriptで2次元配列を利用するには,「配列の配列」を作成します*4。通常,配列を利用するにはArrayクラスを利用します。例えば,「1,2,3」という三つの要素を持つ配列を作成して変数aに代入するには,

a = new Array(1, 2, 3);

もしくは,[ ](配列アクセス演算子)を使って,

a = [1, 2, 3];

と記述します。個々の要素にアクセスするには,配列アクセス演算子内にインデックス番号*5を指定します。インデックス番号は0から始まることに注意してください。例えば,先ほどの配列の場合なら,a[0]は「1」を,a[1]は「2」を返します。

 今回は,変数fieldsを,6×10の要素を持つ2次元配列として扱いたいので,

fields = new Array([], [], [], [], [], []);

と,「六つの新規配列を持つ配列」として作成します。この形式であれば,fields[0][0]で,「配列の先頭の要素に格納されている配列の先頭の要素」にアクセスできるようになります。つまり,図2のグリッドに記述している行番号・列番号を指定して,個々の要素にアクセスできるようになるわけです。

 実際にインスタンスを作成し,その参照を2次元配列に格納してみましょう。メインのタイムラインに,リスト1[拡大表示]のコードを記述します。

 まず,パネルをきれいに並べるために,配置の間隔,行数,列数を格納する変数を定義し,2次元配列fieldsを用意します。引き続き,マップ作成用の関数createMapを定義し,マップのどの位置に何があるかという情報を,2次元配列mapで指定します(1)。配列内の数値は,シンボルmapChipの表示フレーム番号です。図3からわかるように「1」なら1フレーム目の「平地」,「2」なら2フレーム目の「岩」の絵柄になります*6

 次に,mapに指定した情報に基づいて,シンボルmapChipのインスタンスを作成します。深度*7を表す変数(2)と,インスタンス名を表す変数(3)を定義し,attachMovieメソッドでメインのタイムライン上にインスタンスを配置します。配置したインスタンスは行・列に合わせて位置を変更し(4),gotoAndStopメソッドを使ってマップ情報で指定したフレームを表示します(5)。さらに,後で移動処理で使えるように,絵柄と深度を表す変数,_typeと_charDepthをそれぞれインスタンスに付加し,値を指定しておきましょう(6)*8。最後に,配置したインスタンスを,2次元配列fieldsに格納します(7)。インスタンスを作成・配置・格納する処理は,for文で6×10の行・列ごとに60個のインスタンスすべてについて行います。

 コードを理解できたら,[ムービープレビュー]機能([Ctrl]+[Enter])で実行してみてください。図1のように,指定した絵柄でパネルが整列していますね。また,(8)のコードが実行され,変数fieldsに正しく_typeの情報が保持されていることを確認できます(図5[拡大表示])。

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