はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX シューティングゲーム開発スタート そしてさっそく躓く

今回はそんな間を空けず更新できました。はかせです。

今回からシューティングゲーム(STG)の開発をしていくことにしました。
一応1ヶ月程度の期間で作ろうと思っています。

そこで開発初めてさっそく躓いたので
そのことについて書いていこう思います。
(あれ・・?なんかこの感じ初めてじゃない気がする・・)

まぁとりあえず今回思ったのは
入力は切り分けよう
てことですねw

発生した問題

とりあえずまずはSTGなので弾出せなきゃなと思い、弾を出そうとしました。

それで弾を出すことには成功したのですが
何故かずっと当たっている判定になっていたのが今回の問題です。

まずどういう時にその状態になるのかから探り始めました。
①最初に生成しといたものは問題なく判定がとれている
②動的に生成したオブジェクトだけが当たり判定に異常が出ていた
③衝突した相手のオブジェクトの名前を調べたところ自分と同じだった
以上のことから弾の生成ロジックに問題があるのではと思い
そのあたりから検証を始めました。

確認したことは
①生成したオブジェクトが正しく配列に格納されているか
②当たり判定で誤って同じもの同士で判定をしていないか

どちらもデバッガを使ってステップ実行を行い確認しました。
結果はどちらもロジック的には正常に動いていました。

ただおかしい点がありました。
生成されたオブジェクトの数がおかしかったのです。

解決

さっきのおかしい点から生成ロジックそのものではなく
生成ロジックの呼び出しに何か異常があるのではないかと思い
今度はそこから検証を行いました。

1フレーム内に複数回呼び出されているのではと思い、
呼び出されたらカウントして1フレームが終わった時に表示しました。

結果は予想通りで2回も3回も呼ばれていました。
理屈も単純で私が入力を「押されているか」の
二値でしかとっていなかったために複数回呼ばれてしまっていました。

ということで押された瞬間のみを取って実行したら解決しましたw

BOOL DXInput::GetKeyDown(int key)
{
	if(mInputBuffer[key] & isInputNum)
	{
		if(!(mPreInputBuffer[key] & isInputNum))
		{
			return TRUE;
		}
	}
	return FALSE;
}

BOOL DXInput::GetKeyUp(int key)
{
	if (!(mInputBuffer[key] & isInputNum))
	{
		if (mPreInputBuffer[key] & isInputNum)
		{
			return TRUE;
		}
	}
	return FALSE;
}

やり方は単純で1フレーム前の入力状況と比較して
押された瞬間かどうか判断しています。
(ちゃっかり離された瞬間も実装していますw)

入力を作った時に面倒臭がらずちゃんと作っとけば良かったなーと
後悔しましたorz

結構こういった単純なミスってやりやすくて気づき辛いんですよね
(メモリリークとか)

こんなアホなミスするのは自分位かもですが
自分自身への戒めとしてこの記事を出したいと思います。
(ちなみに解決に土日丸々つぶしましたorz)

今回作ったものはgithubに上げました
https://github.com/hakase0724/DirectX/tree/Shooting