为不同的加载器重用eventlistener Flash - AS3

时间:2011-10-22 19:17:22

标签: flash actionscript-3 loader

我想重用传递了url和字符串值的loadImage函数,并将图像加载到影片剪辑中。

我想要加载到不同的movieClip中的多个图像。我以为我可以用我的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 个答案:

答案 0 :(得分:1)

你应该内联编写事件处理程序,以传递你的计数器:

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) });
}

答案 1 :(得分:1)

问题是你在每次加载时都覆盖了相同的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');

(没有测试过代码,可能会有一些拼写错误)

答案 2 :(得分:1)

(看起来你固定了Error #2007CapelliC指出了它。)

要重用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()