迷路

迷路を歩き回るプログラムを作ってみた。

スクリーンショットを見るだけだとなんともしょぼいものである。


このプログラムのポイントは、操作系がカーソルキーで上下左右ではなく、上下で前後に移動、左右で回転なところだ。
んで、自分が回転するのではなく、画面上では常に上が前、つまり、迷路のほうが回転して描画される。
迷路の描画は画像の回転と似たようなアルゴリズムなのではないかと思う。
何かを参考にしたわけじゃなくテキトーに思いつきで作った。
これができると、自分を中心とした相対的な迷路イメージが作れるから、疑似3DのダンジョンRPGなどにも応用できる。
っていうか、そのへんのゲームってどうやってああいう画面描いてるんだろうねえ。

require 'dxruby'

# マップ
map = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1],
       [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1],
       [1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1],
       [1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1],
       [1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
      ]

Window.width = 112
Window.height = 112

x = 1
y = 1
dx = 0
dy = 0
angle = 1

# 向きによる増分
angledata = [[0, -1], [1, 0], [0, 1], [-1, 0]]

image = Image.new(16, 16, [255, 255, 255, 255])
jibun = Image.new(16, 16, [255, 255, 0, 0])

Window.loop do
  # 左右おした
  angle -= 1 if Input.padPush?(P_LEFT)
  angle += 1 if Input.padPush?(P_RIGHT)
  angle = 0 if angle > 3
  angle = 3 if angle < 0

  # 上おした
  if Input.padPush?(P_UP)
    newx = x + angledata[angle][0]
    newy = y + angledata[angle][1]
    if map[newy][newx] == 0
      x = newx
      y = newy
    end
  end

  # 下おした
  if Input.padPush?(P_DOWN)
    newx = x + angledata[angle - 2][0]
    newy = y + angledata[angle - 2][1]
    if map[newy][newx] == 0
      x = newx
      y = newy
    end
  end

  # 画面描画
  for i in 0..6
    for j in 0..6
      jx = x + angledata[angle - 3][0] * (j - 3) + angledata[angle - 2][0] * (i - 3)
      iy = y + angledata[angle - 2][1] * (i - 3) + angledata[angle - 3][1] * (j - 3)
      next if iy < 0 or iy > 15 or jx < 0 or jx > 15
      if map[iy][jx] == 1
        Window.draw(j * 16, i * 16, image)
      end
    end
  end

  # 自分(赤の四角だけど)描画
  Window.draw(48, 48, jibun)

  break if Input.keyPush?(K_ESCAPE)
end