レッドのテストをグリーンにする
衝突判定のテストがレッドの状態なので、実装を行ってグリーンにしていきます。
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