2

我有一个完整的浏览器窗口 AS3 Flash CS4 父 swf,它加载第三方子 swf,高度/宽度更小并且定位适当(即居中)。无论我尝试使用哪种加载技术,我都会在子 swf 中遇到位置和方向问题,这会破坏子级。

在一个示例情况下,孩子将加载辅助显示对象(可能是影片剪辑),但尝试将其附加到舞台上。如果我允许它在加载过程中通过 SecurityDomain 访问舞台,它会将其定向到父 swf 的 0,0 而不是子 swf 的 0,0(已经适当地定位/居中)。

在另一种情况下,加载过程中的子定位是合适的,但放置在子内部似乎参考舞台的 X、Y 位置会被子 swf 居中的量所抵消(即,如果子 swf 的加载器居中这样它的 X 是 200,而子 swf 内的一个对象应该是 100,50,它实际上是 300,50)。

常见的线程似乎是子 swfs,无论是否允许访问舞台,都使用父级的舞台或播放器属性,而不是加载器中它们自己的属性。

如何隔离子 swf,使其仅使用自己的子环境进行定位和定向,而不使用父环境?

我尝试过内置的 Loader 和 UILoader、Greensock 的 SWFLoader、Flex 的 SWFLoader,甚至通过 TextField 中的文本加载它。

似乎 AIR 的 HTMLLoader 可以工作(因为 HTMLLoader 中的 SWF 对象显然使用它们自己的舞台对象),但是这个应用程序已经在浏览器中可用。

理想情况下,我仍然希望能够与孩子交流,但此时确保孩子成功运行更为重要。

这似乎是一种常见的方法,但遇到左右阻塞问题让我觉得我以错误的方式处理这个问题。

我最后的手段是用 JS 框架替换父 swf,但前提是绝对必要。

在此过程的任何部分提出解决方案的建议将不胜感激。

4

2 回答 2

2

希望没有一个“规则”反对回答我自己的问题......

正如评论中提到的 weltraumpirat,似乎没有办法限制加载的 swf 访问阶段变量,例如定位/方向(mouseX 和 mouseY)。最好的解决方案是限制对舞台的访问,以便加载的 swfs 无法添加到它。这是通过在 Loader.load 调用中包含一个 LoaderContext 对象来完成的,该调用定义了一个单独的 ApplicationDomain。

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 作者协调以使用 DisplayObject.globalToLocal 包装 stage.mouseX 和 stage.mouseY 以反映未知偏移量(从加载的 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 回答