Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 Actionscript 3-使用循环嵌入声音文件数组_Actionscript 3_Loops_Audio_Embedding - Fatal编程技术网

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

Actionscript 3 Actionscript 3-使用循环嵌入声音文件数组,actionscript-3,loops,audio,embedding,Actionscript 3,Loops,Audio,Embedding,我正在使用ActionScript3创建一个音乐游戏。为此,我为每台仪器记录了大约20个注释(也使用了Starling框架和FlashDevelop,尽管这些似乎与这个问题无关)。我目前正在为默认乐器加载注释,方法是指定每个文件路径并嵌入~20个声音中的每一个,如下所示: [Embed(source = "../assets/1.mp3")] public var SOUND_1:Class; var sound:Sound = new SOUND_1() as Soun

我正在使用ActionScript3创建一个音乐游戏。为此,我为每台仪器记录了大约20个注释(也使用了Starling框架和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...
然而,为了嵌入不同乐器的声音,我需要一些更模块化的东西。我已经编写了下面的循环,我希望它能够加载声音并将它们存储在一个对象数组中(我已经在应用程序中使用了这样的数组)。我遇到的问题是,当我使用这样的字符串时,嵌入标记似乎无法识别文件名的扩展名。如果我把一个文件名硬编码到嵌入行中,那么它可以很好地编译(尽管很明显每次都会加载大约20个相同声音的副本)

for(变量i:int=1;i

有没有办法不为每个可能的注释和工具手动键入每个文件名/文件路径?

使用[EMBED]标记在编译时嵌入资产。不能运行循环来嵌入资产,因为这是在运行时发生的

您可以在运行时使用加载程序加载资源,也可以像以前那样手动嵌入每个资源。我通常创建一个单独的类来存储嵌入式资产:

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;
}

用导入新声音效果的循环替换嵌入标记,使我可以根据需要迭代文件列表。以下是相关代码,它是用
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;
        }
for(变量i:int=1;i
为此,我还必须将我的“音频”文件夹(其中包含每个乐器的子文件夹)移动到main.SWF文件所在的bin目录中


我还必须从Flash和Feathers(Starling的附加UI框架)中导入一些附加包。我允许用户使用Feathers中的PickerList组件来选择一个新的仪器,因此上面的代码中会出现相关的错误事件。

您可以在大多数IDE中编写脚本/批处理文件,通过使用循环或扫描目录来自动编写嵌入代码。FlashDevelop适合做那种事这应该是你的理想选择(尽管我从未使用过),你的方法不是模块化的,所以没有理由写它。
        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;
        }