多くのサイトで「SWF 読み込みの問題」に関する投稿を読みましたが、何も役に立ちません。たぶん、私の環境またはいくつかの小さなことが失敗して、LOADER.CONTENT が常に NULL になる可能性があります。SWF ファイルは、Flash 環境設定の TRUSTED LOCATIONS に追加された同じフォルダーにあります。
私はmxmlc -static-link-runtime-shared-libraries
両方の SWF ファイルを作成するために使用しています。1 つはメインで、もう 1 つはアセット「画像、サウンド、および一部のコード」です。LOADER.PROGRESS がトリガーされています: EVENT.bytesLoaded はすぐに EVENT.bytesTotal "11303918" に等しくなりますが、すべての CONTENT 要素が NULL であるため、アタッチするクラスがありません。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 はシンプルな音楽ミキサーです。Main は制御ボードを定義します。アセットは、音楽、画像、およびいくつかの実行可能コードを提供します。
単一の SWF として構築されている場合、すべて正常に動作します。携帯電話などの一部のデバイスでは読み込みが非常に遅く、プリローダーは非常に面白いため、プリローダーを追加したいと考えています。したがって、アセットは独自の SWF に配置され、メインによってロードされます。
私のコードの重要な部分は次のとおりです。コンパイラ エラーがないため、すべてのインポートが存在し、変数が定義されていると仮定します。
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 に組み込まれた SWC
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 にアクセスするためのフックはありません。