Проблема в следующих строчках

Код AS3:
var a:Number = getTimer();
if (balls.length < 20 && (getTimer()-a)>=3000)
и

Код AS3:
ball = new Ball();
ball.move();
у вас каждый раз при вызове функции переменной а присваивается значение прошедшего с момента запуска времени, поэтому, скорее всего, шарики не будут добавляться вообще, это раз
во-вторых, переменная

Код AS3:
ball:Ball;
у вас на всю программу одна и даже если каким-то образом срабатывает условие

Код AS3:
if (balls.length < 20 && (getTimer()-a)>=3000)
{
новый добавленный шарик перезаписывает старый.
я бы посоветовал вместо getTimer использовать TimerEvent, который бы срабатывал каждые 3000 мс

Код AS3:
gameTimer = new Timer(3000);
gameTimer.addEventListener(TimerEvent.TIMER, onTimerListener);
gameTimer.start();
и в теле функции обработчика создавать новый шарик и вталкивать его в массив с вашими шариками
при этом, функцию

Код AS3:
ball.move();
перетащить в класс с шариком под свой обработчик события EnterFrame.
То есть у каждого шарика свой обработчик EnterFrame
Если делать без переделки функции move, то придется в вашей

Код AS3:
private function onLoop(evt:Event):void
в цикле перебирать все шарики массива balls и вручную вызывать у каждого функцию move