メモ帳などの等幅フォント・固定幅で読んでください。タブ半角8桁でないとレイアウトが崩れます。半角で80桁、全角40桁無いと読み辛いと思います。 私の拙作『Vulgardry』をリメイクする際に考えた方法です。 こちらが実際に使ったアルゴリズムです。 『擬似3D迷路の壁描画アルゴリズム(一番奥から見ていく場合)』 2013/01(2013/12公開用に手入れ) by baa 迷路の設定 簡単の為、通路だけで広間は無し。16×8や16×16などの矩形とする マップデータの形式 迷路を上から見た状態で、16進数表記で、Fが壁、0が通路、1〜Eが 階段やイベントとして、矩形の行列状に並んでいるとする  例)    1                16   1F,F,F,F,F,F,F,F,・・・F   F,9,0,0,0,0,0,0,・・・F   F,0,F,0,F,F,F,F,・・・F   F,0,F,0,0,0,0,0,・・・F   : : : : : : : :  :F  16F,F,F,F,F,F,F,F,・・・F 迷路の視界 最大3ブロック、左の数字は自分から見たマップデータの 読み込み順を表しており、自分=自、1〜Bはそれぞれ データの1つ分(実際の1ブロック)を表す  A9B   \        /  768    |\     /|  435    | |\  /| |  1自2    | | | | | |         | |/  \| |         |/     \|        /        \ 迷路描画を考える 上から見ると、全ての壁は下図の順で並んでおり、手前に 壁がある場合は、奥の壁は見えない   A9B     _  _   768    _/ ̄ ̄\_   435   _/ ̄ ̄ ̄ ̄\_   1 2   / ̄ ̄ ̄ ̄ ̄ ̄\    自      ↑視点↑ (実際の手順を考えるときには、この図で前後関係を見る) 手前に壁がない時には、奥の壁の側面を描かなくてはいけない   A9B  \        /   768   |↓     ↓|   435   | ̄ \  /  ̄|   1自2   | | | | | |         |_ /  \ _|         |       |        /        \ 言葉で俯瞰図(上から見た状態)を書くとこうなる   A 9 B         左奥 正面小 右奥  7壁  8壁        左小     右小  7側 6 8側     左小側←――正面中――→右小側  4壁  5壁     左中          右中  4側 3 5側  左中側←―――――正面大―――――→右中側   1   2   左大                右大     自             ↑ 視点 ↑ 例えば、左小側面の壁の前には、視点の方向から、正面大、 左中という具合に、手前に2枚の壁が有る場合がある 大雑把に「奥から見る」描画の段階を分けると  1.壁が有れば描く一番奥の“A9B”  2.壁が有れば描く次の“768”  3.壁が有れば描く前の“435”  4.壁が有れば描く手前の“12” となるが、段階1.のAとBでは側面だけを描き、段階2.と段階3.の 7と8、4と5では左右の壁と側面を描き、段階4.では壁だけを描く このように、単純にマップを読んで、奥から壁を描いて行けば、 手前の壁を描いた時点で、自動的に奥の壁が隠れるので、方法 としては簡単であるが、描画量が格段に増えてしまう。 この考え方を改良して、壁を描く描かないの表を作ってから 描画することにして、描画量を減らす 実際の手順 1)最初に、1〜Bの各々が壁かどうか?マップデータを読んで   表にする   壁をF、空きを0として、例えばこの図の場合   A9B   \   768    |\     /  ̄   435    | |\  /| |   1自2    | | | ̄| | |          | |/  ̄ \| |          |/     \ _         /    1 2 3 4 5 6 7 8 9 A B    左 右 正 左 右 正 左 右 正 左 右    大 大 面 中 中 面 小 小 面 奥 奥    壁 壁 大 壁 壁 中 壁 壁 小 壁 壁    F 0 0 F F 0 F F F F F   の様な表となる(注1)。AとBの位置はこの図の場合は見えないので   仮に、Fとしておいた。   次に7、8、4、5をコピーして、側面の表を追加する。    1 2 3 4 5 6 7 8 9 A B C D E F    左 右 正 左 右 正 左 右 正 左 右 左 右 左 右    大 大 面 中 中 面 小 小 面 奥 奥 小 小 中 中    壁 壁 大 壁 壁 中 壁 壁 小 壁 壁 側 側 側 側    F 0 0 F F 0 F F F F F F F F F   注意、4578ではなく、7845の順にコピーすること!  Z80のアセンブリ言語で書くなら   WALTMP: DEFS 15   などと、15バイト分メモリのどこかを確保しておいて   0F 00 00 0F 0F 00 0F 0F 0F 0F 0F 0F 0F 0F 0F   みたいに、書きこめばOK   なお、自分の向いている方向(方角?)に合わせて、データの   読み順を回転すること   例:左を向いている場合の読み順     B852     963自     A741 2)話を戻して、この図の状態のマップデータから作った表が   A9B   \   768    |\     /  ̄   435    | |\  /| |   1自2    | | | ̄| | |          | |/  ̄ \| |          |/     \ _         /    1 2 3 4 5 6 7 8 9 A B C D E F    左 右 正 左 右 正 左 右 正 左 右 左 右 左 右    大 大 面 中 中 面 小 小 面 奥 奥 小 小 中 中    壁 壁 大 壁 壁 中 壁 壁 小 壁 壁 側 側 側 側    F 0 0 F F 0 F F F F F F F F F   この様になった場合で話を進める   表の3を読む。もしFなら正面大の奥に当たる表の4〜Dを全て   0にして、8)の“1自2”の行に移動する。   今回の3はFではないので、何もしないで次へ進む 3)6を読む。もしFなら奥の7〜Bを全て0にして   6)の“435”行に移るが、0なので何もしないで次へ 4)7を読む。Fなので奥のAに0を書き込んで次へ 5)8を読む。Fなので奥のBに0を書き込んで次へ 6)4を読む。Fなので奥のCに0を書き込んで次へ 7)5を読む。Fなので奥のDに0を書き込んで次へ 8)1を読む。Fなので奥のEに0を書き込んで次へ 9)2を読む。もしFなら奥のFに0を書き込むが   0なので何もしない 完了、表はこうなる    1 2 3 4 5 6 7 8 9 A B C D E F    左 右 正 左 右 正 左 右 正 左 右 左 右 左 右    大 大 面 中 中 面 小 小 面 奥 奥 小 小 中 中    壁 壁 大 壁 壁 中 壁 壁 小 壁 壁 側 側 側 側    F 0 0 F F 0 F F F 0 0 0 0 0 F この表のFの壁だけを描画すれば・・・   A9B   \   768    |\     /  ̄   435    | |\  /| |   1自2    | | | ̄| | |          | |/  ̄ \| |          |/     \ _         / おお、ちゃんと表示された!  この「奥から見ていく」アルゴリズムは「手前から見ていく」アルゴリズムと 比べて、凡そ3分の2のステップで済むし、考え方も分かりやすいと思う。  関係ないが、現在のリアルタイム3D等ゲームで画像を作る場合は、8ビット 機の3Dとはレベルは違うが、普通はこの文とは逆に、物が在るか「手前から見 ていく」方法を使うらしい。 (ホントか? いや、レイキャスとかレイトレとかネ。既に古いか(^^;)?) 注1.ここで、正面の3や6が壁、すなわちFの場合には、その次の行以降は    読む必要が無いのだが、判定をいれるとプログラムがややこしくなる。     常に最後の“A9B”行まで読むとすれば、迷路の端で壁を向くと、    正規のマップデータ以外の部分を読んでしまう。しかしデタラメな数値    を読みこむだけで、描画時には使わないので、全然大丈夫である。     ちゃんとしたい人は、マップの外側を上下左右合わせて4行+4列分    無駄に空き地を確保しなければならない。「気分だけ」のことだが。     また、1万分の1秒でも速くしたい人も、3や6が壁の際にその行で    表作りを中止する判定処理を(それで逆に遅くならないように上手に)    入れるが、現代のリアルタイム3Dの様に常時何かを計算しているので    もなければ、BGM鳴らしと敵出現用の乱数計算や現在位置のイベント    有無チェック程度では、どちらにしろ画面の描画単位である1/60秒    以内に十二分に間に合うので、やはり「気分だけ」のことである    例:6が壁なので、768行まで読んで中止する場合    A9B  \        /    768   |\_____/|    435   | |    | |    1自2   | |    | |          | |    | |          |/ ̄ ̄ ̄ ̄ ̄\|         /        \    1 2 3 4 5 6 7 8 9 A B C D E F    左 右 正 左 右 正 左 右 正 左 右 左 右 左 右    大 大 面 中 中 面 小 小 面 奥 奥 小 小 中 中    壁 壁 大 壁 壁 中 壁 壁 小 壁 壁 側 側 側 側    F F 0 F F F F F ? ? ? F F F F                   中止したので不定    7と8はこの図では分からないが、仮にFとしておいた