2010-03-07 2 views
0

Я пытаюсь создать экземпляр пучка звуков, создав строковый массив, содержащий путь к файлу каждого файла (или имя).Actionscript Загрузка/вызывание звука из String Array

var soundByName:Object = {}; 
var channelByName:Object = {}; 
var soundName:String; 
var channelName:String; 
loadSounds(); 

function loadSounds():void 
    { 
    var files:Array = new Array("sound1.mp3", "sound2.mp3"); //etc. 
    for (var i:int = 0; i < files.length; i++) 
     { 
     soundName = files[i]; 
     soundByName.soundName = new Sound(); 
     soundByName.soundName.addEventListener(Event.COMPLETE, sound_completeHandler); 
     soundByName.soundName.addEventListener(IOErrorEvent.IO_ERROR, sound_ioErrorHandler); 
     soundByName.soundName.load(new URLRequest(soundName)); 
     } 
    } 

function sound_completeHandler(e:Event):void 
    { 
    channelName = e.currentTarget.name; 
    channelByName.channelName = new SoundChannel(); 
    } 

function sound_ioErrorHandler(e:IOErrorEvent):void 
    { 
    trace("Failed To Load Sound:" + e.currentTarget.name); 
    } 

тогда называлась так:

//Stop a sound 
channelByName["sound1.mp3"].stop(); 

//Play a sound 
channelByName["sound2.mp3"] = soundByName["sound2.mp3"].play(); 

мой текущий код содержит ошибку из функции sound_completeHandler() о том, что свойство «имя» не было найдено. я не могу понять, как добавить это свойство имени, или как еще ссылаться на e.currentTarget.

ответ

2

Ваш код не так в 3-х частей:

  • soundByName является объектом, и вы делаете soundByName.soundName=new Sound() => вы создаете поле с именем SoundName в soundByName. Используйте soundByName[soundName]=new Sound();, которые означают создание поля с именем, взятым из переменной coundName.

  • Вы делаете то же самое с channelByName использовать channelByName[channelName]=value;

  • Затем вы хотите связать soundChannel от вашего имени, он не может работать Sound объект не имеет такого поля. Используйте словарь, в котором вы будете ассоциировать звук с именем.

    var nameBySound:Dictionary = new Dictionary(); 
    var soundByName:Object = {}; 
    var channelByName:Object = {}; 
    loadSounds(); 
    
    function loadSounds():void { 
        var files:Array = ["sound1.mp3", "sound2.mp3"]; //etc. 
        for (var i:int = 0; i < files.length; i++) { 
        var soundName:String = files[i]; 
        var sound:Sound=new Sound(); 
        nameBySound[sound] = soundName; 
        soundByName[soundName] = sound; 
        sound.addEventListener(Event.COMPLETE, sound_completeHandler); 
        sound.addEventListener(IOErrorEvent.IO_ERROR, sound_ioErrorHandler); 
        sound.load(new URLRequest(soundName)); 
        } 
    }                   
    
    function sound_completeHandler(e:Event):void {       
    var soundName:String=nameBySound[e.currentTarget];      
    channelByName[soundName] = new SoundChannel();       
    }                   
    
    function sound_ioErrorHandler(e:IOErrorEvent):void { 
    trace("Failed To Load Sound:" + nameBySound[e.currentTarget]); 
    } 
    
+0

спасибо. это хорошо работает. я хотел прочитать о классе словаря. по-вашему, как вы думаете, мой подход является хорошим способом загрузки/вызова многих звуков? – TheDarkIn1978

+0

Ну, вы можете, например, использовать только один словарь, чтобы поместить всю информацию в (имя, звук, звуковой канал). Это зависит также от использования вами кода. – Patrick

+0

Спасибо за этот пример Патрик. – daidai

Смежные вопросы