2009-08-12 89 views
0

我需要從XML與加載一組圖像和分配交互他們AS3分配類到XML加載元件

首先我加載XML

import flash.display.Loader; 
import flash.net.URLRequest; 
    var loader:Loader  = new URLLoader(); 
    var request:URLRequest = new URLRequest("myXML.xml"); 
    loader.load(request); 

loader.addEventListener(Event.Complete, proessFile); 
function processFile(e:Event):void 
{ 
var loadedXML:XML = (e.target.data); 
} 

//load set of images from XML file 

for (var i:uint = 0; i < loadedXML.image.length(); i++) 
{ 
    var imgLoader:Loader  = new Loader(); 
    var imgRequest:URLRequest = new URLRequest (loadedXML.img[i].attribute("filepath")); 
    imgLoader.load(imgRequest); 
    addChild(imgLoader); 
} 

這裏我需要讓每一個圖像拖動。是否可以將其更改爲另一種數據類型,b/c我無法使用Loader?

我試過將它們分配給.name屬性,但我以後無法再調用它們。

我不知道如果我足夠清楚,但基本上我需要處理每一個加載的圖像作爲新的對象。是否可以爲每個圖像分配變量?

任何有關這裏的工作流程的建議將不勝感激。

回答

2

因爲您將它們添加到舞臺上,您可以嘗試命名它們,然後通過舞臺的getChildByName方法調用它們。

或者你可以建立一個裝載器數組,或者更好的是,movieClip。例如: import flash.display.Loader; import flash.net.URLRequest;

var loader:Loader  = new URLLoader(); 
var request:URLRequest = new URLRequest("myXML.xml"); 
loader.load(request); 

var images:Array = new Array(); 

loader.addEventListener(Event.Complete, proessFile); 
function processFile(e:Event):void 
{ 
var loadedXML:XML = (e.target.data); 
} 

//load set of images from XML file 

for (var i:uint = 0; i < loadedXML.image.length(); i++) 
{ 
    // create a new movie clip 
    var tmpMovieClip:MovieClip = new MovieClip(); 
    var imgLoader:Loader  = new Loader(); 
    var imgRequest:URLRequest = new URLRequest (loadedXML.img[i].attribute("filepath")); 
    imgLoader.load(imgRequest); 
    // add the loader to the movie clip's display list 
    tmpMovieClip.addChild(imgLoader); 
    // add the movieclip to the previously declared array 
    images.push(tmpMovieClip); 
} 

這樣,您可以在需要時調用和使用數組的任何元素。如果您不需要MoviClips,則可以將Loader實例添加到Array中。

+0

謝謝你的幫助。我已經將對象放入Sprite中,並使用數組訪問它們。 – 2009-08-13 14:59:11

1

恐怕我無法理解您的一些問題。

是否有可能將其更改爲另一種數據類型,b/c我無法使用Loader?

首先,您想要更改它的數據類型。其次,你爲什麼不能使用Loader?

我試過將它們分配給.name屬性,但我以後無法再調用它們。

你爲什麼打電話給他們,你是怎麼嘗試的?

我需要使用每一個加載的圖像作爲新的對象。

每個加載器對象封裝一個圖像對象。圖像實際上是在加載程序中(在.content屬性上)。


evilpenguin描述瞭如何存儲對數組內的加載器對象的引用,以便稍後可以訪問它們。這是正確的基本方法。真正的問題是:「你究竟在做什麼?」

你說:

這裏我需要讓每一個圖像拖動。

如果是那麼簡單,那麼直接添加事件到加載器(封裝圖像)。

for each(var image:XML in loadedXML.image) 
{ 
    var imgLoader:Loader = new Loader(); 
    var imgRequest:URLRequest = new URLRequest([email protected]); 
    imgLoader.load(imgRequest); 
    addChild(imgLoader); 

    // NOTE: you may want to wait until it is done loading 
    // before you add drag and drop behaviour although 
    // that isn't strictly necessary 
    makeDraggable(imgLoader); 
} 


function makeDraggable(loader:Loader):void 
{ 
    loader.addEventListener(MouseEvent.MOUSE_DOWN, startDrag); 
    loader.addEventListener(MouseEvent.MOUSE_UP, stopDrag); 

    // NOTE: I'll leave it up to you to decide 
    // how you want to implement drag and drop 
} 

注:我也改變了你的循環使用E4X這與XML的ActionScript中處理得多的很好的方式。

+0

從理論上說,向事件添加事件會更有效率,但會帶來一個可用性問題:Loader類沒有.buttonMode屬性,因此它不會在鼠標懸停時更改鼠標光標。這意味着用戶不一定會意識到對象上存在鼠標操作。這就是爲什麼,如果表現不是一個荒謬的問題,我寧願裝載在電影剪輯中。我錯過了什麼,有沒有其他的方式來做到這一點? – evilpenguin 2009-08-13 06:12:43

+0

有問題,我正在嘗試做什麼。我想創建一個可以擴展每個加載項的功能的類。我想把所有的互動都放在那個班裏。所有項目均爲單一課程。 – 2009-08-13 15:04:28

0

要創建圖像的「副本」,只需執行以下操作。

private function contentLoaderInfo_completeHandler(event:Event):void 
{ 
    var loaderInfo:LoaderInfo = event.target as LoaderInfo; 
    var originalBitmap:Bitmap = loaderInfo.content as Bitmap; 
    var newBitmap:Bitmap = new Bitmap(originalBitmap.bitmapData.clone()); 
    images.push(addChild(newBitmap)); 
} 

這樣你就完全脫離了加載器對象,可以完全處理它們。很明顯,因爲evilpenguin建議你可以將它們添加到Sprites或MovieClip中,然後將它們添加到舞臺上(Bitmap類不是DisplayObjectContainer,因此不能向它們添加額外的子項)。