Когда вы делаете предварительный загрузчик в этом «стиле», на самом деле происходит следующее: предварительный загрузчик помещается в первый кадр приложения, а остальные - во второй. Что вам не хватает здесь, так это сообщить компилятору, что вы хотите, чтобы ваш класс Main был скомпилирован, поэтому сейчас его даже нет в swf. Вот почему getDefinition не будет работать.
Вы также не можете просто сослаться на него в предварительном загрузчике, поскольку это заставит его загружаться в первом кадре до того, как будет показан предварительный загрузчик. Итак, вам нужно немного магии аргументов.
Добавьте эту строку в опции вашего компилятора, и вы должны быть готовы:
-frame start Main
Помните, что если ваш основной класс находится в пакете, вам нужно получить полную ссылку:
-frame start com.grapefrukt.examples.Main
То же самое относится и к вызову getDefinition.
EDIT:
При просмотре моего кода, который делает это, я вижу, что я использую подход, отличный от того, что вы сделали, может быть, это работает лучше:
var mainClass:Class = getDefinitionByName("com.grapefrukt.examples.Main") as Class;
addChild(new mainClass() as DisplayObject);
ИЗМЕНИТЬ СНОВА:
Если это работает с помощью кнопки, я думаю, событие завершено слишком рано по какой-то причине Может быть так, что не все правильно инициализируется, хотя все байты загружены. Попробуйте использовать этот код для проверки завершения:
if (currentFrame == totalFrames) onLoadingCompleted()
Также было бы неплохо добавить команду stop () в метод onLoadingCompleted () просто для того, чтобы точка воспроизведения не испортила ситуацию, но на самом деле это более поздняя проблема.