AS3外部加载swf来控制舞台和MovieClips及其子女?

时间:2012-03-10 18:33:44

标签: actionscript-3 flash external root stage

我有2个swf文件。一个装载并装入外部装载的swf。

以下是第一个加载的swf中的代码:#1

var logo:Loader = new Loader();
logo.load(new URLRequest("images/Logo.png"));
logo.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadLogo);
function LoadLogo(e:Event):void
{
    addChild(logo);

}

/// The SWF I AM LOADING 

var Beau:Loader = new Loader();
Beau.load(new URLRequest("Beau.swf"));
Beau.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadBeau);

function LoadBeau(e:Event)
{
    addChild(Beau);

}

现在这里是加载BEAU SWF的代码:#2

import flash.display.MovieClip;


bird.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler);

function fl_MouseClickHandler(event:MouseEvent):void
{
   ////   I WANT TO BE ABLE TO ADD CODE TO CONTROL MOVIECLIPS 
   ////   AND CHILDREN form this externally loaded swf. How do
   ////   I do that? Below code does not work.

var logo:MovieClip;
var ControlLogo:MovieClip = MovieClip(logo.content);
    ControlLogo.alpha = .3;

}


修改

好的,你的代码和教程都很棒。当我从外部URL加载剪辑时,我现在遇到了主要的SANDBOX问题。我也使用FLASH CS5.5编写ANDROID代码。它不允许我使用Security.allowDomain(“*”);

BOTTOME LINE是新装载的SWF无法访问没有允许的父母,但我不知道如何使用AIR / ANDROID PLAYER给予他的许可....

1 个答案:

答案 0 :(得分:1)

使用属性parent

parent给出了装载程序

parent.parent给出了swf#1

所以你可以写下面给出的功能

function fl_MouseClickHandler(event:MouseEvent):void
{

    var swf1:Object = parent.parent;

    var logo:Loader = swf1.logo;
    var ControlLogo:Bitmap = Bitmap(logo.content); // because logo loads an image
    ControlLogo.alpha = .3;


}

确保logo不是本地变量,而是swf#1中的全局和公共

public var logo:Loader = new Loader();

编辑:

logo:Loader被添加到SWF#1。加载图像,因此内容是Bitmap。

beau:Loader被添加到舞台上。加载swf(SWF#2),因此内容为MovieClip。

所以现在

root是SWF#1

beau的父级是SWF#1

#F> SWF#2的父级为beaubeau的父级为SWF#1

因此,对于SWF#2,SWF#1是父母的父母,所以parent.parent

如果您不创建公共变量,可以使用属性name来管理它。

var logo:Loader = new Loader();
logo.name = "logo";
...
...

var beau:Loader = new Loader();
beau.name = "beau";
...
...

然后在swf#2的任何地方

var swf1:Object = parent.parent;

var logo:Loader = Loader(swf1.getChildByName("logo"));
....
....

为了访问内容,建议使用类型转换,如我所示

var ControlLogo:Bitmap = Bitmap(logo.content); // because logo loads an image

以便您可以检查如下所示并避免运行时错误

var ControlLogo:Bitmap = Bitmap(logo.content); 
if(ControlLogo){

}

如果您想要这样的内容而不管内容如下所示

var ControlLogo:Object = logo.content; 
if(ControlLogo && ControlLogo.hasOwnProperty("alpha")){
   ControlLogo.alpha = 0.4;
}