Flash / AS3 - предварительная загрузка или потоковая передача встроенных звуков

В настоящее время я работаю над проектом в flashdevelop и хочу добавить немного музыки. Я создаю игру, поэтому несколько файлов - это не вариант. В настоящее время все ресурсы встроены, и простой предварительный загрузчик загружает все (например, предварительный загрузчик flashdevelop по умолчанию). Я не хочу загружать музыку вначале, я бы предпочел транслировать ее, когда это необходимо.

Можно ли транслировать встроенные звуки? Если нет, можно ли встроить эти файлы в файл .swf и загрузить их позже?

Заранее спасибо!


person Job Talle    schedule 14.07.2013    source источник


Ответы (1)


Вы можете сделать две вещи. Один из них - начать загрузку звуков после завершения начальной загрузки и сохранить их, возможно, в Dictionary. Во-вторых, необходимо экспортировать RSL (общую библиотеку времени выполнения) из Flash, которая представляет собой SWF-файл, который затем можно загрузить и получить доступ ко всем определенным в нем классам.

В первом подходе вы в основном загружаете каждый такой звук и сохраняете его в словаре:

import flash.media.Sound;
import flash.events.Event;
import flash.net.URLRequest;
import flash.utils.Dictionary;

var mSounds:Dictionary = new Dictionary();

function loadSound(url:String, soundName:String)
{
    var sound:Sound = new Sound();
    sound.addEventListener(Event.COMPLETE, onSoundLoadComplete);
    sound.load(new URLRequest(url));

    function onSoundLoadComplete(e:Event):void
    {
        sound.removeEventListener(Event.COMPLETE, onSoundLoadComplete);
        trace(soundName,"Sound Loaded");

        mSounds[soundName] = sound; // save it to dictionary

        // then you can load it from dictionary 
        // using the name you assigned
        if(mSounds["crystalised"])
            (mSounds["crystalised"] as Sound).play();
    }
}


loadSound("C:\\Users\\Gio\\Desktop\\Crystalised.mp3", "crystalised");

Во втором подходе вам нужно сделать больше шагов, но вы загрузите его один раз. Я перечислю шаги здесь:

  1. Создать новый Flash-документ (FLA)
  2. Импортируйте все нужные звуки в библиотеку
  3. В меню свойств каждого звука выберите вкладку ActionScript и установите флажок «Экспорт для общего доступа во время выполнения» и введите имя выходного SWF-файла «Экспорт
  4. После публикации этого FLA-файла вы можете загрузить его в свое приложение или игру и использовать следующим образом:

    import flash.display.Loader;
    import flash.system.LoaderContext;
    import flash.system.ApplicationDomain;
    import flash.system.SecurityDomain;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.media.Sound;
    import flash.utils.getDefinitionByName;
    
    function loadRSL(url:String):void
    {
        var loader:Loader = new Loader();
        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
    
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onRSLLoadComplete);
        loader.load(new URLRequest(url), context);
    
        function onRSLLoadComplete(e:Event):void
        {
            loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onRSLLoadComplete);
            trace("RSL Loaded");
    
            // creating a new instance of the sound which is defined in RSL
            var soundClass:Class = getDefinitionByName("Crystalised") as Class;
            var sound:Sound = (new soundClass() as Sound);
            sound.play();
        }
    }
    
    loadRSL("SoundLibrary.swf");
    
person Gio    schedule 15.07.2013
comment
Спасибо за четкое объяснение! Кажется, что этого нельзя сделать с одним SWF? - person Job Talle; 15.07.2013
comment
Нет, это единственные способы, о которых я знаю. Если вы поместите все в один SWF-файл, он будет загружен одновременно, поскольку это один файл, загружаемый на веб-страницу. - person Gio; 15.07.2013