はかせのラボ

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

DirectX 衝突 2Dの正方形

お久しぶりです。はかせです。
かなり久々の投稿になってしまいました。

というのも別にサボっていたわけではなくてですね
色々作業したり、イベント出たりしてたらこうなっちゃったて感じですw

今回はその辺をサクッと話して、
ようやっと出来た衝突判定について話したいと思います。

JPHACKS2018

10/20、21日にJPHACKS2018という
学生向けハッカソンイベントに参加してきました。

私が参加したチームは郵便受けに不在票が投函されたとき
利用者のスマホに通知を送るという物を開発しました。

私は主にネットワーク周りの設計を担当しました。
コードはほぼ書いてないです。

またもや作り直し

前回リファクタリング終えました見たいな記事を出したんですが、
さっそくまたリファクタリングというか
設計見直しからの作り直しをしましたw

下の図のような感じでクラスを構成しています。
イメージとしてはUnityのようなコンポーネント指向で
機能の付け外しが容易にできるような設計を目指しています。

こういう形にしようとした理由は
①私がUnityでのゲーム開発に慣れておりその書き方になるべく近づけたかった
②今後どういう変更を加えるか未知数なため変更しやすくしたかった
 (勉強用で色々試そうと思っているため)
という理由です。

※全部実装できていないので今のコードとは多少ズレがあります
f:id:hakase0274:20181024214812p:plain

衝突判定

さてここからが本題の衝突判定です。
まずはコードです。

//float型2つを持つ構造体
Point2D* points[] = 
{
        //上下左右の頂点 otherSquareColliderは判定する別のコライダー
	otherSquareCollider->LeftTop(),
	otherSquareCollider->RightTop(),
	otherSquareCollider->LeftBottom(),
	otherSquareCollider->RightBottom()
};
//衝突判定の結果を返すbool値
bool judgeResult = false;
//判定するコライダーの全ての頂点に対して自身の衝突範囲に入っているか確認する
//一つでも入っていたら判定を終了し結果を返す
for(auto point:points)
{
	if (mPos.x - oneSide / 2 <= point->x && point ->x <= mPos.x + oneSide / 2)
	{
		if (mPos.y - oneSide / 2 <= point->y && point->y <= mPos.y + oneSide / 2)
		{			
			judgeResult = true;
			break;
		}
	}
}

やってることは単純で
判定するコライダーの頂点が自身の4つの頂点の中に入っているか確認し
あれば衝突したと返しています。

自身の4点に関しては基準点を一つ設けてそこに一辺の長さの
半分の値を足しています。
そうすれば中央の1点を定めるだけであとの4点が求まるというわけです。
f:id:hakase0274:20181024223508p:plain

実際の動きのイメージ動画です。
ぶつかっていないときは緑
ぶつかったら赤になっています。

またぶつかった瞬間のみ白になっています。
なのでぶつかったときに
色が変になっているように見えるかもしれません。
仕様ですw
www.youtube.com

次回予告的な何か

今回で正方形のみではありますが衝突判定と処理が実装できました。
これでかんたんな2Dゲームなら作れるようになりました。
(シューティングとかなんちゃってマリオとか)
今後はそういったゲーム作りに行くか3Dをやるかちょっと迷ってます・・・

まぁ今回のことがあるのでまたなんかイベントいったり知人と話したりして
やりたいこと変わるかもなんで今はそう考えてるくらいに思ってくださいw

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