Динамическое создание переменных в Actionscript 3.0? - PullRequest
1 голос
/ 02 марта 2010

Я загружаю несколько звуковых файлов и хочу проверять ошибки при каждой загрузке. однако вместо того, чтобы программировать каждый с их собственными функциями завершения / ошибки, я бы хотел, чтобы все они использовали одинаковые функции обработчика завершения / ошибки.

успешно загруженный звук должен создать новую переменную звукового канала, в то время как неудачно загруженный звук произведет простую трассировку с названием звука, который не удалось загрузить. однако для этого мне нужно динамически создавать переменные, которые я еще не выяснил, как это сделать.

вот мой код для моих полных и ошибочных функций:

function soundLoadedOK(e:Event):void
 {
 //EX: Sound named "explosion" will create Sound Channel named "explosionChannel"
 var String(e.currentTarget.name + "Channel"):SoundChannel = new SoundChannel();
 }

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

- = - = - = - = - = - = - = - = - ОБНОВЛЕНО (RE: viatropos) - = - = - = - = - = - = - = - = -

не могу найти ошибку.

TypeError: Ошибка # 1009: Невозможно получить доступ к свойству или методу пустой ссылки на объект. at lesson12_start_fla :: MainTimeline / loadSounds () at lesson12_start_fla :: MainTimeline / frame1 ():

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

function loadSounds():void
{
    var files:Array = ["robotArm.mp3", "click.mp3"];
    var i:int = 0;
    var n:int = files.length;
    for (i; i < n; 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(event:Event):void
{
    channelName = event.currentTarget.id3.songName;
    channelByName[channelName] = new SoundChannel();
}

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

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Вы можете сделать это несколькими способами:

  1. Хранение ваших SoundChannels в массиве. Хорошо, если вы заботитесь о заказе или не хотите получать их по имени.
  2. Хранение SoundChannels под любым именем в Object. Хорошо, если вы хотите легко получить имя. Обратите внимание, что класс Object может хранить только ключи ({key:value} или object[key] = value), которые являются строками. Если вам нужны объекты в качестве ключей, используйте flash.utils.Dictionary, это прославленный хеш.

Вот пример, демонстрирующий использование массива и объекта.

var channels:Array = [];
// instead of creating a ton of properties like
// propA propB propC
// just create one property and have it keep those values
var channelsByName:Object = {};

function loadSounds():void
{
    var files:Array = ["soundA.mp3", "soundB.mp3", "soundC.mp3"];
    var sound:Sound;
    var soundChannel:SoundChannel;
    var i:int = 0;
    var n:int = files.length;
    for (i; i < n; i++)
    {
        sound = new Sound();
        sound.addEventListener(Event.COMPLETE, sound_completeHandler);
        sound.addEventListener(IOErrorEvent.IO_ERROR, sound_ioErrorHandler);
        sound.load(files[i]);
    }
}

function sound_completeHandler(event:Event):void
{
    // option A
    var channelName:String = event.currentTarget.id3.songName;
    // if you want to be able to get them by name
    channelsByName[channelName] = new SoundChannel();

    // optionB
    // if you just need to keep track of all of them,
    // and don't care about the name specifically
    channels.push(new SoundChannel())
}

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

Дайте мне знать, если это сработает.

0 голосов
/ 10 марта 2010
//Load Sounds
var soundDictionary:Dictionary = new Dictionary();
var soundByName:Object = new Object();
var channelByName:Object = new Object();

loadSounds();

function loadSounds():void
    {
    var files:Array = ["robotArm.mp3", "click.mp3"]; //etc.
    for (var i:int = 0; i < files.length; i++)
        {
        var soundName:String = files[i];
        var sound:Sound=new Sound(); 
        soundDictionary[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=soundDictionary[e.currentTarget];                      
    channelByName[soundName] = new SoundChannel();                          
    }

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

//Play Sound
channelByName["robotArm.mp3"] = soundByName["robotArm.mp3"].play();

//Stop Sound
channelByName["robotArm.mp3"].stop();
...