2016-01-07 54 views
-2

我已經通過許多網站並沒有什麼幫助的「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。

+0

問題看起來越來越像一個安全問題。我上傳了嵌入MAIN.swf的控制HTML,然後嘗試將ASSETS.swf內部加載到我的網站,並獲得與本地運行相同的結果。所有三個文件都位於同一個位置。 contentLoaderInfo.loaderURL已設置,但contentLoaderInfo.url爲NULL,並且isURLInaccessible設置爲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 { . . . 
}}} 

將寬度和高度參數分解爲單獨的初始化方法。