我正在使用Actionscript 3创建一个音乐游戏。为此我已经为每个乐器记录了大约20个音符(也使用Starling Framework和FlashDevelop,尽管这些可能与这个问题无关)。我目前正在为默认乐器加载音符,方法是指定每个文件路径并嵌入~20个声音中的每一个:
[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 :(得分:0)
[EMBED]标签用于在COMPILE时嵌入资产。您无法运行循环来嵌入资源,因为这会在运行时发生。
您可以使用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;
}
答案 1 :(得分:0)
用导入新声音效果的循环替换EMBED标签允许我根据需要迭代文件列表。下面是相关代码,它是更大方法的一部分,用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;
}
为此,我还必须将包含每个乐器的子文件夹的“audio”文件夹移动到我的主.SWF文件所在的bin目录中。
我还必须从Flash和Feathers(Starling的附加UI框架)导入一些额外的包。我允许用户使用Feathers中的PickerList组件选择一个新工具 - 因此上面代码中的相关错误事件。