2

高さ/幅が小さく、適切に配置された(つまり、中央に配置された)サードパーティの子swfをロードするフルブラウザウィンドウAS3 Flash CS4親swfがあります。どのような読み込み手法を使用しようとしても、子 swf で配置と方向の問題が発生し、子が破損します。

ある例では、子はセカンダリ表示オブジェクト (おそらくムービークリップ) をロードしますが、それをステージにアタッチしようとします。ロード中に SecurityDomain を介してステージへのアクセスを許可すると、子 swf の 0,0 ではなく、親 swf の 0,0 に向けられます (既に適切に配置/中央揃えされています)。

別の例では、ロード中の子の配置は適切ですが、X、Y 位置のステージを参照しているように見える子内の配置は、子 SWF が中央に配置された量だけオフセットされます (つまり、子 SWF のローダーが中央に配置されている場合)。 X が 200 で、子 swf 内のオブジェクトが 100,50 であるはずですが、実際には 300,50 です)。

一般的なスレッドは、ステージへのアクセスが許可されているかどうかにかかわらず、子 swfs がローダー内の独自のプロパティではなく、親のステージまたはプレーヤーのプロパティを使用していることです。

親のものではなく、配置と向きに独自のサブ環境のみを使用するように子swfを分離するにはどうすればよいですか?

組み込みのローダーと UILoader、Greensock の SWFLoader、Flex の SWFLoader を試し、TextField のテキストを介してロードすることさえしました。

AIR の HTMLLoader は動作するように見えますが (HTMLLoader 内の SWF オブジェクトは明らかに独自のステージ オブジェクトを使用しているため)、このアプリはブラウザーで使用できます。

理想的には、まだ子供と通信できるようにしたいのですが、この時点では、子供が正常に実行されるようにすることがより重要です。

これは一般的なアプローチのように思えますが、左右のブロックの問題に遭遇すると、間違った方法でアプローチしていると思います。

私の最後の手段は、親 swf を JS フレームワークに置き換えることですが、それは絶対に不可欠な場合に限られます。

このプロセスのどの部分でも解決策を提案していただければ幸いです。

4

2 に答える 2

2

私自身の質問に答えることに対するSOの「ルール」がないことを願っています...

コメントで言及されているように、ロードされたswfがポジショニング/オリエンテーション(mouseX&mouseY)などのステージ変数にアクセスするのを制限する方法はないようです。最善の解決策は、ロードされたswfsがステージに追加できないように、ステージへのアクセスを制限することです。これは、別個のApplicationDomainを定義するLoader.load呼び出しにLoaderContextオブジェクトを含めることによって行われます。

var url:URLRequest = new URLRequest(/*...SWF URL...*/); 
var context:LoaderContext = new LoaderContext(false,new ApplicationDomain());
var ldr:Loader = new Loader();
ldr.load(url,context);

これにより、ロードされたswfに個別のルートが維持されます。

Loaderオブジェクトが親/メインswfで(0,0)から離れて配置されている場合は、ロードされたswf作成者と調整して、stage.mouseXとstage.mouseYをDisplayObject.globalToLocalでラップして不明なオフセット(ロードされたswf内から)。

var localMousePt:Point = this.globalToLocal(new Point(stage.mouseX,stage.mouseY));

ひどいですが、セキュリティの観点からは理にかなっています。Flash開発者にとって、SWFがロードされる可能性のあるコンテキストを考えず、したがって(ルートの代わりに)ステージを使用しても何も問題がないと考えるのは一般的な方法であることがわかりました。ベストプラクティスは、オブジェクトの追加と配置に常にルートを使用することです。これは、そのルートがディスプレイリストのどこに配置されるか、およびルートとステージの間に親がいくつあるかがわからないためです。

于 2012-07-21T21:58:00.680 に答える
0

これは醜いハックですが、いつでもEvent.ADDEDステージにリスナーを追加して、調整が必要な表示オブジェクトをチェックすることができます (もちろん、これは名前が付けられている場合に最適ですが、使用できる他の基準があるかもしれません) )、それらの座標を手動で変更します。

private function onAdded( ev:Event ) : void {
     if ( ev.target.name == "whatever") 
         modifyCoordinates( ev.target as DisplayObject );
}

private function modifyCoordinates( target:DisplayObject ) : void {
    // displace to match parent clip
}

//...

stage.addEventListener( Event.ADDED, onAdded );

ロードされたクリップによって生成された表示オブジェクトを区別する方法がない場合は、代わりに、自分でステージに追加するものを除外できます: アプリケーションのルート MovieClip のみがステージ上にあり、すべてが次のように追加される場合お子様でも問題ありません。

また、作成者に連絡するか、サードパーティのファイルを逆コンパイルしようとします。いずれかが機能する場合は、少なくともどのように行われるかを知ることができるため、変更を適用する場所を推測する必要はありません。または、それらを変更して再コンパイルすることもできます。

于 2012-07-15T11:03:35.423 に答える