Функция Loader Event Complete вызывается только один раз - PullRequest
1 голос
/ 21 февраля 2011

Итак, я пытаюсь загрузить ресурсы, добавить их в словарь и заставить метод рисования искать в этом словаре и рисовать на основе определенных предикатов. У меня есть функция, которая перебирает Vector из String с, вызывая экземпляр 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): void { var drawFunct: Function = function (spr: Словарь, индекс: 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 вызывался только один раз (я проверял трассировку в обработчике complete). Однако Loader вызывает загрузку каждый раз, когда цикл повторяется. Я попытался создать отдельные загрузчики для каждого ресурса, просто чтобы посмотреть, будет ли он работать, но мне не повезло с этим. Нужно ли делать отдельные загрузчики и обработчики событий? Или я просто не правильно использую Loader?

1 Ответ

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

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

...