Есть ли в Actionscript способ создания копии или кэшированной версии Loader? - PullRequest
1 голос
/ 10 февраля 2012

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

private function playSounds():void {
    for (var i:Number = 0; i < 14; i++)
    {
        for (var a:Number = 0; a < 16; a++)
        {               
            if (boxes[i][a].x == linePos && boxes[i][a].selected == true && played[i][a] == false)
            {                   
                played[i][a] = true;
                MovieClip();
                var swf:URLRequest = new URLRequest("../assets/glow2.swf")
                var glow:Loader = new Loader()
                glow.load(swf)
                glow.x = boxes[i][a].x - 25*0.7;
                glow.y = boxes[i][a].y - 27*0.7;
                glow.scaleX = 0.7;
                glow.scaleY = 0.7;
                this.addChild(glow);
                glows.push(glow)
                glowTime.push(0)
                var sc:SoundChannel = new SoundChannel();
                sc = (sounds[i] as Sound).play();
            }
        }
    }
}

Это очень очень медленно, когда оно отображается, скажем, 5 раз за раз, поэтому мне интересно, есть ли способ загрузить его только один раз и использовать в нескольких местах.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

У вас есть content свойство Loader. Таким образом, загрузить один раз, использовать содержимое много раз.

edit: вы можете добавить слушателя, который будет знать, когда загрузка завершится, прежде чем использовать загруженный контент:

addEventListener(Event.COMPLETE, completeHandler);

edit2:

var mc1:MovieClip = new MovieClip();
var mc2:MovieClip = new MovieClip();

var my_Loader:Loader = new Loader();
mc1.addChild(my_Loader);
mc2.addChild(my_Loader);

(хотя и не пробовал).

0 голосов
/ 11 февраля 2012

Один быстрый обходной путь - создать второй загрузчик и передать ему загруженные байты с помощью метода loadBytes () :

var l:Loader = new Loader();
l.contentLoaderInfo.addEventListener(Event.COMPLETE,ready);
l.load(new URLRequest("../assets/glow2.swf"));

function ready(event:Event):void{
    var mc:MovieClip = event.currentTarget.content as MovieClip;

    var clone:Loader = new Loader();
    clone.loadBytes(event.currentTarget.bytes);

    addChild(mc);
    addChild(clone);

    clone.x = 100;
}

Это будет работать в большинстве случаев. В некоторых случаях вам может понадобиться что-то такое простое, как:

var clone:MovieClip = MovieClip(new mc.constructor());

И есть также 3-й вариант: «перетягивание» вашего мувиклипа, что означает, что вы будете хранить один или несколько (в зависимости от того, сколько кадров MoveClip вам нужно кэшировать) объектов BitmapData в памяти, что draw () из исходного мувиклипа, который вы хотите нарисовать (в нескольких местах одновременно).

Подход loadBytes достигает того, что предлагает вопрос: создает копию загрузчика, поэтому он повторно использует загруженные байты, но инициализирует новый контент, поэтому использует для этого память. Если это не то, что вам нужно, кэширование MovieClip с использованием BitmapData - ваш лучший выбор.

...