Повторное использование Eventlistener для разных загрузчиков Flash - AS3 - PullRequest
0 голосов
/ 22 октября 2011

Я хочу повторно использовать мою loadImage функцию, которой передается URL-адрес и строковое значение, и она загружает изображение в фрагмент ролика.

У меня есть несколько изображений, которые я хочу загрузить в разные мувиклипы. Я думал, что мог бы просто передать переменную с помощью addEventListener(Event.COMPLETE,, но она работает только при первой загрузке изображения ниже, это мой код, а ниже - моя ошибка:

AS3

    //CALL loadImage  FUNCTION PASS URL TO LOCAL IMAGE AND UNIQUE NUMBER FOR EVENTLISTENER


loadImage('\\assets\\' + rootPath + '\\images\\bg.jpg',"1");
loadImage('\\assets\\' + rootPath + '\\images\\english.png',"2");
loadImage('\\assets\\' + rootPath + '\\images\\spanish.png',"3");

var imageLoader:Loader;

function loadImage(url:String,inc:String):void {
    trace(inc);
imageLoader = new Loader();
imageLoader.load(new URLRequest(url));
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,
    function(e:Event) : void { imageLoaded(inc) });

}

function imageLoaded(counter:String):void {
    trace(counter);
if (counter == "1"){

    trace("Background");
background.addChild(imageLoader);
}else if (counter == "2"){

    trace("english");

englishMC.addChild(imageLoader);
}else if (counter == "3"){

    trace("Spanish");

spanishMC.addChild(imageLoader);
}
}

ошибка:

TypeError: Error #2007: Parameter listener must be non-null.
    at flash.events::EventDispatcher/addEventListener()
    at Function/<anonymous>()
    at EndCap_fla::MainTimeline/processXML()
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.net::URLLoader/onComplete()

Я знаю, что я мог бы просто иметь отдельные функции для каждого загруженного изображения, но если возможно, я хотел бы иметь возможность повторно использовать функцию loadImage

Ответы [ 3 ]

1 голос
/ 23 октября 2011

Проблема в том, что вы переопределяете один и тот же imageLoader при каждой загрузке, поэтому при каждом вызове imageLoaded вы будете использовать последнее изображение.

В вашем случае я бы создал новый класс для обработки загрузки изображения в указанный контейнер, что-то вокруг этих строк:

class ResourceLoader {
    private var target: Container;
    private var loader: Loader;

    function ResourceLoader(target:Container, image: String) {
        loader = ...
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
    }

    function onComplete(e: Event):void {
        target.addChild(loader);
    }
}

и используйте его так:

new ResourceLoader(background, '\\assets\\' + rootPath + '\\images\\bg.jpg');

(Не проверял код, возможно, есть некоторые опечатки)

1 голос
/ 23 ноября 2012

(Похоже, вы исправили Error #2007, как указал CapelliC .)

Для повторного использования loadImage() он должен быть независимым отчто-нибудь вне этого.Ваша текущая loadImage() нуждается в imageLoader, который вы должны объявить внутри функции.

imageLoaded() также зависит от него, но, поскольку он входит в прослушиватель событий, вы должны получить imageLoader повыполнение .addChild(e.currentTarget.loader) вместо .addChild(imageLoader).

Эта путаница в области видимости заставляет вас потерять два других загруженных изображения (остерегайтесь замыканий!), потому что imageLoader переопределяется новым экземпляром самого себя напри каждом вызове функции.

Кроме того, вы можете легко передать любую переменную с помощью addEventListener() после небольшого изменения в imageLoaded().Вот как вы должны все это делать:

loadImage("\\assets\\" + rootPath + "\\images\\bg.jpg", "1");
loadImage("\\assets\\" + rootPath + "\\images\\english.png", "2");
loadImage("\\assets\\" + rootPath + "\\images\\spanish.png", "3");

function loadImage(url:String, inc:String):void {
  trace(inc);
  var imageLoader:Loader = new Loader();
  imageLoader.load(new URLRequest(url));
  imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded(inc));
}

function imageLoaded(counter:String):Function {
  return function(e:Event):void {
    trace(counter);
    if (counter == "1") {
      trace("Background");
      background.addChild(e.currentTarget.loader);
    } else if (counter == "2") {
      trace("english");
      englishMC.addChild(e.currentTarget.loader);
    } else if (counter == "3") {
      trace("Spanish");
      spanishMC.addChild(e.currentTarget.loader);
    }
    //e.currentTarget.removeEventListener(Event.COMPLETE, arguments.callee);
  }
}

Теперь вы можете повторно использовать loadImage() и imageLoaded().

1 голос
/ 22 октября 2011

Вы должны написать встроенный обработчик событий, чтобы передать счетчик:

function loadImage(url:String,inc:String):void {
imageLoader = new Loader();
imageLoader.load(new URLRequest(url));
imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,
    function(e:Event) : void { imageLoaded(inc) });
}
...