2

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

例子。我创建了一个扩展电影剪辑的类并将其命名为“ LoaderBar”,它只是一些显示“正在加载”的文本,在它下面是另一个电影剪辑,它是一个普通的矩形,我称之为“ lBar

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

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;



}

本质上,我只想告诉lBarloadBar 影片剪辑中的百分比 *100 的宽度。(这样当加载剪辑时,加载器栏的宽度为 100 像素)。

我的问题是这个。当我将 loadBar 添加到函数内部的阶段时,我无法在另一个函数内部引用它,而无需在函数外部创建一个全局变量,例如...

var loadBarClip:MovieClip;

并在加载函数内部分配loadBarloadBarclip

loadBarClip = loadBar.

我觉得这是多余的。有谁知道在loadBar不创建引用变量的情况下访问我的?

4

3 回答 3

2

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

如果您希望将 loadBar 变量保持在本地,那么您总是可以这样做:

在 imageLoader 函数中:

var loadBar:Loader Bar = new LoaderBar();    
loadBar.name = "loadBar";  
addChild(loadBar);

在 progressHandler 函数中:

getChildByName("loadBar");
于 2009-10-04T02:06:33.170 回答
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;
}

作为脚注,当您扩展影片剪辑时,添加一个设置 lBar.width 的方法。就像是:

loadbar.setLBarWidth = function (w:number) {
  this.lBar.width = w;
}
于 2009-10-04T02:26:06.343 回答
1

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

于 2009-10-04T02:08:11.623 回答