/* * 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); }; })();