【Python】3D迷路の中を歩きたい②
前回は、現在の位置と方向を判断して、マップから表示に必要な情報を取得するところまで行いました。
今回は、実際に画面へ表示するための考え方になります。
なお、描画の方法(アルゴリズム)はいくつかありますが、ここでは一番簡単な手法を記載します。
実際に画面に描画する前に
画面に描画する前に、まず、画面の座標系は以下と仮定します。
ここに、奥から手前に向かって壁の絵を書いて行けば良い訳です。
その前に、前回はマップの情報を取得する順番を以下のようにしていました。
|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) )
一番奥の壁を描く
さて、前置きが長くなりました。
まずは一番奥の壁から描きます。
壁の描画イメージは、次の図のようになります。
まずは0番目、一番左奥が壁だった時は、次のような描画をします。
何となく立体に見えればOKです。
次に、その一つ右が壁だった時は、以下を上書きで描画します。
その結果、一番左の壁のサイドの部分が無くなり、以下のような画面になるでしょう。
これと同様に右側も描いていき、最後に正面の壁を描けば終わりです。(正面の壁は、真四角を描くだけですね)
残りの壁を描く
残りの壁も、同じ考え方で上書きしていきます。
ただ、一番奥と違うのは、自分の正面とその左右のみ描くという点です。
また、壁のサイドの部分は、奥の壁と不自然につながらないように気を付ける必要がありますので、座標の計算には注意してください。
参考として、一番奥から一つ手前の壁を描くイメージは、次のようになります。
例えば5番目が壁だった時は、次のように描画します。
先ほどの一番奥の描画に、これを上書きした結果は、以下のようになるはずです。
また、自分の直前の壁を描くイメージは、次のようになります。
8番目が壁だったら、以下のようになりますね。
最後に、自分の左右が壁だった場合です。
ここだけちょっと特殊で、まずイメージは以下になります。
通常は壁が通り抜けられないので、自分の位置が壁になることはありません。そのため、D番目は無視します。
さて、自分の左右が壁の場合ですが、それぞれのサイド部分だけ描画します。
例えば、B番目が壁だった場合は、次のようにします。
最後に
結局のところは、前の記事に書いた、どうやってデータを拾うかと、データが処理しやすい順番に拾えるか、が全てになります。
それさえクリアしてしまえば、画面に表示すること自体は単純になることがおわかり頂けたかと思います。
ちなみに、「3D迷路を歩きたい」というタイトルなのに移動処理に触れていないのは、移動すること自体、それほど難しくないためです。
(ヒントも前の記事に描いています)
実際にキー入力から移動する処理を組んでみて、迷路を歩けるか試してみるのも面白いと思います。