aburi6800のブログ

コンピュータのプログラミング、ゲームに関するニッチな情報を書いていくブログです。

【Python】3D迷路の中を歩きたい②

 前回は、現在の位置と方向を判断して、マップから表示に必要な情報を取得するところまで行いました。
 今回は、実際に画面へ表示するための考え方になります。
 なお、描画の方法(アルゴリズム)はいくつかありますが、ここでは一番簡単な手法を記載します。

実際に画面に描画する前に

 画面に描画する前に、まず、画面の座標系は以下と仮定します。

f:id:aburi6800:20200609001751p:plain
画面の座標

 ここに、奥から手前に向かって壁の絵を書いて行けば良い訳です。
 その前に、前回はマップの情報を取得する順番を以下のようにしていました。

 |0|1|2|3|4|
   |5|6|7|
   |8|9|A|
   |B|C|D|

 これだと処理の都合が悪いので、以下のように正面を最後にするように変更します。

 |0|1|4|3|2|
   |5|7|6|
   |8|A|9|
   |B|D|C|

 この順でのマップ参照先の定義は、以下のようになります。

# マップの参照先の定義
# 参照順のイメージは以下(上向きの場合。自分の位置はDとする)
# |0|1|4|3|2|
#   |5|7|6|
#   |8|A|9|
#   |B|D|C|
POS_X = (
    (-2,-1, 2, 1, 0,-1, 1, 0,-1, 1, 0,-1, 1, 0),
    ( 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0),
    ( 2, 1,-2,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0),
    (-3,-3,-3,-3,-3,-2,-2,-2,-1,-1,-1, 0, 0, 0)
)
POS_Y = (
    (-3,-3,-3,-3,-3,-2,-2,-2,-1,-1,-1, 0, 0, 0),
    (-2,-1, 2, 1, 0,-1, 1, 0,-1, 1, 0,-1, 1, 0),
    ( 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0),
    ( 2, 1,-2,-1, 0, 1,-1, 0, 1,-1, 0, 1,-1, 0)
)

一番奥の壁を描く

 さて、前置きが長くなりました。
 まずは一番奥の壁から描きます。
 壁の描画イメージは、次の図のようになります。

f:id:aburi6800:20200609003602p:plain
一番奥の壁のイメージ
 まずは0番目、一番左奥が壁だった時は、次のような描画をします。
f:id:aburi6800:20200609003331p:plain
0番目が壁だった時の描画
 何となく立体に見えればOKです。
 
 次に、その一つ右が壁だった時は、以下を上書きで描画します。
f:id:aburi6800:20200609003813p:plain
1番目が壁だった時の描画
 その結果、一番左の壁のサイドの部分が無くなり、以下のような画面になるでしょう。
f:id:aburi6800:20200609004031p:plain
0番目と1番目が壁だった時の描画
 これと同様に右側も描いていき、最後に正面の壁を描けば終わりです。(正面の壁は、真四角を描くだけですね)

残りの壁を描く

 残りの壁も、同じ考え方で上書きしていきます。
 ただ、一番奥と違うのは、自分の正面とその左右のみ描くという点です。
 また、壁のサイドの部分は、奥の壁と不自然につながらないように気を付ける必要がありますので、座標の計算には注意してください。
 
 参考として、一番奥から一つ手前の壁を描くイメージは、次のようになります。

f:id:aburi6800:20200609014025p:plain
一番奥から一つ手前の壁のイメージ
 例えば5番目が壁だった時は、次のように描画します。
f:id:aburi6800:20200609010955p:plain
5番目が壁だった時の描画
 先ほどの一番奥の描画に、これを上書きした結果は、以下のようになるはずです。
f:id:aburi6800:20200609011103p:plain
1,2,5番目が壁だった時の描画
 
 また、自分の直前の壁を描くイメージは、次のようになります。
f:id:aburi6800:20200609011220p:plain
直前の壁の描画順
 8番目が壁だったら、以下のようになりますね。
f:id:aburi6800:20200609011525p:plain
8番目が壁だった時の描画
 
 最後に、自分の左右が壁だった場合です。
 ここだけちょっと特殊で、まずイメージは以下になります。
f:id:aburi6800:20200609011727p:plain
自分の左右が壁だった時のイメージ
 通常は壁が通り抜けられないので、自分の位置が壁になることはありません。そのため、D番目は無視します。
 さて、自分の左右が壁の場合ですが、それぞれのサイド部分だけ描画します。
 例えば、B番目が壁だった場合は、次のようにします。
f:id:aburi6800:20200609012238p:plain
B番目が壁だった時の描画

最後に

 
 結局のところは、前の記事に書いた、どうやってデータを拾うかと、データが処理しやすい順番に拾えるか、が全てになります。
 それさえクリアしてしまえば、画面に表示すること自体は単純になることがおわかり頂けたかと思います。
 
 ちなみに、「3D迷路を歩きたい」というタイトルなのに移動処理に触れていないのは、移動すること自体、それほど難しくないためです。
(ヒントも前の記事に描いています)
 実際にキー入力から移動する処理を組んでみて、迷路を歩けるか試してみるのも面白いと思います。