テスト駆動でゲーム開発はできるのか?

ゲームの開発にテスト駆動開発を取り入れてみる検証のブログです

レッドのテストをグリーンにする

衝突判定のテストがレッドの状態なので、実装を行ってグリーンにしていきます。

bool CollisionDetection::isCollide(CollisionArea *lhs, CollisionArea *rhs) {
	if(lhs == 0 || rhs == 0) {
		return false;
	}
	
	const float selfLeft = lhs->x;
	const float selfTop = lhs->y;
	const float selfRight = selfLeft + lhs->w;
	const float selfBottom = selfTop + lhs->h;
	const float otherLeft = rhs->x;
	const float otherTop = rhs->y;
	const float otherRight = otherLeft + rhs->w;
	const float otherBottom = otherTop + rhs->h;
	
	if(selfLeft > otherRight) {	return false;	}	// 判定対象の範囲は自分の範囲よりも左側にある
	if(selfTop > otherBottom) {	return false;	}	// 判定対象の範囲は自分の範囲よりも上側にある
	if(selfRight < otherLeft) {	return false;	}	// 判定対象の範囲は自分の範囲よりも右側にある
	if(selfBottom < otherTop) {	return false;	}	// 判定対象の範囲は自分の範囲よりも下側にある
	
	// 判定対象の範囲は自分と重なっている部分がある
	return true;
}


実装を正しく書いたつもりですが、テストのアサートに引っかかってしまいました。
よく見るとテストの数値が間違っていたので、テストコードを修正します。

TEST(Collision, isCollide) {
	CollisionArea *area1 = new CollisionArea(0.0f, 0.0f, 10.0f, 10.0f);
	CollisionArea *area2 = new CollisionArea(5.0f, 5.0f, 10.0f, 10.0f);
	CollisionArea *area3 = new CollisionArea(-15.0f, -5.0f, 10.0f, 10.0f);
	CollisionArea *area4 = new CollisionArea(-15.0f, -5.0f, 10.0f, 10.0f);
	CollisionArea *area5 = new CollisionArea(10.0f, 10.0f, 20.0f, 20.0f);
	CollisionArea *area6 = new CollisionArea(12.0f, 12.0f, 10.0f, 10.0f);

	ASSERT_TRUE(CollisionDetection::isCollide(area1, area2));	// 一部が重なっている
	ASSERT_FALSE(CollisionDetection::isCollide(area1, area3));	// 重なっていない
	ASSERT_TRUE(CollisionDetection::isCollide(area3, area4));	// 同じ位置と大きさの範囲が重なっている
	ASSERT_TRUE(CollisionDetection::isCollide(area5, area6));	// 大きな範囲の内側に小さな範囲が入っている
	ASSERT_TRUE(CollisionDetection::isCollide(area6, area5));	// 小さな範囲が大きな範囲の内側に入っている
}

これでテストが通ってグリーンの状態になりました。
Xcode上で実行するとコンソールに色が表示されないのは残念です。

実装がほぼ終わった時に気がついたのですが、このテストは delete を呼んでいないのでメモリリークを起こしてしまっています。
すぐに直してしまいたい気持ちはありますが、一度グリーンの状態になっているのでここでコミットをします。

今回のリビジョンのタグはこちらです。
blog_20140128