Предзагрузка и метод attachSound
Конвертация win2koi средствами flash
В пятой версии Flash'а имеется новая возможность, которая, на мой взгляд, вызывает проблему у каждого, кто с ней сталкивался. Это метод attachSound, позволяющий управлять звуком при помощи ActionScript. Многие уже обнаружили, что при использовании метода attachSound прелоадер (preloader) работает неправильно и причина этого в следующем. При использование метода attachSound, Flash при экспорте помещает все залинкованные (linkage) звуки, в самое начало вашего Flash-клипа. По этой причине они загружаются до прелоадера, который не начинает работать до тех пор, пока они полностью не будут загружены, что обесценивает его использование. В этой статье FlashGuru излагает способ решения данной проблемы. (Хотя в статье речь идет только о методе attachSound, предлагаемое автором решение позволяет работать с attachMovie, т.е. линковать мувиклипы - Прим. переводчика)
По многим причинам имеет смысл размещать звук внутри отдельного SWF-файла и загружать его в первом кадре основного клипа. Одна из причин - создание зацикленного музыкального фона, воспроизводимого независимо от событий, происходящих в основном клипе.
Итак, создайте новый клип, в первый кадр которого поместите следующий скрипт:
function mysound(){ mysoundobj=new Sound(this) mysoundobj.attachSound("idname") mysoundobj.start() }
Этот скрипт является функцией, которую можно вызывать из любого места клипа, в любое время, и которая начнет воспроизводить звук, указанный, как "idname". Для создания этого идентификатора, выделите нужный звук в библиотеке, правым щелчком откройте контекстное меню и выберите опцию "Linkage...". В открывшемся окне диалога включите опцию "export this symbol" и укажите idname в качестве идентификатора. Эта функция активизируется по команде:
mysound()
Теперь созданный клип может содержать весь звук для вашего Flash-клипа. Создайте столько таких функций, сколько вам требуется. Фактически же, можно использовать одну функцию для подключения множества звуков, просто передавая ей нужные идентификаторы в качестве параметра, как делается в следующем скрипте:
function mysound(idname){ mysoundobj=new Sound(this); mysoundobj.attachSound(idname); mysoundobj.start(); }
Для активизации функции используется команда, содержащая в качестве параметра идентификатор залинкованного звука, который следует воспроизвести:
mysound("idname")
Сохраните созданный вами клип под именем "sound.fla" и экспортируйте его в SWF-файл "sound.swf" (File -> Export Movie)
Теперь займемся прелоадером. Внутри основного Flash-клипа создайте новый мувик (movieclip) и поместите его в тот кадр на главной линейке (Timeline), с которого хотите начать загрузку звука из библиотеки. Выделите этот мувик, откройте его ActionScript-окно и скопируйте в него следующий скрипт:
onClipEvent(load){ loadMovieNum("sound.swf",1); } onClipEvent(enterFrame){ percentloaded=Math.floor(_level1.getBytesLoaded() // <- это должно быть /_level1.getBytesTotal()*100); // <- одной строкой percentdisplay=percentloaded + "%"; if(percentloaded == 100 && !initialized){ _level1.mysound(); initialized=true; _visible=false; } }
Когда воспроизведение клипа достигнет этого мувика, он начнет грузить файл с именем "sound.swf" на первый уровень (_level1) клипа или любой другой уровень, который будет указан вами. Затем, в покадровом цикле (onСlipEvent(enterFrame)) определяется размер загруженной части в процентах. Если клип полностью загрузился и функция mysound() не вызывалась прежде, происходит ее вызов на основной линейке первого уровня (_level1), выставляется флаг в виде булевой переменной (initialized=true) и мувик становится невидимым.
Теперь, если вы хотите показывать внутри этого мувиклипа процент его загрузки, создайте текстовое поле, откройте панель "Text Options", задайте текстовому полю динамический тип и имя "percentdisplay". Если же не хотите отображать процентовку, удалите строку:
percentdisplay=percentloaded + "%"
Аналогично можно отображать не проценты, а количество загруженных байтов, добавляя соответствующий код внутрь обработчика onClipEvent(enterFrame). Также внутри этого мувиклипа можно создать какую-нибудь анимацию, воспроизводимую в процессе загрузки файла sound.swf и которую легко можно прекратить, обнулив _visiblity свойство этого мувика.
_visible=false
Теперь у вас есть возможность подгружать звук как и когда хотите!
Некоторые жалуются, что звук не подгружается никуда, кроме как на основную линейку клипа (_level0). Звуковой объект (new Sound()) имеет факультативный параметр, определяющий линейку, на которую он будет подгружаться. Эта линейка может быть мувиклипом, находиться на другом уровне или в корне (_root) клипа:
mysoundobj=new Sound(_root)
Если не указывать этот параметр, то по умолчанию звуковой объект будет создан в корне клипа (_level0). Именно поэтому в скрипте и используется параметр "this", в этом случае звуковой объект будет создан на той линейке, на которой выполняется этот скрипт.