AS3:将Loader从一个对象复制到另一个对象

时间:2010-07-20 18:33:21

标签: flash actionscript-3 copy variable-assignment loader

我有两个类,称它们为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?我尝试分配'内容',但这是只读的。还有其他方法可以做到这一点吗?基本上我有一个Loader对象数组,所有这些对象都加载了图像。然后我在舞台上有一个Loader,我想从我的阵列中分配图像(Loaders)。

感谢。

3 个答案:

答案 0 :(得分:1)

我做了这样的事情是为了好玩:

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

使用loader的loadBytes和loaderInfo的bytes我创建了一个无限循环,其中加载a,加载b,加载a,加载b,加载a,加载b ...以及循环整体开始出现

请勿这样做!

这不是你需要的,你正在使用图像,所以加载器content应该是一个位图。您可以访问和克隆bitmapData,因为您有权访问像素(例如,crossdomain策略和新的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
    }
}

这不是OOP代码,它只是最小的东西,所以你可以很容易地得到图片:)

答案 1 :(得分:0)

我最终交换了孩子以获得同样的效果。它没有我想象的那么复杂。

所以基本上在B中我做了:

this.setChildIndex(loader,0);

这是为了确保加载器在索引0处。(它可以是任何固定索引,但在我的情况下,我需要它出现在底部)。最初没有必要在B中加载一个加载器,但我只是把它放在那里以确保在索引0处有一些固定的东西(所以我不会意外删除其他一些孩子)。

然后当将A的加载器设置为B时,我只需将索引为0的子项换掉。

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

这不是我想要的解决方案,但它到目前为止运作良好。

答案 2 :(得分:0)

根据我的理解,你想为你的b类创建一个setLoader方法。

之类的东西
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.loader和b.loader访问它。

告诉我这是否有帮助。