2023/09/24(日) [n年前の日記]
#1 [hsp] 疑似3D道路その18
_先日
の続き。HSP 3.6 を使って、疑似3D道路が作れないか試しているところ。環境は Windows10 x64 22H2。
スクーターの描画位置を3Dで計算すると妙な位置に表示されてしまってずっと悩んでいたけれど、原因が分かった。#define の定義が間違ってただけだった…。こんなしょーもないことで3日もハマっていたなんて、自分、間抜けすぎる…。
スクーターの描画位置を3Dで計算すると妙な位置に表示されてしまってずっと悩んでいたけれど、原因が分かった。#define の定義が間違ってただけだった…。こんなしょーもないことで3日もハマっていたなんて、自分、間抜けすぎる…。
◎ バグの原因 :
配列に x,y,z値を格納して処理しているけれど、そのままだとソース内で謎の数値が列挙されて(ハードコーティング?)、何が何やら分からなくなってしまう。そこで、配列のインデックス値を、#define を使って意味が分かる単語に置き換えていたのだけど…。
その #define で指定する値を間違えていて、妙なことになっていたという…。トホホ。
バグが出にくいソースにしようとして、かえってバグを入れてしまうとか、なんだかな。HSP が構造体だの連想配列だのを使える言語仕様だったら、こんなことしなくても済んだのだろうけど…。
※ 2023/09/25追記。#enum を使えばこういうミスを防げると知った。追記終わり。
#define SEG_CX 10 ; x方向にずらす量(3D) #define SEG_CY 11 ; x方向にずらす量(3D) ... seg(i, SEG_CX) = 0.0 ; 本来の位置からずらす量 x値 seg(i, SEG_CY) = 0.0 ; 本来の位置からずらす量 y値
その #define で指定する値を間違えていて、妙なことになっていたという…。トホホ。
; 記述するインデックス値を間違えてる。コピペ時のあるあるネタ #define SEG_CX 10 ; x方向にずらす量(3D) #define SEG_CY 10 ; x方向にずらす量(3D)
バグが出にくいソースにしようとして、かえってバグを入れてしまうとか、なんだかな。HSP が構造体だの連想配列だのを使える言語仕様だったら、こんなことしなくても済んだのだろうけど…。
※ 2023/09/25追記。#enum を使えばこういうミスを防げると知った。追記終わり。
◎ 車の台数を増やしてみた :
スクーターがそれらしく表示できたので、道路上を走らせる車の台数を4台まで増やしてみた。4車線に見える道路なので、1車線につき車1台を走らせる感じ。
各車のワークには z値を持たせた。そのz値から、その車が居るはずの道路のセグメントを特定できる。
各セグメントには、車を描画するかしないかの変数を持たせることにした。今回は車を4台しか出さないつもりなので、bit単位で、車を描画するかしないかのフラグにしてみた。
これで、セグメント(道路)とビルボード(木)を描画するタイミングで車も描画できるようになったので、奥のほうから手前に向かってセグメント単位でアレコレ描画していけば済むようになった。
各車のワークには z値を持たせた。そのz値から、その車が居るはずの道路のセグメントを特定できる。
各セグメントには、車を描画するかしないかの変数を持たせることにした。今回は車を4台しか出さないつもりなので、bit単位で、車を描画するかしないかのフラグにしてみた。
0b0000xxxx |||| |||+- 1台目の車を描画 ||+-- 2台目の車を描画 |+--- 3台目の車を描画 +---- 4台目の車を描画車の台数がもっと増えてきたら、こんな管理の仕方ではマズいだろうけど、今回は数が少ないからこれでもいいかなと…。
これで、セグメント(道路)とビルボード(木)を描画するタイミングで車も描画できるようになったので、奥のほうから手前に向かってセグメント単位でアレコレ描画していけば済むようになった。
◎ 車について調べ始めた :
車の画像を作らないといかんなと、車種について調べ始めた。
ゆるキャンに出ていた感じの車がいいなとググってみたけれど、ゆるキャンに出ていたグビ姉先生の車は、スズキ ハスラーという車種らしい。画像を検索して、形を把握しようとしているところ。
ゆるキャンに出ていた感じの車がいいなとググってみたけれど、ゆるキャンに出ていたグビ姉先生の車は、スズキ ハスラーという車種らしい。画像を検索して、形を把握しようとしているところ。
◎ 2023/09/25追記 :
以下の記事を眺めていたら、#enum を使えば順々に数値を増やしていく定義ができると知った。
_HSPにおける構造体機能の代替 - Qiita
_OHDL - #enum
これを使っておけば、今回のようなミスをしなくても済んだのだな…。
_HSPにおける構造体機能の代替 - Qiita
_OHDL - #enum
例 : #enum KAZU_A = 0 ; KAZU_Aは0になる #enum KAZU_B ; KAZU_Bは1になる #enum KAZU_C ; KAZU_Cは2になる a=KAZU_B ↓(展開後) a=1
これを使っておけば、今回のようなミスをしなくても済んだのだな…。
[ ツッコむ ]
以上です。