【问题标题】:Loader Event Complete function only being called onceLoader Event Complete 函数只被调用一次
【发布时间】:2011-07-01 12:50:46
【问题描述】:

所以,我正在尝试加载资源,将它们添加到字典中,并使用绘图方法搜索该字典并根据某些谓词进行绘制。我有一个函数可以遍历Strings 的Vector,调用Loader 的实例来加载实例化为URLRequest 的它们。

    private function loadImages(urls:Vector.<String>):void
    {
        var loader:Loader = new Loader();

        loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
        loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);

        var loadResource:Function = function(item:String,index:int,vector:Vector.<String>):void
        {
                loader.load(new URLRequest(item));
        }

        urls.forEach(loadResource);
    }

然后我有一个处理加载完成的事件处理程序,调用一个绘图方法,在 Dictionary 中找到加载位图。

    public function completeHandler(event:Event):void
    {
        var loader:Loader = Loader(event.target.loader);
        var bm:BitmapData = new BitmapData(loader.width,loader.height,false);
        bm.draw(loader,new Matrix());
        this.bmDict[loader.contentLoaderInfo.url] = bm;
        trace("complete handler" + loader.contentLoaderInfo.url);
        trace(this.bmDict[loader.contentLoaderInfo.url]);
        this.drawSprite(loader.contentLoaderInfo.url);
    }

我的drawsprite函数 公共函数drawSprite(resourceUrl:String):无效 { var drawFunct:Function = function(spr:Dictionary,index:int,vector:Vector.):void {

            var sprRen:SpriteRenderer = new SpriteRenderer();

            trace(resourceUrl.search("blue"));
            trace(resourceUrl.search("drkOrange"));
            trace(resourceUrl.search("green"));
            trace(resourceUrl.search("ltblue"));
            trace(resourceUrl.search("orange"));
            trace(resourceUrl.search("pink"));
            trace(resourceUrl.search("purple"));
            trace(resourceUrl.search("red"));
            trace(resourceUrl.search("yellow"));
            trace(spr.color);

        if((resourceUrl.search("blue") != -1) && (spr["color"] == 1)) {
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();
        } else if ((resourceUrl.search("drkOrange") != -1) && (spr["color"] == 2)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("green") != -1) && (spr["color"] == 3)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("ltblue") != -1) && (spr["color"] == 4)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("orange") != -1) && (spr["color"] == 5)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("pink") != -1) && (spr["color"] == 6)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("purple") != -1) && (spr["color"] == 7)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("red") != -1) && (spr["color"] == 8)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        } else if ((resourceUrl.search("yellow") != -1) && (spr["color"] == 9)){
            var bigBm:BitmapData = sprRen.renderType(spr["type"],bmDict[resourceUrl]);
            spr["sprite"].graphics.beginBitmapFill(bigBm,null,true,false);
            spr["sprite"].graphics.drawRect(0,0,BIG_SPRITE_SCALE,BIG_SPRITE_SCALE);
            spr["sprite"].graphics.endFill();

        }

        }

        sprites.forEach(drawFunct);
        }

所以问题是:只有我的Vector 中的第一张图像正在绘制。经过进一步检查,我发现 completeHandler 只被调用了一次(我在完整的处理程序中放了一个跟踪来检查)。但是,Loader 在每次循环迭代时都会调用 load。我尝试为每个资源实例化单独的加载器,只是为了看看它是否可以工作,但我没有运气。我需要制作单独的加载器 事件处理程序吗?还是我只是没有正确使用 Loader?

【问题讨论】:

  • 我没有看到任何将Loader 添加到显示列表的代码。
  • 我只是使用 BitmapData 类的 draw() 方法的加载器,它将加载的资源绘制到 BitmapData 对象上。

标签: apache-flex actionscript-3 actionscript loader


【解决方案1】:

你只使用一个加载器同时加载多个文件,这是行不通的,Loader 只能同时处理一个文件。 所以你需要一个资源一个加载器,或者如果你只想使用一个加载器,你需要一个加载器。

【讨论】:

  • 我尝试使用多个加载器,但我也遇到了一些问题。我可能遇到了其他问题,但我知道我确实对所有加载程序实例使用了相同的事件侦听器。我认为这可能是问题所在,但回头看我不明白为什么会这样。它只是对您传递事件侦听器的函数的引用。我会再次尝试多个加载器,看看是否可以让它工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多