Hi I'm currently messing about with Ball vs Ball Collision and came across a nasty bug in my demo. Use the arrow keys to move the red ball if you hold the left key down you can recreate the bug the balls will penetrate each other. Why does this happen and how can I prevent in.

Collision Code:
Actionscript Code:
if ((Math.sqrt((((ballA.xPos - ballB.xPos)*(ballA.xPos - ballB.xPos))+((ballA.yPos - ballB.yPos)*(ballA.yPos - ballB.yPos))))-((ballA.Mass/2)+(ballB.Mass/2)))<=0) {                           
    var dx = ballA.xPos - ballB.xPos;
    var dy = ballA.yPos - ballB.yPos;
    var collisionision_angle = Math.atan2(dy,dx);
    var magnitude_1 = Math.sqrt(ballA.xVel * ballA.xVel + ballA.yVel * ballA.yVel);
    var magnitude_2 = Math.sqrt(ballB.xVel * ballB.xVel + ballB.yVel * ballB.yVel);
    var direction_1 = Math.atan2(ballA.yVel,ballA.xVel);
    var direction_2 = Math.atan2(ballB.yVel,ballB.xVel);
    var new_xspeed_1 = magnitude_1 * Math.cos(direction_1 - collisionision_angle);
    var new_yspeed_1 = magnitude_1 * Math.sin(direction_1 - collisionision_angle);
    var new_xspeed_2 = magnitude_2 * Math.cos(direction_2 - collisionision_angle);
    var new_yspeed_2 = magnitude_2 * Math.sin(direction_2 - collisionision_angle);
    var final_xspeed_1 = ((ballA.Mass-ballB.Mass)*new_xspeed_1+(ballB.Mass+ballB.Mass)*new_xspeed_2)/(ballA.Mass+ballB.Mass);
    var final_xspeed_2 = ((ballA.Mass+ballA.Mass)*new_xspeed_1+(ballB.Mass-ballA.Mass)*new_xspeed_2)/(ballA.Mass+ballB.Mass);
    var final_yspeed_1 = new_yspeed_1;
    var final_yspeed_2 = new_yspeed_2;
    ballA.xVel = Math.cos(collisionision_angle) * final_xspeed_1 + Math.cos(collisionision_angle + Math.PI / 2) * final_yspeed_1;
    ballA.yVel = Math.sin(collisionision_angle) * final_xspeed_1 + Math.sin(collisionision_angle + Math.PI / 2) * final_yspeed_1;
    ballB.xVel = Math.cos(collisionision_angle) * final_xspeed_2 + Math.cos(collisionision_angle + Math.PI / 2) * final_yspeed_2;
    ballB.yVel = Math.sin(collisionision_angle) * final_xspeed_2 + Math.sin(collisionision_angle + Math.PI / 2) * final_yspeed_2;
}

Thanks in advance.