我已經通過許多網站並沒有什麼幫助的「SWF加載問題」的帖子閱讀。也許我的環境或一些微小的東西遺漏導致LOADER.CONTENT始終爲NULL。 SWF文件位於相同的FOLDER中,該文件夾已添加到Flash首選項中的TRUSTED LOCATIONS中。要瘋SWF資產不加載
我使用mxmlc -static-link-runtime-shared-libraries
建立兩個SWF文件,一個是主要的,另一種是資產「的圖像,聲音和一些代碼」。 LOADER.PROGRESS正在被觸發:EVENT.bytesLoaded快速等於EVENT.bytesTotal「11303918」,但所有CONTENT元素都是NULL,因此不附加CLASS。我放棄了LOADER.COMPLETE,因爲它從來沒有在本地觸發,有人說這是一個FIREFOX緩存問題;因此,我只是通過PROGRESS字節觸發完成。
爲了保護無辜的人有些名稱已被更改「MAIN,零件和資產」,但沒有代碼已經在這個崗位的寫作受到侵害......呢。
10952 MAIN.swf - includes PART.as and MAIN.as
11303918 ASSETS.swf - includes ASSETS.as only
我的Flash應用程序是一個簡單的音樂混音器。 Main定義了控制板。資產提供音樂,圖像和一些可執行代碼。
所有,如果建成一個單一的SWF工作正常。我想添加預加載器,因爲手機等一些設備的加載非常緩慢,預加載器非常有趣。因此,Assets已經被放置在他們自己的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 - 深港西部通道建成的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都爲空,因此沒有掛鉤轉換爲CLASS並訪問嵌入其中的ASSETS。
問題看起來越來越像一個安全問題。我上傳了嵌入MAIN.swf的控制HTML,然後嘗試將ASSETS.swf內部加載到我的網站,並獲得與本地運行相同的結果。所有三個文件都位於同一個位置。 contentLoaderInfo.loaderURL已設置,但contentLoaderInfo.url爲NULL,並且isURLInaccessible設置爲TRUE。我如何讓這兩個SWF進行交流?所有代碼如上所示。將繼續挖掘安全路徑。 –
問題出在ASSETS.SWF構造函數中。作爲一個內置的庫,可以有參數。但是從SWC轉換爲SWF後,加載程序將調用沒有參數的初始類並運行任何系統資料,如'Security.allowDomain()'。留在編碼參數中導致構造函數彈出兩個從未被推入的參數,因此加載程序崩潰,無法完成加載。簡單地創建一個獨立的init方法允許'EVENT.COMPLETE'被觸發,並且生活很好。如果你想嘗試音樂混音器,可以在OstrichEyes.com,Chakras Composer 3上找到。 –