package { import flash.display.Sprite; import flash.display.DisplayObject; public class Collider { public static var lastCollision:Object; private static var pointsprite:Sprite; private static var dx:Number; private static var dy:Number; private static var csquared:Number; private static var c:Number; private static var dist:Number; private static var r1:Number; private static var r2:Number; private static var tr:Number; private static var a:Number; private static const toDegrees:Number = 180/Math.PI; private static const toRadians:Number = Math.PI/180; public function Collider() { // constructor code } public static function checkPointCollision( px:Number, py:Number, o1:DisplayObject, customRadius:Number = 0 ):Object { if( !pointsprite ) { pointsprite = new Sprite(); pointsprite.graphics.beginFill( 0, 0 ); pointsprite.graphics.drawCircle( 0, 0, 1 ); pointsprite.graphics.endFill(); } pointsprite.x = px; pointsprite.y = py; return Collider.checkCollision( pointsprite, o1, 0, customRadius ); } public static function checkCollision( o1:DisplayObject, o2:DisplayObject, customRadius1:Number = 0, customRadius2:Number = 0 ):Object { dx = o1.x - o2.x; dy = o1.y - o2.y; csquared = dx*dx+dy*dy; c = Math.sqrt(csquared); dist = c < 0 ? c * -1 : c; r1 = customRadius1 !=0 ? customRadius1 : o1.width >> 1; r2 = customRadius2 !=0 ? customRadius2 : o2.width >> 1; tr = r1+r2; if (dist < tr ) { if(!lastCollision) { lastCollision = {}; } lastCollision.angle = flashToRealDegrees( Math.atan2(dy, dx) * toDegrees ); //have to convert flash angle (-180 to 180) to real angle (0 to 360) lastCollision.radians = lastCollision.angle * toRadians; //now I can get a REAL radian! lastCollision.oppositeAngle = lastCollision.angle+180; //opposite angle - in case you want to make the collidee (o2) go in the opposite direction lastCollision.oppositeRadians = lastCollision.oppositeAngle * toRadians; //cool math to calculate the intersecting x and y... is this useful? maybe. a = ( ( r1 * r1) - ( r2 * r2) + csquared ) / ( dist << 1 ); lastCollision.x = o1.x + a * ( o2.x - o1.x ) / dist; lastCollision.y = o1.y + a * ( o2.y - o1.y ) / dist; return lastCollision; } lastCollision = undefined; return undefined; } public static function isColliding( o1:DisplayObject, o2:DisplayObject, customRadius1:Number = 0, customRadius2:Number = 0 ):Boolean { dx = o1.x - o2.x; dy = o1.y - o2.y; csquared = dx*dx+dy*dy; c = Math.sqrt(csquared); dist = c < 0 ? c * -1 : c; r1 = customRadius1 !=0 ? customRadius1 : o1.width >> 1; r2 = customRadius2 !=0 ? customRadius2 : o2.width >> 1; tr = r1+r2; if (dist < tr ) { return true } return false; } public static function isPointColliding( px:Number, py:Number, o1:DisplayObject, customRadius:Number = 0 ):Boolean { if( !pointsprite ) { pointsprite = new Sprite(); pointsprite.graphics.beginFill( 0, 0 ); pointsprite.graphics.drawCircle( 0, 0, 1 ); pointsprite.graphics.endFill(); } pointsprite.x = px; pointsprite.y = py; return Collider.isColliding( pointsprite, o1, 0, customRadius ); } private static function flashToRealDegrees( flashDegrees:Number ):Number { var realDegrees:Number = flashDegrees; while ( realDegrees >= 360 ) { realDegrees -= 360; } while ( realDegrees < 0 ) { realDegrees += 360; } return realDegrees; } } }