2010-07-20 86 views
1

我有兩個類,稱它們爲A和B.它們都包含一個Loader對象。在類A中,我將內容加載到Loader對象中。AS3:將裝載器從一個對象複製到另一個對象

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

謝謝。

+0

如果它只是圖像,你可以克隆圖像的bitmapData,並製作新的,而不是新的裝載機。 – 2010-07-20 19:17:18

回答

0

我結束了換孩子得到相同的效果。這比我想象的要複雜得多。

所以B中基本上我做:

this.setChildIndex(loader,0); 

這是爲了確保裝載機是在索引0(它可以是任何固定的指數但對我來說,我需要它出現在底部)。在B中最初沒有必要裝載一個裝載器,但是我只是把它放在那裏以確保索引0處有固定的東西(所以我不會意外地移除其他一些孩子)。

然後,當將A的加載器設置爲B時,我只需在索引0處換出子元素。

b.removeChildAt(0); 
b.addChildAt(a.loader,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'); 
} 

使用裝載機的loadBytes和的LoaderInfo的bytes我創建了一個無限循環,其中一個加載一個,負載B,加載,負載B,加載,加載灣..和循環整體開始出現。

不要這樣做!

這不是你所需要的,你正在處理圖像,所以加載器content應該是一個位圖。考慮到您有權訪問像素(例如crossdomain策略和新的LoaderContext(true)作爲load()調用中的第二個參數),您可以訪問和克隆bitmapData。

所以你的答案應該是簡單:

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

嘿,謝謝你的回覆。我知道我說我現在正在加載圖片,但我意識到我可能需要支持swf下線。我最終只是做了removeChildAt(0)和addChildAt(loader,0)。它工作到目前爲止... – nebs 2010-07-20 20:08:52

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

你就可以,一個被加載時,調用

b.setLoader(a.loader); 

知道a.loader不會是一個孩子了(如果你顯示,這將是空的),但是你仍然可以用a.loader和b.loader來訪問它。

告訴我這是否有幫助。

相關問題