如何在AS3中引用动态实例化对象? (在舞台上添加了一个Moviclip)

时间:2009-10-04 01:35:02

标签: actionscript-3 dynamic object reference instantiation

自从我一年前参加AS3以来,这一直困扰着我。

实施例。我创建了一个扩展Movie Clip的类,并将其命名为“LoaderBar”,它只是一些文字说“正在加载”,而在它下面是另一个我称之为“lBar的纯矩形的影片剪辑” “

当我调用一个函数来加载我的图像时,我将Loader添加到舞台上......

function imageLoader(URL:String):void

{

     var loader:Loader = new Loader(new URLRequest(URL));
     loader.contentLoaderInfo.addEventListner(ProgressEvent.PROGRESS, progressHandler);

      var loadBar:Loader Bar = new LoaderBar();
      addChild(loadBar);
}


function progressHandler(e:Event):void

{

    var pcent:Number = e.getBytesLoaded / e.getBytesTotal;
    // HERE IS WHERE I'D LIKE TO MAKE DIRECT REFERENCE TO MY LOADBAR;
   loadBar.lBar.width = pcent*100;



}

基本上我只是想告诉loadBar Movie Clip中的lBar是百分比* 100的宽度。 (这样当加载剪辑时,加载条的宽度为100像素)。

我的问题是这个。当我将loadBar添加到一个函数的stage中时,我不能在另一个函数内部引用它而不做一些hack在我的函数之外创建一个全局变量...

var loadBarClip:MovieClip;

并在加载函数内部将loadBar分配给loadBarclip本身

loadBarClip = loadBar.

我觉得这是多余的。有没有人知道在没有制作参考变量的情况下访问我的loadBar

3 个答案:

答案 0 :(得分:2)

我没有看到在imageLoader函数之外声明变量的主要问题。如果你是在一个类而不是时间轴中写这个,那么它只是一个类成员变量,并没有任何问题。它们存在就是出于这个原因。

如果你的死机想要将loadBar变量保持在本地,那么你总是可以这样做:

在imageLoader函数中:

var loadBar:Loader Bar = new LoaderBar();    
loadBar.name = "loadBar";  
addChild(loadBar);
在progressHandler函数中:

getChildByName("loadBar");

答案 1 :(得分:2)

如果只是为了那个处理程序,你可以使处理程序匿名并保持在当前作用域内。

var loadBar = new LoaderBar();
var loader:Loader = new Loader(new URLRequest(URL));
loader.contentLoaderInfo.addEventListner(
    ProgressEvent.PROGRESS, function (e:Event):void {
      var pcent:Number = e.getBytesLoaded / e.getBytesTotal;
      loadBar.lBar.width = pcent*100; //Here you are making a direct reference.
    }
);

如果你真的想要封装你的范围你可以使用闭包:

returnFromEncapulatingClosure = function(){
    var loadBar = new LoaderBar();
    var loader:Loader = new Loader(new URLRequest(URL));
    return {
        loadBar: loadBar,
        loader: loader
    };
}();

这允许你将一些引用捆绑在一起,这样它们就不会破坏代码的其他部分,你可以用它来引用它:

returnFromEncapulatingClosure.loader.contentLoaderInfo.addEventListner(ProgressEvent.PROGRESS, progressHandler);
function progressHandler(e:Event):void {
  var pcent:Number = e.getBytesLoaded / e.getBytesTotal;
 returnFromEncapulatingClosure.loadBar.lBar.width = pcent*100;
}

作为脚注,当您扩展Movie Clip时,添加一个设置lBar.width的方法。类似的东西:

loadbar.setLBarWidth = function (w:number) {
  this.lBar.width = w;
}

答案 2 :(得分:1)

由于lBar(或loadBar)是您需要在类级别管理的元素,因此您应该确实将其作为类成员。它没有任何问题;)