Стандартный класс из fd от проекта as3 project with preloader прекрасно работает.
Только прогресс загрузки нужно отлавливать в классе прелоадера, а не в Main

Код AS3:
package {
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.utils.getDefinitionByName;
public class Preloader extends MovieClip {
public function Preloader() {
if (stage) {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
}
addEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
}
private function progress(e:ProgressEvent):void {
trace(e.bytesLoaded / e.bytesTotal);
}
private function checkFrame(e:Event):void {
if (currentFrame == totalFrames) {
stop();
removeEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
var mainClass:Class = getDefinitionByName("Main") as Class;
addChild(new mainClass() as DisplayObject);
}
}
}
}

Код AS3:
package {
import flash.display.Sprite;
import flash.events.Event;
[Frame(factoryClass="Preloader")]
public class Main extends Sprite {
public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// точка входа в программу тут
}
}
}