AS3: Копирование Загрузчика от одного объекта до другого

Я имею два класса, называю их A и B. Они оба содержат объект Загрузчика. В классе A я загружаю содержание в объект Загрузчика.

public class A {
    var loader:Loader;

    public function A():void {
        loader = new Loader();
        this.addChild(loader);
        loader.load(...);
    }
}

public class B() {
    var loader:Loader;

    public function B():void {
        loader = new Loader(); 
        this.addChild(loader);
    }
}

Я должен теперь присвоить Загрузчик A Загрузчику B (после того, как загрузка будет завершена).

В некотором другом классе у меня есть экземпляр A и B. Делание уроки значений загрузчика, кажется, не работает (при показе B, содержание загрузчика A не отображено).

var b:B = new B();
var a:A = new A();

// ... I wait for a's loader to be loaded ...
// ... then ... 
b.loader = a.loader;
addChild(b);
// A's Loader is not shown ...

Если я делаю следующее, это работает:

b.addChild(a.loader);

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

Существует ли способ копировать/присваивать Загрузчик непосредственно? Я пытался присвоить 'содержанию', но это только для чтения. Есть ли иначе, я могу сделать это? В основном у меня есть массив объектов Загрузчика, что все загружаются изображениями. У меня затем есть единственный Загрузчик, это находится на этапе, и я хочу присвоить ему изображения (Загрузчики) от моего массива.

Спасибо.

1
задан nebs 20 July 2010 в 18:33
поделиться

3 ответа

В итоге я поменял местами дочерние элементы, чтобы получить тот же эффект. Это менее сложно, чем я думал.

Итак, в основном в B я сделал:

this.setChildIndex(loader,0);

Это нужно для того, чтобы убедиться, что загрузчик имеет индекс 0. (Это может быть любой фиксированный индекс, но в моем случае мне нужно, чтобы он отображался внизу). Первоначально нет необходимости иметь загрузчик в B, но я просто поместил его туда, чтобы убедиться, что что-то исправлено с индексом 0 (чтобы я случайно не удалил другого ребенка).

Затем, установив загрузчик A в значение B, я бы просто заменил дочерний элемент с индексом 0.

b.removeChildAt(0);  
b.addChildAt(a.loader,0);

Это не совсем то решение, которое я хотел, но пока оно работает хорошо.

0
ответ дан 2 September 2019 в 22:54
поделиться

Я сделал что-то вроде этого для забавы:

var a:Loader = new Loader();
a.contentLoaderInfo.addEventListener(Event.COMPLETE, aLoaded);
a.load(new URLRequest('A.swf'));
addChild(a);

var b:Loader = new Loader();
b.contentLoaderInfo.addEventListener(Event.COMPLETE, bLoaded);
addChild(b);


function aLoaded(event:Event):void {
    trace('a loaded');
    event.currentTarget.removeEventListener(Event.COMPLETE, aLoaded);
    b.loadBytes(a.loaderInfo.bytes);
}
function bLoaded(event:Event):void {
    event.currentTarget.removeEventListener(Event.COMPLETE, bLoaded);
    trace('b loaded');
}

с помощью загрузчика loadBytes и loaderInfo байтов Я создаю бесконечный цикл, в котором загружается, загружается b, загружает a, загружает b, загружает a, загружает b ... и начинают появляться петли.

НЕ ДЕЛАЙТЕ ЭТОГО!

Это не то, что вам нужно, вы работаете с изображениями, поэтому загрузчик содержимого должен быть Bitmap. Вы можете получить доступ и клонировать bitmapData, если у вас есть разрешение на доступ к пикселям (например, междоменная политика и новый LoaderContext (true) в качестве второго параметра в вызове load ()).

Итак, ваш ответ должен быть таким простым, как:

var a:Loader = new Loader();
a.contentLoaderInfo.addEventListener(Event.COMPLETE, aLoaded);
a.load(new URLRequest('app_image.jpg'));
addChild(a);

function aLoaded(event:Event):void {
    if(a.content is Bitmap){//check if it's actually an image, not a swf
        var clonedData:Bitmap = Bitmap(a.content).bitmapData.clone();
        //do whatever you need with the clone
        //e.g. var dolly:Bitmap = new Bitmap(clonedData);//etc
    }
}

Это не код ООП, это просто что-то минимальное, чтобы вы могли легко понять:)

2
ответ дан 2 September 2019 в 22:54
поделиться

Насколько я понимаю, вы хотите создать метод setLoader для своего класса b. что-то вроде

public class B() {
    var loader:Loader;

    public function B():void {
      // nothing here, unless you really
      // want a b.loader before stting it from outside
    }

    public function setLoader(_l:Loader){
      if(loader) removeChild(loader);
      loader = _l;
      addChild(_l);
    }
}

вы можете затем, когда a загружен, вызвать

b.setLoader(a.loader);

, знайте, что a.loader больше не будет дочерним для a (если вы отобразите a, он будет пустым), но вы все равно сможете чтобы получить к нему доступ как с помощью a.loader, так и b.loader.

скажите мне, поможет ли это.

0
ответ дан 2 September 2019 в 22:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: