2014-10-28 67 views
1

我使用Actionscript 3創建音樂播放遊戲。爲此,我爲每個樂器記錄了大約20個音符(也使用Starling Framework和FlashDevelop,儘管這些可能與這個問題無關)。我目前通過指定每個文件的路徑和嵌入每個〜20的加載默認工具音符聽起來是這樣的:Actionscript 3 - 使用循環嵌入聲音文件陣列

[Embed(source = "../assets/1.mp3")] 
    public var SOUND_1:Class; 
    var sound:Sound = new SOUND_1() as Sound; 
    _sounds[1] = sound; 

    [Embed(source = "../assets/2.mp3")] 
    public var SOUND_2:Class; 
    var sound:Sound = new SOUND_2() as Sound; 
    _sounds[2] = sound; 

    [Embed(source = "../assets/3.mp3")] 
    public var SOUND_3:Class; 
    var sound:Sound = new SOUND_3() as Sound; 
    _sounds[3] = sound; 

    //... etc... 

然而,爲了嵌入了不同的樂器的聲音,我需要更多的東西模塊化。我寫了下面的循環,我期望加載聲音並將它們存儲在一個對象數組中(我已經在應用程序中使用了這樣一個數組)。我遇到的問題是,當我使用像這樣的字符串時,Embed標籤似乎無法識別文件名的擴展名。如果我將一個文件名硬編碼到EMBED行中,那麼它會很好地編譯(儘管顯然它會每次加載約20個相同聲音的副本)。

 for (var i:int = 1; i < totalSounds + 1; i++) { 
      var filename:String = '../pathtosounds/' + String(i) + '.mp3'; 
      [Embed(source = filename)] 
      var MY_SOUND:Class; 
      var sound:Sound = new MY_SOUND() as Sound; 
      _sounds[i] = sound; 
     } 

有沒有辦法解決這個問題,而無需爲每個可能的音符和樂器手動輸入每個文件名/文件路徑?

+0

您可以在大多數IDE中編寫腳本/批處理文件,通過使用循環或掃描目錄來自動編寫嵌入代碼。 FlashDevelop適用於這類事情。 – BadFeelingAboutThis 2014-10-28 22:46:57

+0

http://sourceforge.net/projects/assetpack/ - 應該是你的理想選擇(我從來沒有用過它) – BadFeelingAboutThis 2014-10-28 22:50:54

+0

你的方法不是模塊化的,所以沒有理由寫它應該是。 – BotMaster 2014-10-29 12:11:10

回答

0

與一個循環,進口的新的聲音效果允許作爲要我過的文件列表迭代更換嵌入標籤。下面是相關的代碼,這是一個更大的方法的一部分,取代與一個在instrumentName命名當前的儀器:

 for (var i:int = 1; i < totalSounds + 1; i++){ 
      var sound:Sound = new Sound; 
      sound.addEventListener(IOErrorEvent.IO_ERROR, onSoundLoadError); 
      var request:URLRequest = new URLRequest('audio/'+instrumentName+'/'+i+'.mp3'); 
      sound.load(request); 
      _sounds[i] = sound; 
     } 

對於這一點,我也不得不搬到我的「音頻」文件夾,其中包含一個子文件夾對於每個樂器,進入我的主.SWF文件所在的bin目錄。

我還必須從Flash和Feathers(Starling的其他UI框架)中導入一些額外的包。我允許用戶通過使用Feathers中的PickerList組件選擇一個新的儀器 - 因此上面的代碼中的相關錯誤事件。

0

[EMBED]標籤用於在COMPILE時間嵌入資產。您不能運行循環來嵌入資產,因爲這發生在RUN時間。

您可以使用Loader在運行時加載資源,或者您必須手動嵌入每個資源。我通常創建一個單獨的類只用於存儲嵌入式資產:

public final class SoundAsset 
{ 
    [Embed(source="/assets/sound/sound1.mp3")] 
    public static var SOUND1:Class; 

    [Embed(source="/assets/sound/sound2.mp3")] 
    public static var SOUND2:Class; 
}