Небольшая помощь, чтобы понять события (нубский вопрос) - PullRequest
0 голосов
/ 21 января 2011

Я изучаю as3, и у меня возникают трудности с пониманием событий.

Я пытаюсь загрузить параметры внутри массива, к которому мне позже потребуется доступ для загрузки изображений.

Теперь ..

private function init(e:Event = null):void {

    removeEventListener(Event.ADDED_TO_STAGE, init);

    myLoader.load(new URLRequest("slides.xml"));
    myLoader.addEventListener(Event.COMPLETE, processXMLSlides);
    ...
}

private function processXMLSlides(e:Event):void {

    removeEventListener(Event.COMPLETE, processXMLSlides);

    myXML = new XML(e.target.data);
    myXML.ignoreWhite=true;

    for (var i:int = 0; i < myXML.IMAGE.length(); i++) {
        imagesURLs.push(myXML.IMAGE[i]);
        //trace(myXML.IMAGE[i]);
    }
    //Start the main routine.
    loadImages();
    writeImage(imageCurrent);
}

loadImages () принимает массив imagesURLs и загружает их в другой массив как URLRequests, а затем writeImage () записывает изображение на сцену.

Теперь вот что,Если я переместу функции loadImages () и writeImage () сюда:

   private function init(e:Event = null):void {

        removeEventListener(Event.ADDED_TO_STAGE, init);

        myLoader.load(new URLRequest("slides.xml"));
        myLoader.addEventListener(Event.COMPLETE, processXMLSlides);

            //Start the main routine.
        loadImages();
        writeImage(imageCurrent);
        ...
    }

Это не сработает, потому что loadImages вызывается ДО ТОГО, как массив заполняется из xml.Теперь, как я могу сказать as3 подождать, пока processXMLSlides завершит свою работу?Мне нужно другое мероприятие?Это глупо (есть лучшие способы сделать то, что я делаю)?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Ваш вопрос не имеет смысла, ваш первый пример делает именно то, что вы просите - ждать загрузки XML.

Flash-события очень удобны при обработке асинхронных процессов - таких как загрузка XML - как долго вы будете ждать, прежде чем вызывать loadImages(); и writeImage(imageCurrent);? Ответ - ровно столько, сколько требуется для загрузки XML. Так что держите его там, где он есть, в методе обработчика событий.

ПРИМЕЧАНИЕ:

Сначала добавьте слушателя в myLoader и только потом вызывайте метод load (). При тестировании в локальной среде (с жесткого диска) может случиться так, что файл «slides.xml» будет загружен немедленно и событие COMPLETE будет запущено до того, как будет прикреплен eventListener.

1 голос
/ 21 января 2011

это непроверенный код, но что-то вроде этого должно работать:

private function init(e:Event = null):void
    {
    removeEventListener(Event.ADDED_TO_STAGE, init);

    myLoader.addEventListener(Event.COMPLETE, processXMLSlides);
    myLoader.load(new URLRequest("slides.xml"));
    }

private function processXMLSlides(e:Event):void
    {
    e.currentTarget.removeEventListener(Event.COMPLETE, processXMLSlides);

    myXML = new XML(e.target.data);
    myXML.ignoreWhite = true;

    for each    (var element:XML in myXML..IMAGE)
                {
                var imageLoader:Loader = new Loader();
                imageLoader.addEventListener(Event.COMPLETE, writeImage);
                imageLoader.load(new URLRequest(element));
                }
    }

private function writeImage(e:Event):void
    {
    e.currentTarget.removeEventListener(Event.COMPLETE, writeImage);
    addChild(evt.currentTarget);
    }

вы можете придерживаться цикла var i: uint for, хотя вы можете использовать его для позиционирования размещениякаждое из ваших изображений.

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

...