GOAD MAD SWF ASSETS未加载

时间:2016-01-07 17:04:43

标签: actionscript-3 flash preloader applicationdomain

我在很多网站上阅读了关于“SWF加载问题”的帖子,没有任何帮助。也许我的环境或一些微小的东西错过了导致LOADER.CONTENT始终为NULL。 SWF文件位于同一个文件夹中,该文件夹将添加到Flash首选项中的TRUSTED LOCATIONS。

我正在使用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

我的Flash应用程序是一个简单的音乐混音器。 Main定义了控制板。资产提供音乐,图像和一些可执行代码。

如果构建为单个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。

1 个答案:

答案 0 :(得分:0)

问题在评论中解决,代码更改次要如下。

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

将宽度和高度参数分解为单独的初始化方法。