protected function collision(obj1:Object, obj2:Object, isStatic:Boolean = true):Object { /* * Reverse the y coordinates, so that +y is in the up direction by subtracting from the application's height * Initialize all other variables for ease of use later on */ var x1:Number = obj1.parent.x + obj1.parent.width/2; var y1:Number = obj1.parent.y + obj1.parent.height/2; var x2:Number = obj2.parent.x + obj2.parent.width/2; var y2:Number = obj2.parent.y + obj2.parent.height/2; var v1xi:Number = obj1.velocity.x; var v1yi:Number = obj1.velocity.y; var v2xi:Number = obj2.velocity.x; var v2yi:Number = obj2.velocity.y; var m1:Number = obj1.parent.mass; var m2:Number = obj2.parent.mass; trace("at_1: " + x1 + "," + y1 + " (" + obj1.parent.x + "," + obj1.parent.y + ")"); trace("at_2: " + x2 + "," + y2 + " (" + obj2.parent.x + "," + obj2.parent.y + ")"); trace("v_i: " + v2xi + "," + v2yi); var dy:Number = x2-x1; var dx:Number = y2-y1; var angle:Number = Math.atan2(dy, dx); // should always be true: if(dist < b1.rad + b2.rad) cause we're in hitTest var cosa:Number = Math.cos(angle); var sina:Number = Math.sin(angle); var vx1p:Number = cosa*v1xi + sina*v1yi; var vy1p:Number = cosa*v1yi - sina*v1xi; var vx2p:Number = cosa*v2xi + sina*v2yi; var vy2p:Number = cosa*v2yi - sina*v2xi; var P:Number = vx1p*m1 + vx2p*m2; var V:Number = vx1p - vx2p; vx1p = (P-m2*V)/(m1+m2); vx2p = V+vx1p; obj2.velocity.x = cosa*vx2p - sina*vy2p; obj2.velocity.y = cosa*vy2p + sina*vx2p;