Я пишу класс в AS3, который будет отображать некоторые эскизы на сцене.
Я использую кучу событий для загрузки изображений, превращения их в растровые изображения и, наконец, размещения их на сцене, но это становится очень, очень запутанным.
Сначала я выбрал пару изображений. Скажи 5 изображений. Затем я загружаю их, как это:
//Files in an array to use in loop
var files:Array = imgList.fileList;
numberFiles = imgList.fileList.length;
//Have all files be locally encoded
//for-in loop gives too much headaches
for(var i:Number = 0; i<numberFiles; i++){
var fileRef:FileReference = files[i];
fileRef.addEventListener(Event.COMPLETE, imageLoadHandler);
fileRef.load();
}
imageLoadHandler делает это:
//Turn the image in to a bitmap.
private function imageLoadHandler(evt:Event):void {
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, bitmapLoadHandler);
loader.loadBytes(evt.target.data);//security issue
}
и, наконец, это:
//have the bitmap configured with width and height and scaling.
private function bitmapLoadHandler(evt:Event):void {
var bmp:Bitmap = Bitmap(evt.target.content);
//width, height and scaling
bmp.width = THUMBWIDTH;
bmp.height = THUMBHEIGHT;
bmp.scaleX < bmp.scaleY ? bmp.scaleY = bmp.scaleX : bmp.scaleX = bmp.scaleY;
//push the image on to an array
bmpArray.push(bmp);
}
bmpArray - глобальная переменная.
Так что это самый глубокий шаг, в который попадет оригинальный цикл for. Если после выполнения цикла я выполню трассировку длины bmpArray, он всегда будет показывать 0. Фактически, если я сделаю это:
//Wait for bmpArray to be filled.
var arrayIsFull:Boolean = false;
while(!arrayIsFull) {
trace(bmpArray.length);
trace(numberFiles);
if(bmpArray.length == numberFiles) {
arrayIsFull = true;
}
}
Тогда bmpArray останется равным 0 навсегда. Flash прекращает отладку, потому что после 15 секунд запуска того же сценария он останавливается автоматически.
Что здесь происходит? Почему bmpArray остается пустым?
Я выставил след для длины массива сразу после нажатия. Я видел, что он достигает этой части кода и увеличивается до фактического количества. Так почему же он пуст после цикла?
РЕДАКТИРОВАТЬ: 2 рассматриваемых массива были объявлены на уровне класса. Не внутри функции. Сфера не должна быть проблемой:
public class Pictures extends Sprite {
...
private var numberFiles:Number;
private var bmpArray:Array = new Array();