0

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

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

两个 swf 编译正常且没有错误,但红色 alpha 未打开,因此来自 m​​ain.swf 变量的“西班牙文”的值不能在 sub.swf 中被识别。有任何想法吗?

Main.swf 动作脚本:

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 动作脚本:

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;
    }
}
4

2 回答 2

1

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

一种方法相对简单:

包裹 {
   公共类 ChildClass 扩展 MovieClip {
       受保护的var _property:字符串;

       公共函数获取属性():字符串{
          返回_property;
       }
       公共函数集属性(值:字符串):无效{
          如果(值!= _property){
              _属性=值;
              //做点什么,因为现在属性已经设置好了
          }
       }
   }
}

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

// 转换为 ChildClass,这样你就会知道你有可用的属性
var childClass:ChildClass = Loader(event.currentTarget).contentLoaderInfo.content as ChildClass;

//如果变量内容为null,则swf有不同的Document Class
如果(子类){
    //现在你可以设置你的变量了,你很好
    childClass.property = 'foo';
}

像 Actionscript 中的大多数事情一样,您可以用简单的方法(如上所示)来做,也可以用正确的方法来做。正确的方法是使用 Interface。接口是类的“蓝图”。在这种情况下,需要说任何实现该接口的类总是有一个propertygetter 和一个propertysetter。你不能只使用一个变量,因为接口只允许函数。

但无论如何,使用接口的优势,尤其是在您的情况下,是您不必在与您正在加载的 swf 关联的特定类中进行编译。相反,您只需要在类的“合同”中编译,它的重量要轻得多。但是因为玩家不会施放contentLoaderInfo.contenttoISomeInterface除非它履行了那个契约,所以一旦你完成施放,你就可以自信地设置那个属性。

于 2013-02-20T04:42:41.453 回答
0

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

于 2013-02-20T04:19:11.970 回答