2009-10-04 70 views
2

自從我在一年前開始使用AS3以來,這一直在困擾着我。如何引用AS3中的動態實例化對象? (在舞臺上添加了Moviclip)

例子。我作出這樣的延伸的影片剪輯,並稱之爲類「LoaderBar」全是一些文字,上面寫着「加載」和它下面的其它影片剪輯這是一個普通的矩形,我稱之爲「lBar

當我打電話一個函數來加載我的形象我的裝載機添加到舞臺等..

function imageLoader(URL:String):void 

{ 

    var loader:Loader = new Loader(new URLRequest(URL)); 
    loader.contentLoaderInfo.addEventListner(ProgressEvent.PROGRESS, progressHandler); 

     var loadBar:Loader Bar = new LoaderBar(); 
     addChild(loadBar); 
} 


function progressHandler(e:Event):void 

{ 

    var pcent:Number = e.getBytesLoaded/e.getBytesTotal; 
    // HERE IS WHERE I'D LIKE TO MAKE DIRECT REFERENCE TO MY LOADBAR; 
    loadBar.lBar.width = pcent*100; 



} 

基本上我只是想告訴lBar在加載欄影片剪輯是百分比* 100的寬度。 (所以當剪輯被加載時,加載條寬度爲100像素)。

我的問題是這樣的。當我加載欄添加到舞臺上的功能裏面,我不能讓另一個函數中引用它,而不做一些黑客使我之類的函數之外的全局變量...

var loadBarClip:MovieClip; 

和負載內功能等

loadBarClip = loadBar. 

我覺得這是多餘的分配loadBarloadBarclip。有沒有人知道無論如何訪問我loadBar沒有參考變量?

回答

2

如果只是爲那個處理程序,你可以使處理程序匿名並保留在當前範圍內。

var loadBar = new LoaderBar(); 
var loader:Loader = new Loader(new URLRequest(URL)); 
loader.contentLoaderInfo.addEventListner(
    ProgressEvent.PROGRESS, function (e:Event):void { 
     var pcent:Number = e.getBytesLoaded/e.getBytesTotal; 
     loadBar.lBar.width = pcent*100; //Here you are making a direct reference. 
    } 
); 

如果你真的想你的封裝領域,你可以使用閉:

returnFromEncapulatingClosure = function(){ 
    var loadBar = new LoaderBar(); 
    var loader:Loader = new Loader(new URLRequest(URL)); 
    return { 
     loadBar: loadBar, 
     loader: loader 
    }; 
}(); 

這讓你捆綁一些參考在一起,這樣他們就不會破壞代碼的其他部分,你可以參考與它:

returnFromEncapulatingClosure.loader.contentLoaderInfo.addEventListner(ProgressEvent.PROGRESS, progressHandler); 
function progressHandler(e:Event):void { 
    var pcent:Number = e.getBytesLoaded/e.getBytesTotal; 
returnFromEncapulatingClosure.loadBar.lBar.width = pcent*100; 
} 

作爲一個註腳,當您擴展影片剪輯,添加設置lBar.width的方法。例如:

loadbar.setLBarWidth = function (w:number) { 
    this.lBar.width = w; 
} 
+0

喜歡它! RE:腳註,出於某種原因,我已經適應了從基地控制一切的喜好。我覺得我並沒有深入課堂去看看自己在做什麼,而是從家裏出發,並從頭開始控制所有事情。我並不總是這樣做,我想這不是我的OOP,但我剛剛開始。再次感謝,真棒技巧。 – 2009-10-04 03:04:01

+0

哦,這個規則!它效果很好。 通過這種方式,我還可以通過爲Event.COMPLETE添加另一個處理程序來完成加載操作時刪除加載程序。 你只是改變了我寫我的加載事件處理程序的方式。 – 2009-10-04 03:26:09

+0

我很高興你喜歡它。我認爲它很乾淨,並且在使用匿名函數時使事情變得可讀性和組織性。對於事件,我只在被重用時使用命名函數。還要注意,對於我提到的閉包,應該將'returnFromEncapsulatingClosure'命名爲適用於您的上下文的東西,並且可以取出命名的變量並將'new'語句正確放入返回的對象中。 – dlamblin 2009-10-04 22:27:39

2

我沒有看到在imageLoader函數之外聲明變量的主要問題。如果你是在一個類而不是時間線上寫這個,那麼它只是一個類成員變量,並沒有什麼錯。他們存在這個原因。

如果您deadset想保持加載欄局部變量,那麼你總是可以做到這一點:

var loadBar:Loader Bar = new LoaderBar();  
loadBar.name = "loadBar"; 
addChild(loadBar); 
在progressHandler功能

getChildByName("loadBar"); 
+0

謝謝!我將它添加到函數中的舞臺的原因是在此函數之前,我對所有隱藏在其父剪輯中的孩子進行了全面掃描。我基本上有一個「場景」(憎恨那個詞)誰是可見性只是點擊,取決於某人在導航。場景內部是一組產生內容的功能。其中之一是一個「cleanScene()」函數,可以刪除它的所有子項,所以我沒有使用多餘的內存。問題是,一旦我清理我的場景,我也消除了我沒有動態添加到舞臺上的任何東西。 – 2009-10-04 02:57:14

1

由於在ImageLoader的功能

lBar(或者loadBar)是一個你需要在類級別管理的元素,你應該確實使它成爲一個類成員。沒有什麼不對;)

+0

我在講課時實際上在作弊......我在圖書館的屬性面板中使用了「Export for Actionscript」。雖然我很樂意在文本中做所有事情,但我也有點懶。 – 2009-10-04 02:59:24

+0

在其時間軸中包含代碼的MovieClip也是Flash的類...編譯器使用您在「類名稱」字段中聲明的名稱以及在任何幀中聲明的屬性和函數生成一個類。然後,通過addFrameScript將「非聲明式」代碼本身插入到類中......因此,即使您不爲其創建外部類文件,您也可以將它們視爲類;) – Cay 2009-10-05 14:57:51