3Dダンジョン表示

迷宮探検タイプの3D迷路表示プログラムを、Delphiで作ってみます。壁に遠近をつけて立体的に描画することで、実際に迷路をさまよっているような3D視点による表示が可能になり、ダンジョン(地下迷宮)を舞台にしたゲームでは効果的でしょう。

立体表示というと「難しい」と思われるかもしれませんが、今回のように迷路を立体表示するだけならそれほど難しくありません。実際、表示する時には立体化を「計算」で行うのではなく、単にそれらしく見えるよう予め決めておいたパターンを配置するだけ(^^;です。なんか、インチキみたいですが単純な迷路を描くなら、これでも十分雰囲気を出す事が出来ます。

迷路のデータは、2次元配列に入れます(1が壁)。表示する時には、まず今どこにいてどの方向を向いているか、を確認した上で「進行方向」の迷路(壁)を描いていけばよいわけです。

迷路の座標は、一番左上が(0、0)でx は右に行くほどyは下に行くほど増加するものとしましょう。今回用意した配列の大きさは16*16です。

移動は、ボタンを4つ置いてそれぞれを上下左右に対応させます。上(「前進」)ボタンが押されたら現在向いている方向に一つ進み、左右や下(「反転」)ボタンなら向きを変えるようにしました。横の方の地図に現在位置と方向が三角形で表示されるので、ボタンを押すと位置や方向がどうかわるのか、確認してみましょう。

3D表示を行う時は、まず床と天井を描いてから現在位置(x,y) と方向(dx,dy)を確認します。dx とdy は進行方向に進んだ場合の座標の「増加分」になっており、例えば今上を向いているならy が減少する方向なのでdy は-1になりxは変化しないのでdx は0 です。

続いて、進行方向3つ先から順番に壁があれば壁を描く処理をします。遠くから順番に「視界を遮る障害物」を描画することで、「目の前の壁」で遠くが覆い隠されるようにするわけですね。

描く範囲は、横方向が今いる座標を中心とする3マスで縦(進行方向)が、3マス先までです。ただし、3マス先では横方向をさらに左右に1つづつ余計に描いて遠近感を出しました。

・進行方向が上下方向(dy=1 またはdy=-1)の時

 if (map[x+dx*3,y+(dx*-2)]=1) and (map[x+dx*3,y+(dx*-1)]=1) then
  drawWall(12);

 if (map[x+dx*3,y+(dx*2)]=1) and (map[x+dx*3,y+(dx*1)]=1) then
  drawWall(13);

 for i:=0 to 3 do
   for j:=-1 to 1 do
      begin

        if map[x+dx*(3-i),y+j*dx]=1 then
          drawWall(i*3+j+1);

     end;

 for i:=0 to 3 do
   if map[x+dx*(3-i),y]=1 then
     drawWall(i*3+1);

上のプログラムでは迷路の配列を見て壁があるか調べ、壁があればその位置を引数として壁を描くdrawWallを呼びます。この位置と引数は、

 12 9 10 11 13
    6  7  8
     3  4  5  ↑進行方向 
   0  1  2

という対応になっていて、1の位置が現在位置です。実際にどんなパターンを描くかは、プログラムをご覧ください。基本的には、遠くは小さく近くは大きく、です。プログラムでは、表示する時にグラデーションをかけてありますので、色を変化させるループに惑わされないよう注意してください。

プログラムダウンロード(maze1.lzh/103KB)

プログラムを実行すると、3Dダンジョン風の迷路が出てきます。ボタンをクリックしながら移動してみてください。


プログラミング資料庫 > ゲーム制作研究室