ну наверное проверять с помощью
isNaN() в "интимных" местах.
Откуда они вообще берутся? Вот возьмем скажем:

Код AS3:
var d:Float = Math.sqrt(dx * dx + dy * dy);
// Unit vector in the direction of the collision
var aX:Float = dx / d;
var aY:Float = dy / d;
// Projection of the velocities in these axes
var vA1:Float = (vX1 * aX + vY1 * aY); var vB1:Float = ( -vX1 * aY + vY1 * aX);
var vA2:Float = (vX2 * aX + vY2 * aY); var vB2:Float = ( -vX2 * aY + vY2 * aX);
Если d окажется ноликом, то NaN'ом станет:
aX и aY - деление на ноль
vA1, vA2, vB1, vB2 - потому что используют aX или aY, т.е NaN. А при операциях с NaN'ом получается в итоге NaN.
И в коде у вас много лишних объявлений локальных переменных. и еще попадаются переобъявления одних и тех же.