2

これは、1 年前に AS3 を始めて以来、私を悩ませてきたものです。

例。ムービー クリップを拡張するクラスを作成し、それLoaderBarlBar

画像をロードする関数を呼び出すときに、ローダーをステージに追加します..

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;



}

lBar基本的に、loadBar ムービー クリップの幅がパーセント *100 であることを伝えたいだけです。(クリップが読み込まれると、ローダー バーの幅は 100 ピクセルになります)。

私の問題はこれです。関数内のステージに loadBar を追加すると、関数外でグローバル変数を作成するハックを行わないと、別の関数内でそれを参照できません...

var loadBarClip:MovieClip;

loadBarおよびロード関数内で、をloadBarclipそのままに割り当てます

loadBarClip = loadBar.

これは冗長な気がします。とにかくloadBar、参照変数を作成せずに my にアクセスする方法を知っている人はいますか?

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 に答える