AS3: копирование загрузчика из одного объекта в другой - PullRequest
1 голос
/ 20 июля 2010

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

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

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

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

Спасибо.

Ответы [ 3 ]

1 голос
/ 20 июля 2010

Я сделал что-то вроде этого для удовольствия:

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 байтов Я создаю бесконечный цикл, где a загружает, загружает b, загружает a, загружает b, загружает a, загружает b ... и начинают появляться все циклы.

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

Это не то, чтовам нужно, вы работаете с изображениями, поэтому загрузчик content должен быть растровым.Вы можете получить доступ и клонировать 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
    }
}

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

0 голосов
/ 21 июля 2010

Из того, что я понимаю, вы хотите создать метод 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);
    }
}

тогда вы можете при загрузке вызвать

b.setLoader(a.loader);

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

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

0 голосов
/ 21 июля 2010

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

Так что в основном в Б я сделал:

this.setChildIndex(loader,0);

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

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

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

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

...