/*
* collision.js
*/
tm.collision = tm.collision || {};
(function() {
/**
* @class tm.collision
* 衝突判定
*/
tm.collision;
/**
* @method testCircleCircle
* 円同士の衝突判定
*/
tm.collision.testCircleCircle = function(circle0, circle1) {
var distanceSquared = tm.geom.Vector2.distanceSquared(circle0, circle1);
return distanceSquared <= Math.pow(circle0.radius + circle1.radius, 2);
};
/**
* @method testRectRect
* 矩形同士の衝突判定
*/
tm.collision.testRectRect = function(rect0, rect1) {
return (rect0.left < rect1.right) && (rect0.right > rect1.left) &&
(rect0.top < rect1.bottom) && (rect0.bottom > rect1.top);
};
tm.collision.testCircleRect = function(circle, rect) {
// まずは大きな矩形で判定(高速化)
var bigRect = tm.geom.Rect(rect.left-circle.radius, rect.top-circle.radius, rect.width+circle.radius*2, rect.height+circle.radius*2);
if (bigRect.contains(circle.x, circle.y) == false) {
return false;
}
// 2種類の矩形と衝突判定
var r = tm.geom.Rect(rect.left-circle.radius, rect.top, rect.width+circle.radius*2, rect.height);
if (r.contains(circle.x, circle.y)) {
return true;
}
r.set(rect.left, rect.top-circle.radius, rect.width, rect.height+circle.radius*2);
if (r.contains(circle.x, circle.y)) {
return true;
}
// 円と矩形の4点の判定
var c = tm.geom.Circle(circle.x, circle.y, circle.radius);
// left top
if (c.contains(rect.left, rect.top)) {
return true;
}
// right top
if (c.contains(rect.right, rect.top)) {
return true;
}
// right bottom
if (c.contains(rect.right, rect.bottom)) {
return true;
}
// left bottom
if (c.contains(rect.left, rect.bottom)) {
return true;
}
return false;
};
tm.collision.testRectCircle = function(rect, circle) {
return this.testCircleRect(circle, rect);
};
})();