Как ссылаться на динамически созданный объект в AS3? (Добавлен видеоролик на сцену) - PullRequest
2 голосов
/ 04 октября 2009

Это то, что меня беспокоит с тех пор, как я начал работать с AS3 год назад.

Пример. Я делаю класс, который расширяет мувиклип и называю его «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;



}

По сути, я просто хочу указать lBar в муви клипе loadBar как ширину процента * 100. (чтобы при загрузке клипа ширина полосы загрузки составляла 100 пикселей).

Моя проблема в этом. Когда я добавляю loadBar на сцену внутри функции, я не могу ссылаться на нее внутри другой функции, не взломав глобальную переменную вне моей функции, например ...

var loadBarClip:MovieClip;

и внутри функции загрузки, присваивающей loadBar loadBarclip как таковой

loadBarClip = loadBar.

Я чувствую, что это излишне. Кто-нибудь знает о любом случае доступа к моему loadBar без создания ссылочной переменной?

Ответы [ 3 ]

2 голосов
/ 04 октября 2009

Если это только для этого обработчика, вы можете сделать его анонимным и оставить его внутри текущей области видимости.

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;
}
2 голосов
/ 04 октября 2009

Я не вижу большой проблемы с объявлением переменной вне функции imageLoader. Если бы вы писали это в классе вместо временной шкалы, тогда это была бы просто переменная-член класса, и в этом нет ничего плохого. Они существуют именно по этой причине.

Если ваш тупик хочет сохранить переменную loadBar локальным, вы всегда можете сделать это:

в функции imageLoader:

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

в функции progressHandler:

getChildByName("loadBar");
1 голос
/ 04 октября 2009

Поскольку lBar (или loadBar в этом отношении) является элементом, которым вы должны управлять на уровне класса, вы действительно должны сделать его членом класса. В этом нет ничего плохого;)

...