GOING MAD SWF 资产未加载
GOING MAD SWF ASSETS not loading
我已经通读了许多网站 "SWF loading issues" 上的 post 文章,但没有任何帮助。也许我的环境或一些小东西遗漏导致 LOADER.CONTENT 始终为 NULL。 SWF 文件位于同一文件夹中,该文件夹已添加到 Flash 首选项中的受信任位置。
我正在使用 mxmlc -static-link-runtime-shared-libraries
构建两个 SWF 文件,一个是主要的,另一个是资产 "images, sounds, and some code"。 LOADER.PROGRESS 被触发:EVENT.bytesLoaded 很快等于 EVENT.bytesTotal“11303918”,但所有 CONTENT 元素都是 NULL,因此没有 CLASS 可以附加。我已经放弃LOADER.COMPLETE,因为它从不在本地触发,有人说这是FIREFOX缓存问题;因此,我只是通过 PROGRESS 字节触发完成。
为了保护无辜者,已经更改了一些名称 "MAIN, PART, and ASSETS",但是在编写此 post 的过程中没有任何代码受到损害...但是。
10952 MAIN.swf - includes PART.as and MAIN.as
11303918 ASSETS.swf - includes ASSETS.as only
My Flash App 是一个简单的音乐混音器。 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 -- 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 加载字节,但每个内容都是空的,因此没有钩子可以转换为 CLASS 并访问其中嵌入的资产。
问题已在评论中解决,代码更改如下。
Package {
public class ASSETS extends Sprite {
function ASSETS():void { . . .
}
public function init(w:int,h:int):void { . . .
}}}
将宽度和高度参数分解为单独的初始化方法。
我已经通读了许多网站 "SWF loading issues" 上的 post 文章,但没有任何帮助。也许我的环境或一些小东西遗漏导致 LOADER.CONTENT 始终为 NULL。 SWF 文件位于同一文件夹中,该文件夹已添加到 Flash 首选项中的受信任位置。
我正在使用 mxmlc -static-link-runtime-shared-libraries
构建两个 SWF 文件,一个是主要的,另一个是资产 "images, sounds, and some code"。 LOADER.PROGRESS 被触发:EVENT.bytesLoaded 很快等于 EVENT.bytesTotal“11303918”,但所有 CONTENT 元素都是 NULL,因此没有 CLASS 可以附加。我已经放弃LOADER.COMPLETE,因为它从不在本地触发,有人说这是FIREFOX缓存问题;因此,我只是通过 PROGRESS 字节触发完成。
为了保护无辜者,已经更改了一些名称 "MAIN, PART, and ASSETS",但是在编写此 post 的过程中没有任何代码受到损害...但是。
10952 MAIN.swf - includes PART.as and MAIN.as
11303918 ASSETS.swf - includes ASSETS.as only
My Flash App 是一个简单的音乐混音器。 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 -- 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 加载字节,但每个内容都是空的,因此没有钩子可以转换为 CLASS 并访问其中嵌入的资产。
问题已在评论中解决,代码更改如下。
Package {
public class ASSETS extends Sprite {
function ASSETS():void { . . .
}
public function init(w:int,h:int):void { . . .
}}}
将宽度和高度参数分解为单独的初始化方法。