AS3 flash прыжок событие сбивает меня с толку - PullRequest
1 голос
/ 10 августа 2011

Я пишу класс в 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();

Ответы [ 2 ]

0 голосов
/ 10 августа 2011

Может быть, вы заняты ожиданием после отправки асинхронной задачи?Вы знаете, что Flash однопоточный.Может быть, занятое ожидание мешает обработке событий?

Почему вы не выполняете трассировку в методах обработчика?

0 голосов
/ 10 августа 2011

вы не можете получить доступ к переменной (извне функции), которая была объявлена ​​внутри функции.Проверьте с помощью переменной области действия .

...