Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 将加载的主权财富基金与使用父主权财富基金隔离_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 将加载的主权财富基金与使用父主权财富基金隔离

Actionscript 3 将加载的主权财富基金与使用父主权财富基金隔离,actionscript-3,flash,Actionscript 3,Flash,我有一个完整的浏览器窗口,即3 Flash CS4父swf,该窗口加载第三方子swf,高度/宽度较小,位置适当(即居中)。无论我尝试使用什么加载技术,我都会在孩子swf中遇到位置和方向问题,这会破坏孩子 在一个示例中,子对象将加载一个辅助显示对象(可能是一个movieclip),但会尝试将其附加到stage。如果我允许它在加载期间通过SecurityDomain访问stage,它会将其定向到父swf的0,0处,而不是子swf的0,0处(子swf已正确定位/居中) 在另一种情况下,加载期间的子级定

我有一个完整的浏览器窗口,即3 Flash CS4父swf,该窗口加载第三方子swf,高度/宽度较小,位置适当(即居中)。无论我尝试使用什么加载技术,我都会在孩子swf中遇到位置和方向问题,这会破坏孩子

在一个示例中,子对象将加载一个辅助显示对象(可能是一个movieclip),但会尝试将其附加到stage。如果我允许它在加载期间通过SecurityDomain访问stage,它会将其定向到父swf的0,0处,而不是子swf的0,0处(子swf已正确定位/居中)

在另一种情况下,加载期间的子级定位是合适的,但子级内部的位置(似乎参考了舞台的X、Y位置)会被子级swf的居中量偏移(即,如果子swf的加载程序居中,使其X为200,并且子swf内的对象应为100,50,则实际上为300,50)

常见的情况似乎是,无论是否允许子SWF访问stage,它们都使用父级的stage或player属性,而不是加载程序中它们自己的属性

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

我试过内置的加载器和UILoader,Greensock的SWFLoader,Flex的SWFLoader,甚至通过文本字段中的文本加载它

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

理想情况下,我仍然希望能够与孩子沟通,但在这一点上,确保孩子成功运行更为重要

这似乎是一种常见的方法,但遇到左右阻碍问题时,让我觉得我的方法是错误的

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


在此过程中的任何部分都可以提供解决方案的建议。

这是一个难看的黑客行为,但您始终可以为
事件添加一个侦听器。如果将
添加到舞台,请检查需要调整的显示对象(当然,如果命名了这些对象,效果最好,但您可能可以使用其他标准),然后手动更改它们的坐标

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在舞台上,然后所有内容都作为子对象添加到舞台上,那么这应该不会有任何问题

我也会尝试联系作者,或者反编译第三方文件-如果其中任何一个可行,你至少可以了解事情是如何完成的,这样你就不必猜测在哪里应用你的更改。或者你甚至可以修改和重新编译它们。

希望没有一个“规则”不允许回答我自己的问题

正如weltraumpirat在评论中提到的,似乎没有办法限制加载的swf访问阶段变量,如定位/方向(mouseX和mouseY)。最好的解决方案是限制对阶段的访问,以便加载的SWF无法添加到该阶段。这是通过在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中保持一个单独的根

var localMousePt:Point = this.globalToLocal(new Point(stage.mouseX,stage.mouseY));
如果加载程序对象已远离父/主swf中的(0,0),则可能需要与加载的swf作者协调,将stage.mouseX和stage.mouseY与DisplayObject.globalToLocal包装在一起,以反映未知偏移量(从加载的swf内)


这很糟糕,但从安全角度来看是有意义的。我发现,对于Flash开发人员来说,通常不考虑他们的SWF可能加载的上下文,因此认为使用stage(而不是root)没有错。最佳做法应该是始终使用根添加和定位对象,因为您永远不知道该根可能会被放置在显示列表中的什么位置,以及在显示列表和舞台之间可能有多少父级。

这是我关于SE的第一个问题,所以请原谅没有遵循SE协议的情况。您尝试过lockroot吗?@the_asMan,lockroot在AS3中不可用。但是谢谢你的想法。是的,我的错。你需要重新开发儿童swf不是目标阶段。任何时候你的目标阶段都会失去移植swf的能力,或者当你发现过多的swf或作用域将弹出时。我会在子swf中添加一个容器,为你保存所有内容。如果你需要子swf访问父swf中的某些内容或加载swf,那么你只需回溯即可使用parent.parent方法。还可以查看root。看起来像“root”在加载的swf中,将引用该swf的根。这是我在等待新建议时找到的确切位置。我能够将添加到舞台上的对象移动到孩子的孤立根,但难度很大,因为第三方swf处理这些对象的方式似乎比简单地添加到顶部更复杂在这一点上,我唯一的办法是逐个处理单个swf,希望找到加快兼容性开发的通用方法。我仍然希望有一种方法可以将加载的swf阶段与父级完全隔离。@kfblake我不会浪费更多的时间等待它-只有一个
stage
。你所能做的就是联系作者,让他们将所有
stage
子项移动到
root
(最多三到四个搜索和替换任务),这样你就不会有任何问题了。weltraumpirat,