FlashとFlexで非常に奇妙な問題が発生しました。特定の状況下では、実行時に(ローダーを使用して)ロードされたSWFからのムービークリップは、その間に別のSWFがロードされた場合にインスタンス化できないようです。エラーを再現するプログラムの完全なコードは次のとおりです。EnsembleTofinoを介してmxmlcを使用してコンパイルされます。
package
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.system.*;
public class DynamicLoading extends Sprite
{
private var testAppDomain:ApplicationDomain;
public function DynamicLoading()
{
var request:URLRequest = new URLRequest("http://localhost/content/test.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTestLoadComplete);
loader.load(request);
}
private function onTestLoadComplete(e:Event):void
{
var loaderInfo:LoaderInfo = LoaderInfo(e.target);
testAppDomain = loaderInfo.applicationDomain;
// To get the error, uncomment these lines...
//var request:URLRequest = new URLRequest("http://localhost/content/tiny.swf");
//var loader:Loader = new Loader();
//loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onTinyLoadComplete);
//loader.load(request);
// ...and comment this one:
onTinyLoadComplete();
}
private function onTinyLoadComplete(e:Event = null):void
{
var spriteClass:Class = Class(testAppDomain.getDefinition("TopSymbol"));
var sprite:Sprite = Sprite(new spriteClass());
sprite.x = sprite.y = 200;
addChild(sprite);
}
}
}
上記のように2番目の読み込み操作がコメント化されているため、コードは機能します。ただし、2番目のロード操作がコメント化されておらず、2番目のSWFがロードされた後new spriteClass()
にonTinyLoadCompleteが実行される場合、次の例外を除いて、を含む行は失敗します。
TypeError:エラー#1034:タイプ強制に失敗しました:flash.display :: MovieClip@2dc8ba1をSubSymbolに変換できません。 flash.display :: Sprite /constructChildren()で flash.display :: Sprite()で flash.display :: MovieClip()で TopSymbol()で DynamicLoading / onTinyLoadComplete()[C:\ Users \ ... \ TestFlash \ DynamicLoading.as:38]で
test.swfとtiny.swfはFlashCS4で作成されました。test.swfには、ActionScript用にエクスポートされた2つのシンボルが含まれています。1つはTopSymbolと呼ばれ、もう1つはSubSymbolと呼ばれます。SubSymbolには単純なグラフィック(落書き)が含まれ、TopSymbolにはSubSymbolの単一のインスタンスが含まれます。tiny.swfには何も含まれていません。これは、新しい空のActionScript3プロジェクトを公開した結果です。
SubSymbolがActionScriptにエクスポートされないようにtest.swfを変更すると、エラーはなくなりますが、実際のプロジェクトでは、他のエクスポートされたスプライトクラスを子として含むスプライトクラスを動的にロードする機能が必要です。
これを引き起こしている原因、またはそれを修正する方法についてのアイデアはありますか?
編集:いくつかの人々は、tiny.swfにtest.swfまたは親(DynamicLoading.swf)のクラスと同じ名前のクラスが含まれている可能性があることを示唆しています。そうではありません。上で述べたように、新しい空のFlash CS4プロジェクトを公開するだけで、自分でtiny.swfを作成しました。swfdump -D
tiny.swfで実行した場合の完全な出力は次のとおりです。
[ヘッダー]ファイルバージョン:10 [ヘッダー]ファイルはzlib圧縮されています。比率:41% [ヘッダー]ファイルサイズ:1343 [ヘッダー]フレームレート:30.000000 [ヘッダー]フレーム数:1 【ヘッダー】ムービー幅:550.00 [ヘッダー]映画の高さ:400.00 4つのFILEATTRIBUTES as3symbolclass [04d]1284メタデータ 3セットバックグラウンドカラー(ff / ff / ff) 11シナリオ [001] 0 SHOWFRAME 1(00:00:00,000) [000] 0 END