【问题标题】:AS3 externally loaded swf to control stage and MovieClips and their children?AS3外部加载swf来控制stage和MovieClips及其子?
【发布时间】:2012-03-10 18:33:44
【问题描述】:

我有 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("*");

底线是新加载的 SWF 在没有权限的情况下无法访问父级,但我不知道如何授予它权限....使用 AIR/ANDROID 播放器。

【问题讨论】:

  • 你想在fl_MouseClickHandler()里面做什么? logo 来自哪里? fl_MouseClickHandler() 是否被调用(尝试 trace())。
  • 您在两个 SWF 中都使用了 allowDomain 吗?如果有帮助,推荐阅读:adobe.com/devnet/articles/crossdomain_policy_file_spec.html
  • 我两种方式都试过了。它不起作用。在 Android 上通过 AIR 加载时,它不允许 allowDomain。不知道如何解决这个问题。我可能需要开始第二个帖子并更具体。

标签: actionscript-3 flash external root stage


【解决方案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。加载图片,所以内容是位图。

beau:Loader 被添加到舞台。加载 swf (SWF#2),所以内容是 MovieClip。

现在

root 是 SWF#1

beau 的父级是 SWF#1

SWF#2 的父级是 beaubeau 的父级是 SWF#1

所以对于 SWF#2,SWF#1 是 parent 的 parent,所以 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;
}

【讨论】:

  • 太棒了!有效。我非常感谢像你这样慷慨的人在这里。如果你有时间,你能解释一下“parent.parent”是做什么的吗?与 var Bitmap 相同。因为如果我想加载外部 SWF 那么我会使用“MovieClip”。如果我这样做并且想要控制动态添加在该电影中的孩子或在 swf 中硬编码......那么我会使用代码吗?但这不是必需的,但我很想知道,因为我正朝着那个方向前进。再次非常感谢!
  • 我也无法将其设为 PUBLIC VAR,因为我没有使用课程。我还不知道如何有效地使用它们。还是从 AS2 过来的。
  • 谢谢...我已经解释过了。 :)
猜你喜欢
  • 2012-03-31
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多