どうも。よく忘れるけどたまに異常な記憶力を発揮する私です。
最近あんまりプログラミングやってませんでした。
まあ忙しかったのもありましたし、ゲーム作りより楽しいこといっぱいあるので。
ゲーム作りは楽しいことがなくなったらやるみたいな感じになってます。
あれ? これ失踪フラグじゃね?
と思いましたがまあこの世界にはそんなに楽しいことないので大丈夫でしょう。
さて、今日は3Dの話でも。
前に配布したステージ1の背景(地面と木がこっちに来るやつ)ですが、あれは3D覚えたてのころに書いたもので、DXライブラリのVECTORクラスの変数を使って、
DrawPolygonIndexed3D関数をそのまま使って記述するというなんともスマートでないやり方をしていました。
まあ結果ちゃんと動いてるのでいいのですが、1面を改造するにあたって、背景も手を加えなければいけなくなりました。
そこで、コードを書き直したわけですが、根本的なアルゴリズムも変えることにしました。
今までは200Fでループする背景だったので、地面も木も200F z-=1 としたあとに z+=200 して(z=-time%200)、どんどんこちら側に来てるようにしていました。
これだと色々と手を加えられないので、200Fごとに1つ、奥から出現させて、z-=1 し続け、カメラより後ろに行ったら消滅、みたいな感じにしました。
そして思ったのです。
実際に動いてるのはカメラなんだから、オブジェクトじゃなくてカメラ動かした方が自然じゃない? と。
実際、途中でプレイヤーが曲がる場面があるのですが、オブジェクトを移動させる方針だと回転がかなり面倒なことになります。
そこでオブジェクトは動かさず、カメラを前進させる方向で書き直しました。
そして気付く。
描画されねえ・・・。
初心者がゲーム作りをしていて立ちはだかる最大の壁なのではないでしょうか。
「なんでかわかんないけど描画されない」
今まで何度もこれに苦しめられてきました。
描画されない以上、何が原因かの特定が難しいのですよね。
ちなみに今回の場合、まず自作関数を疑いました。この自作関数は別の自作関数を呼び、それはDrawPolygon3Dを呼びます。
その自作関数は今まで使ったことありませんが、別の自作関数はちゃんと動作することがわかってます。
そこで自作関数をよく調べる → 間違ってた! → 直す → それでも描画されないorz
次に考えたのが、今まで平気だったのに直したら描画されなくなったので、前回からの変更点を考えました。
1つはフォグを導入したので切ってみたらこれも違う。
ならば、色々やってみるしかあるまい。
関数に渡した画像に問題があるのかと思って違う画像を渡してみたがダメ。
ちゃんと動く別の自作関数にパラメータを変えて直接渡してみたがダメ。
DrawSphere3D関数を使ってみたがこれもダメ。
え、これもダメなの!?
さすがにいくらなんでもそれはおかしいので、もっと根本的な部分を考えてみることにしました。
カメラのz座標が大きいと何か問題があるのかもしれないと思って、z=-400からスタートさせてみたところ、
今までデバッグ用にぶち込んで来た描画関数が、全てちゃんと機能しました。
なんだ、z座標が原因だったのか(でもそれっておかしくね?)
そしていきなりフッと消滅する。 なんだこれは。
慌てて止めてみると、z=63だったのでどうやらカメラがz>0になったときに消えた模様。
なぜだ。なぜだ、なぜなんだ。
そしてDXライブラリのリファレンスを眺めていて気付く。
注視点の座標(320,240,1)だったわ
今までなんの疑問も持たずに使ってきたけど、一種のベクトルだと思ってzには1を使ってきたが、注視点とちゃんと書いてあるんですねこれが。
注視点を通り過ぎたためにカメラが後ろを向いてしまったから何も描画されなかったというわけです。
これはひどい。
私のゲーム作りはこんなのばっかですが、それでも一歩一歩着実に歩を進めております。
ただ、それが鈍い上にゴールが果てしなく遠いわけですが。
と、かっこいいことを言ったところで今日の日記はおしまいにしましょう。
叛逆の物語を見ねば。
え? ゲーム作り?
・・・・・・そのうちやりますよ。
バグと3Dとカメラ
コメントはまだありません。