2016-01-07 2 views
-2

Я читал сообщения на тему «Проблемы с загрузкой SWF» на многих сайтах, и ничего не помогает. Возможно, моя среда или какая-то крошечная вещь пропустили, и LOADER.CONTENT всегда был NULL. Файлы SWF находятся в том же FOLDER, который добавлен к TRUSTED LOCATIONS в настройках Flash.GOING MAD SWF ASSETS не загружается

Я использую mxmlc -static-link-runtime-shared-libraries для создания обоих файлов SWF, один из них является основным, а другой - это «изображения, звуки и некоторый код». LOADER.PROGRESS запускается: EVENT.bytesLoaded быстро равен EVENT.bytesTotal «11303918», но все элементы CONTENT имеют значение NULL, поэтому CLASS не прилагается. Я отказался от LOADER.COMPLETE, потому что он никогда не запускается локально, некоторые говорят, что это проблема кэширования FIREFOX; таким образом, я просто запускаю завершение через байты PROGRESS.

Чтобы защитить невинных, некоторые имена были изменены «MAIN, PART и ASSETS», но ни один код не был поврежден при написании этого сообщения ... пока.

10952 MAIN.swf - includes PART.as and MAIN.as 
11303918 ASSETS.swf - includes ASSETS.as only 

My Flash App - это простой музыкальный микшер. Главное определяет панель управления. Активы предоставляют музыку, изображения и некоторые исполняемые коды.

Все работает отлично, если построено как один SWF. Я хочу добавить предварительный загрузчик, потому что некоторые устройства, такие как сотовые телефоны, загружаются очень медленно, и предварительные загрузчики настолько интересны. Таким образом, активы были помещены в их собственный SWF для загрузки Main.

Вот важные части моего кода: Нет ошибок компилятора, поэтому предположим, что все импорт существует и определены переменные.

MAIN.as - main.swf

package { ... 
    [SWF(scaleMode="noScale", widthPercent="100%", heightPercent="100%", frameRate="20", backgroundColor="#000000")] 
public class MAIN extends Sprite { ... 
function MAIN():void { 
    if(stage) { MAINInit(null); return; } 
    addEventListener(Event.ADDED_TO_STAGE,MAINInit); 
    } 
private function MAINInit(e:Event):void { 
    if(e) { removeEventListener(Event.ADDED_TO_STAGE,MAINInit); } 
    stage.scaleMode = StageScaleMode.NO_SCALE; 
    stage.align  = StageAlign.TOP_LEFT; 
    w=stage.stageWidth; h=stage.stageHeight; 
    part=new PART(w,h,loadMSG,assetsComplete); 
    } 
private function assetsComplete():void {... 
}}} 

PART.as - SWC встроенный в main.swf

package PART { ... 
public class PART { ... 
    private static var stuffLoader:Loader=null; 
    private static var STUFFCLASS:Class=null; 
    public static var STUFF:*=null; 
public function PART(w:int,h:int,msg:TextField,cb:Function):void { ... 
    if(!stuffLoader) { 
     var stuffRequest:URLRequest=new URLRequest("ASSETS.swf"); 
     var stuffContext:LoaderContext=new LoaderContext(false,ApplicationDomain.currentDomain,null); 
     stuffContext.allowCodeImport=true; 
     stuffLoader=new Loader(); 
     stuffLoader.load(stuffRequest,stuffContext); 
     stuffLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,stuffLoading); 
     //stuffLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,stuffLoaded); 
    }} 
public static function stuffLoading(e:ProgressEvent):void { 
    welcomeBytes=e.bytesLoaded;///1024; 
    welcomeTotal=e.bytesTotal;///1024; 
    welcome(e.currentTarget); 
    } 
public static function stuffLoaded(e:Event):void { complete(e.currentTarget); } 
public static function complete(target:Object):void { ... 
    stuffLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,stuffLoading); 
    //stuffLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE,stuffLoaded); 
    var objectLoaderInfo:LoaderInfo=LoaderInfo(target); 
    var appDomain:ApplicationDomain=objectLoaderInfo.applicationDomain;  
    if(appDomain.hasDefinition("ASSETS")) { ... 
     // always false 
     } 
    else {... 
     stuffLoader.content; // always null 
     stuffLoader.contentLoaderInfo.content; // always null 
     objectLoaderInfo.content; // always null 
     } 
    STUFFCLASS=Class(stuffLoader.contentLoaderInfo.applicationDomain.getDefinition("ASSETS")); // always null 
    STUFF=new STUFFCLASS(width,height); // crash because NULL reference 
    ... 
    } 
public static function welcome(target:Object):void { 
    var pct:int=100*welcomeBytes/welcomeTotal; 
    ... 
    if(welcomeBytes==welcomeTotal) { complete(target); } 
}}} 

ASSETS.as - Assets.swf

package { ... 
public class ASSETS extends Sprite { 
    [Embed(source="../Sounds/beep001.mp3")] private static var SNDCLSbeep001:Class; 
    private static var SNDbeep001:Sound=new SNDCLSbeep001() as Sound; 
    ... 
function ASSETS(w:int,h:int):void {... 
    } 
public function background(w:int,h:int):void {... 
}}} 

В конце моей веревки. Loader.progress загружает байты, но каждый CONTENT имеет значение NULL, поэтому нет привязки для преобразования в CLASS и доступа к ASSETS, встроенного в него.

+0

Проблема все больше и больше напоминает проблему безопасности. Я загрузил управляющий HTML, в который встроен MAIN.swf, который затем пытается загрузить ASSETS.swf изнутри на мой сайт и получил те же результаты, что и локально. Все три файла находятся в одном месте. Содержимое contentLoaderInfo.loaderURL установлено, однако contentLoaderInfo.url равно NULL вместе с isURLInaccessible set TRUE. Как мне настроить эти два SWF? Весь код такой, как показано выше. Будет продолжать копаться в пути безопасности. –

+0

Проблема была в конструкторе ASSETS.SWF. Как встроенная библиотека, нормально иметь параметры. Но после преобразования из SWC в SWF загрузчик будет вызывать без параметров для запуска класса и запускать любой системный материал, например 'Security.allowDomain()'. Оставляя в закодированных параметрах, конструктор вызывал два аргумента, которые никогда не толкались, и, таким образом, загрузчик разбился и не смог выполнить загрузку. Просто создание отдельного метода init позволило запустить EVENT.COMPLETE, и жизнь была хорошей. Если вы хотите попробовать музыкальный микшер, его можно найти на сайте OstrichEyes.com, Chakras Composer 3. –

ответ

0

Проблема решена в комментариях, код изменен как указано ниже.

Package { 
public class ASSETS extends Sprite { 
    function ASSETS():void { . . . 
     } 
    public function init(w:int,h:int):void { . . . 
}}} 

Разбивка параметров ширины и высоты в отдельный метод инициализации.