2011-04-02 80 views
0

嘗試隨機選取4張圖像並將它們加載到數組中,然後在顯示所有4張圖像時使用計時器顯示它們。將再次加載4張圖像。這裏是代碼:AS3將多個外部圖像加載到數組中?

var images : Array = new Array(); 
var rndNumbers : Array = new Array(); 
var imageLoader : Loader; 
var imageTimer : Timer = new Timer(3000, 0); 
var currImageID : int; 
var imgID : int; 
var loaded : Boolean = true; 
var i : int; 
var tmp : int = 0; 
var rnd : int = 0; 

addEventListener(Event.ENTER_FRAME, OnLoad); 

imageTimer.addEventListener(TimerEvent.TIMER, ChangePicture); 

function OnLoad(e : Event) : void { 
    RandomNumbers(); 
    LoadImages(); 
} 

function RandomNumbers() { 
    for (var n = 0; n <= 3; n++) { 
     rnd = 1 + Math.floor(Math.random() * 4); 
     while (tmp == rnd) { 
      rnd = 1 + Math.floor(Math.random() * 4); 
     } 
     tmp = rnd; 
     rndNumbers[n] = rnd; 
     trace(rnd); 
    } 
} 

function LoadImages() : void { 
    for (var i = 0; i <= rndNumbers.length - 1; i++) { 
     imageLoader = new Loader; 
     var urlRequest : URLRequest = new URLRequest("images/pic" + rndNumbers[i] + ".jpg"); 
     imageLoader.load(urlRequest); 
     imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadComplete); 
    } 
    imageTimer.start(); 
} 

function LoadComplete(event : Event) { 
    removeEventListener(Event.ENTER_FRAME, OnLoad); 
    images[imgID] = imageLoader; 
    imgID++; 
} 

function ChangePicture(event : TimerEvent) : void { 
    transition.gotoAndPlay(1); 
    Img_Box.addChild(images[currImageID]); 
    if (currImageID != 3) { 
     currImageID++; 
    } else { 
     RandomNumbers(); 
     LoadImages(); 
     currImageID = 0; 
    } 
} 

這裏可能出現的問題將是for循環,它加載圖像不會等待加載完成,任何繼續循環。如何解決這個問題?或者你有更好的建議嗎?

謝謝先進。

+0

是的,這整件事情的建立真的很糟糕。我的建議,學習如何使用閃光燈,而無需使用ENTER_FRAME事件。這裏將發生什麼是你將每秒調用OnLoad 30-60次,直到加載一個圖像。所以基本上這讓我想知道你是否試圖運行這個代碼,因爲它應該只是簡單的崩潰閃存。 – 2011-04-02 13:01:01

+0

謝謝jesse,葉,你注意到我有點新as3,真的有這個問題在腦海中如何保持一個功能,而不會導致它崩潰。就像在VB中,你可以使用DoEvents或類似的函數。 as3中如何可能?你知道任何參考,我可以學習有關這種編程的基本知識,而不必經過一切?謝謝 – Kourosh 2011-04-02 14:51:08

+0

抱歉,對我的評論有負面評論,不意味着粗魯或任何此類性質。爲了解釋,每次渲染幀時都會調用ENTER_FRAME事件。因此,假設您將Flash SWF的每秒幀數設置爲120,則此方法將由閃存虛擬機(如果可能,基於硬件)每秒120次調用。所以把它想象成一個事件發生到每秒120次的回調會變糟。我會在圖片庫上發佈一個帶有視頻教程鏈接的答案,然後您可以根據自己的需要修改該代碼。 – 2011-04-02 14:55:14

回答

2

好吧所以沒有視頻教程的照片庫,但here is an Actionscript 3 tutorial on how to make a photo gallery。由於您是AS3的新手,請先從AS3開始,然後使用AS3中的計時器來切換照片。另外我的建議:儘量避免做時間軸補間和動畫,嘗試去純粹的動作。這是因爲基本上閃存是一個身份危機的工具/平臺。它的目的是用於藝術家和動畫師(因此時間線的東西,設計師用戶界面)和開發人員。當你混合兩個世界,然後進入更復雜的項目時,事情會變得非常快。但是,如果您按照您的代碼所暗示的那樣進行簡單的轉換,則應該沒問題。

確保學習時,你學習動作3.動作腳本2是舊的Flash AVM語言(動作虛擬機1),它比動作腳本3慢了20倍,是一種非類型安全或非嚴格的語言。 Actionscript 3是一種基於ecmascript 3語言標準的類型安全的嚴格語言,並且一度成爲ecma腳本4.0版格式命題的基礎模型。然而,由於微軟等人的關注,新規格被關閉,因此被認爲是專有語言,但仍然基於開放標準。

至於你的代碼,你可以簡單地改變onLoad方法來保持通過一個類成員變量計數onLoad回調被調用的次數。一旦你計數了4次(4次加載完成),你就可以將該變量重新設置爲0.而不是將第一次加載調用放在ENTER_FRAME事件中,你可以將該函數改爲一個通用函數,只需從內部調用它這個動作放置的框架。 (我假設這個代碼只是在Flash FLA中的一個框架上輸入的)。例如:

//---->Delete this -->addEventListener(Event.ENTER_FRAME, OnLoad); 

imageTimer.addEventListener(TimerEvent.TIMER, ChangePicture); 

OnLoad(); // Manually call the first function to get the whole load/display loop going. 

function OnLoad():void{ 

    RandomNumbers(); 
    LoadImages(); 
} 

而且你會想學會如何,如果你想成爲一個嚴重的,面向對象的Flash開發人員開始使用類,包括文檔類。你可以找到關於這個在這裏一個鏈接到一個視頻教程:

http://gotoandlearn.com/play.php?id=43

該網站也被裝得滿滿的說應該有你自己的方式成爲一個成熟的Flash開發者免費視頻教程。我自己在Flash中嚴格遵守這些教程,當他們第一次出現時,我就獲得了自己的基礎。從那裏你可能想看看關於面向對象編程和設計模式的書籍/教程,以及它們如何應用於actionscript 3語言。希望這有助於您的努力和一切努力。

+0

太棒了!真的很有幫助,你指出了我一直懷疑的事情,因爲我通過與像unity3d這樣的遊戲引擎進行比較來了解它。無論如何感謝您的時間。 – Kourosh 2011-04-02 19:04:31

+0

如果你有興趣學習一個不錯的3D引擎,那麼學習使用新的API出現在下一個主要版本的Flash播放器中。圖形和性能或尖端。更多信息:http://blog.ascensionsystems.ca/和http://away3d.com//。 – 2011-04-02 19:10:19