Продолжаю тему простых прелоадеров в стиле «code only», но на этот раз будем делать индикатор загрузки для проектов на ActionScript 3.0 в среде разработки Adobe Flash. Итак, сразу переходим к делу.
Код ActionScript 3.0:
/*
устанавливаем значение переменных
*/
var w:uint = 200; // ширина прелоадера
var h:uint = 10; // высота прелоадера
var colorFon:uint = 0xcccccc; // цвет фона прелоадера
var color:uint = 0x333333; // цвет индикатора загрузки
/*
останавливаем воспроизведение флеш-ролика в первом кадре
*/
stop();
/*
рисуем контейнер прелоадера
*/
var preloaderContainer:Sprite = new Sprite();
preloaderContainer.graphics.lineStyle(1,color,1);
preloaderContainer.graphics.beginFill(colorFon,1);
preloaderContainer.graphics.drawRect(0,0,w,h);
preloaderContainer.graphics.endFill();
addChild(preloaderContainer);
/*
помещаем наш прелоадер на середину флеш-ролика
*/
preloaderContainer.x = (stage.stageWidth - w) / 2;
preloaderContainer.y = (stage.stageHeight - h) / 2;
/*
рисуем индикатор загрузки
*/
var band:Sprite = new Sprite();
band.graphics.beginFill(color,1);
band.graphics.drawRect(0,0,w,h);
band.graphics.endFill();
preloaderContainer.addChild(band);
/*
в каждом новом кадре проверяем объём загруженной информации и на основе этой информации изменяем индикатор загрузки
*/
addEventListener(Event.ENTER_FRAME, onEnterFrames);
function onEnterFrames(event:Event)
{
var bLoaded:uint = loaderInfo.bytesLoaded;
var bTotal:uint = loaderInfo.bytesTotal;
band.scaleX = bLoaded / bTotal;
/*
если флеш-ролик загружен полностью, то удаляем сам прелоадер и переходим на следующий кадр
*/
if (bLoaded >= bTotal)
{
removeChild(preloaderContainer);
removeEventListener(Event.ENTER_FRAME, onEnterFrames);
nextFrame(); // или gotoAndPlay(номер_кадра);
}
}
Вот и всё. Теперь просто копируем приведённый выше код и вставляем на временную шкалу первого (!) кадра вашего флеш-ролика (флеш-проекта под ActionScript 3.0).
Результат:
Примечание: здесь демонстрируется только внешний вид прелоадера и реальные данные не загружаются.
Конечно, вы в любой момент можете внести изменения в код: изменить ширину и высоту прелоадера, цвет фона и полосы загрузки. Для удобства все эти параметры вынесены отдельно в виде переменных и снабжены комментариями.
Особо замечу, что для корректной работы прелоадера необходимо, чтобы первый кадр (где и размещается наш код предзагрузчика) был пустым. Там не надо размещать каких-либо видимых объектов или звуков. Он должен быть абсолютно пустым. Дело в том, что индикатор загрузки начнёт свою работу только после того, как будет загружено содержимое первого кадра. Если в первом кадре много «тяжёлых» объектов, то отображение процесса загрузки может начаться и с 30%, и с 50%, а то и с 80% (были случаи:-(). Согласитесь, это не очень красиво :-)
Если же первый кадр пуст, а прелоадер всё равно начинает работу с большим опозданием, то, скорее всего, вы импортировали какие-то объекты в первый кадр. Проверить это просто. Идём в библиотеку проекта, наводим на объекты и вызываем контекстное меню объектов. В этом контекстном меню выбираем пункт «Свойства». Здесь вы можете наблюдать примерно следующее:

Вот вам и причина странной работы предзагрузчика. Объект (или объекты) экспортируются в первый кадр флеш-ролика, что вызывает задержку в работе прелоадера.
Я в таких случаях делал следующее: снимал галочку у пункта «Экспортировать в первый кадр» (не перепутайте с галочкой «Экспортировать для ActionScript»!), а сами объекты перетаскивал, например, на второй кадр флеш-ролика (основное содержимое при этом размещал на 3-м и последующих кадрах). Как правило, это помогало :-)
Впрочем, определённый объём информации в любом случае будет загружаться до появления на сцене прелоадера и с этим ничего не поделаешь (хотя, конечно, можно сделать внешний прелоадер...).