Actionscript 3将变量从父级传递给子级

时间:2013-02-20 01:13:55

标签: actionscript-3 variables parent-child parent

我仍然遇到问题所以我做了一个非常基本的main.swf来加载sub.swf。

Sub.swf有2个矩形的动画片段(红色和蓝色),它们的alpha = 0。

两个swfs编译都很好,没有错误,但红色alpha没有打开,所以main.swf变量中的“spanish”值不能在sub.swf中被识别。有什么想法吗?

Main.swf actionscript:

import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;

var child_loader:Loader = new Loader();

var req:URLRequest = new URLRequest("sub.swf");

child_loader.load(req);

child_loader.contentLoaderInfo.addEventListener(Ev ent.COMPLETE, done);

function done(e:Event):void{
    addChild(child_loader);
    MovieClip(child_loader.content).language = "spanish";
}

sub.swf actionscript:

import flash.display.Loader;
import flash.display.MovieClip;
import flash.events.Event;

function callFunction(_txt:String):void{
    var sublanguage = (MovieClip(parent.parent).language)

    if (sublanguage == "spanish"){
    red.alpha = 1;
    }else if (sublanguage == "english"){
        blue.alpha = 1;
    }
}

2 个答案:

答案 0 :(得分:1)

问题是AS3在AS2方式上不是动态的,因此子文档需要具有父知道的属性或方法。

这样做的一种方法相对简单:

package {
   public class ChildClass extends MovieClip {
       protected var _property:String;

       public function get property():String {
          return _property;
       }
       public function set property(value:String):void {
          if (value != _property) {
              _property = value;
              //do something, because now the property has been set
          }
       }
   }
}

您只需将它作为文档类应用于您正在加载的swf,然后在您的onLoaded函数中,您将执行以下操作:

//cast to ChildClass, so you will know you have the property available
var childClass:ChildClass = Loader(event.currentTarget).contentLoaderInfo.content as ChildClass;

//if the variable content is null, the swf had a different Document Class
if (childClass) {
    //now you can set your variable, you're good
    childClass.property = 'foo';
}

与Actionscript中的大多数内容一样,您可以通过简单的方式(如上所示)执行此操作,也可以以正确的方式执行此操作。正确的方法是use an Interface。接口是什么是类的“蓝图”。在这种情况下,需要说实现该接口的任何类总是具有property getter和property setter。您不能只使用变量,因为接口只允许函数。

但无论如何,使用Interface的优势,特别是在您的情况下,您将不必编译与您正在加载的swf相关联的特定类。相反,你只需要在Class的“契约”中编译,这个权重要轻得多。但是因为玩家不会将contentLoaderInfo.content投射到ISomeInterface,除非履行该合同,否则一旦完成投射,您就可以放心地设置该属性。

答案 1 :(得分:0)

您应该可以在您的子电影中设置一个可以从您的父电影中调用的功能。你可以传递任何你想要的东西作为参数。