Получить загруженные данные в качестве возвращаемого значения в функции
Я до сих пор не могу понять, как некоторые простые вещи становятся сложнее в AS3. Здесь я хотел бы загрузить растровое изображение в функцию и при завершении вернуть его значение, чтобы приложение продолжало работу. Нечто подобное будет легко использовать:
var imageLoader:Bitmap;
for (var i:int=0; i<n.length; i++) {
imageLoader = loadFile(name[i]);
trace(imageLoader); // [object Bitmap]
}
function loadFile(name:String):Bitmap {
imgLoad:ImageLoader = new ImageLoader(url + name)
imgLoad.addEventListener(LoaderEvent.COMPLETE, fileLoaded);
imgLoad.load;
function fileLoaded(ev:LoaderEvent) {
return ev.target.content; // the file now loaded is a bitmap.
}
}
Но это не работает. Возвращаемое значение должно быть в конце loadFile(). Я не очень понимаю, что мне делать, чтобы мой код был оптимизирован и работал. В первый раз, когда я попытался, я использовал что-то вроде метода "loopingLoad" с "_Count:int" и "_CountEnd", чтобы узнать, когда прекратить вызывать loadFile... Что ж, это работало хорошо, но было очень уродливо. Итак, я хотел бы знать, как просто загрузить несколько файлов с помощью "For".
Спасибо за вашу помощь.
1 ответ
Вы в основном хотите синхронную загрузку. Нет, вы не можете сделать это напрямую, вы должны выполнить обходной метод, чтобы предоставить загруженное растровое изображение в другом месте. Это, однако, заставит вас переосмыслить всю логику вашего приложения, по крайней мере ту часть, в которую вы хотите загружать свои изображения.
Чтобы загрузить несколько файлов с циклом for, вам нужно сделать следующее: во-первых, вы создаете массив ваших загрузчиков, каждый с прикрепленным Event.COMPLETE
слушатель. Во-вторых, ваше приложение должно быть уведомлено о завершении загрузки одним из загрузчиков, указав либо индекс, либо ссылку на контент, либо и то, и другое.
var loaders:Array=new Array();
...
for (var i:int=0;i<urlArray.length;i++) {
// urlArray is the array with links to bitmaps
var l:Loader=new Loader();
l.addEventListener(Event.COMPLETE,onComplete);
l.load(new URLRequest(urlArray[i]));
loaders.push(l); // store it, if you want
// do other stuff, like preparing to accept an image
} // and that's all, you initiate and wait!
...
function onComplete(event:Event):void {
var i:int=loaders.indexOf(event.target); // get the index
event.target.removeEventListener(Event.COMPLETE,onComplete);
if (i<0) return; // oops!
notifyApplication(event.target.content); // now you transfer a ready bitmap
// add "i" if you need that index of your former "for" loop here
}