図6●右しか移動できない状態の自機
図6●右しか移動できない状態の自機
[画像のクリックで拡大表示]
リスト1●マップにパネルを敷き詰めるコード
リスト1●マップにパネルを敷き詰めるコード
[画像のクリックで拡大表示]
リスト2●自機の移動に関係する変数と関数を定義するコード
リスト2●自機の移動に関係する変数と関数を定義するコード
[画像のクリックで拡大表示]

マップ上を移動する関数を作る

 次に,マップ上でプレーヤ(自機)を移動させる方法を考えます。今回は,矢印キーを押すと,その方向に自機を移動するようにしましょう。例えば,図6[拡大表示]のケースでは,自機は上と左を岩に囲まれ,下はマップの終端であるため,移動できるのは右だけです。これをどのように表現したらよいのでしょうか。

 今,この自機がマップ上の座標(r,c)のパネルに位置しているとすると,上下左右のパネルの座標は,次のように表せます。

上:(r - 1, c)
下:(r + 1, c)
右:(r, c + 1)
左:(r, c - 1)

したがって,矢印キーの上下左右に応じて移動先のパネルの絵柄を取得し,そこが「平地」であれば移動できるようにすればよさそうです。それぞれのパネルの絵柄は,リスト1の(6)[拡大表示]で_typeの値として保持していました。そこで,移動先のパネルの_typeの値が「1」のときだけ,移動させるようにします(リスト2[拡大表示])。なお,自機はリンケージ識別子SMyShipのインスタンスを動的に作成し,利用します。

 まず,自機インスタンスと,現在位置を管理する変数を用意します。ゲームを開始すると最初に呼び出される関数initGameでは,マップを作成した後,自機インスタンスを作成し,初期位置を(5,0)にセットします(1)。そして移動判定用の関数moveMyShipを呼び出します(2)。

 関数moveMyShipでは,キーボードの矢印キーが押されていれば,その方向に応じた移動先パネルを取得します(3)*9。移動先のパネルの_typeの値が「1」であれば,自機の位置を更新し,現在の座標を管理する変数を更新します*10

 ここで(4)に注目してください。自機を移動させた後に,swapDepthメソッドを使って自機の深度を移動先パネルの_charDepthの値に変更していますね。配列変数fieldsに格納しているパネルはインスタンスごとに,_charDepthの値として深度情報を保持させています(リスト1の(6))。最初の行(0行目)は10,次の行(1行目)は30,といった具合です。さらに,リスト1(2)からわかるように,各パネルの深度は,0行目が0~9,1行目が20~29になっています。そこで移動先のパネルの_charDepthの値を自機の深度にすることで,「手前のパネルの絵柄には隠れ,後ろのパネルよりは手前に来る」ように表示させているわけです。

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