Actionscript 3 - 使用循环嵌入声音文件数组

时间:2014-10-28 21:08:36

标签: actionscript-3 loops audio embedding

我正在使用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;
        }

如果不为每个可能的音符和乐器手动输入每个文件名/文件路径,有没有办法解决这个问题?

2 个答案:

答案 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组件选择一个新工具 - 因此上面代码中的相关错误事件。