3D迷路−イベントの処理

 前回作ったダンジョンで「イベント」を起こしてみましょう。イベントとは、ゲームの中で誰かと会ったりアイテムを拾ったり、キャラクタの現在位置や方向が突然変わったり、というもので、今回は「現在向いている方向が逆になる」イベントを作ります。

データ形式

 前回は、マップデータの配列に壁と床という迷宮の情報を、0と1で格納しましたね。今回は、マップデータに迷宮の情報だけでなくイベント情報も入れてしまいましょう。マップデータ、イベントデータとも今回とり得る値は0か1だけですが、拡張性も考慮して、それぞれ16種類(0ー15)の値を表せるようにしました。これは、16進数で表すとちょうど一桁(4ビット)に収まるので、迷宮データを16進数2桁($00-$ff)とすると都合が良いですね。上位4ビットをイベントデータ、下位4ビットを迷宮データとしましょう。イベントデータは、0だと何もなしで、1だと方向を逆にする、という事にします。イベントが起こるのは床だけなので(壁には入れないので当然)、マップデータとしては、$01(壁)、$00(イベントなしの床)、$10(床イベントありの床)という3通りがある事になります。

 イベントの処理は、移動した後にマップデータの上位4ビットを見て(最も今回の場合は、そのまま値が$10かどうかを見ても良いが)1なら方向を逆転させるだけです。

 if map[x,y] and $f0=$10 then
 begin

   dx:=-dx;
   dy:=-dy;

 end;

 という流れになるでしょう。

迷宮の地図

 それから、今回のプログラムでは迷宮の地図の表示法も変えてみました。前回は最初から全体が表示されましたが、今回は通った場所をだんだんに描き加えていくようにして、「探検」しながら地図を完成させるようになっています。
 この処理は、マップデータとは別に同じ大きさの地図用配列を用意して、そこに通過した場所周辺の情報を書き込めば良いですね。迷宮データは、0か1なので地図用配列は最初にどちらでもない2で初期化しておきましょう。後は、移動の処理をしたら毎回

 for i:=y-1 to y+1 do
   for j:=x-1 to x+1 do
     uMap[j,i]:=Map[j,i] and $0f;

 として地図用配列uMapに周辺の様子(迷宮データのみ)を書き込んでいきます。そして、地図を描く時は

 for i:=0 to 15 do // 迷路の地図を表示
   for j:=0 to 15 do
   begin

     case (uMap[j,i]) of

        0:
          mapI.Canvas.Brush.Color:=clWhite;
        1:
          mapI.Canvas.Brush.Color:=clBlack;
        2:
          mapI.Canvas.Brush.Color:=clGray;

      end;

      mapI.Canvas.fillRect(Rect(j*5,i*5,j*5+5,i*5+5));

    end;

 という感じで、マスごとにまだ通っていなければ(地図用配列の値が2)灰色で、壁(1)なら黒、通れる床(0)なら白で塗りつぶします。
 もちろん、地図を描くだけなら移動のたびにマップデータを見て、周辺の状況を描き込むだけでも可能です。むしろ、地図を描く時にはそうした方が効率的でしょう(今回は手抜き)。ただ、「どこを通ったか」という情報が必要になる事もあるかもしれませんし、セーブする時も描き込んだ地図をそのままビットマップで保存するよりは、地図を配列として保存した方が扱いやすくなります。

 プログラムをダウンロードしたら、しばらく歩いて見てください。上の方にいくと、突然方向が変わるのがわかるでしょう。地図を確認しながら方向を保てば容易に切り抜けられますが、地図に表示する情報(特に方角)を制限したゲームでは、これはかなりきつい罠になるはずです。

プログラムダウンロード(maze2.lzh 104KB)
戻る