Экран загрузки
onClipEvent(load) {
// Определяем размер файла.
totalFileSize
=
_root.getBytesTotal();
// Прячем полосу загрузки.
this
._xscale
=
0
;
}
onClipEvent(enterFrame) {
// Выясняем, сколько байт уже загружено.
bytesLoaded
=
_root.getBytesLoaded();
// Преобразуем это значение в величину от 0 до 1.
amountLoaded
=
bytesLoaded
/
totalFileSize;
// Преобразуем полученное значение в величину от 0 до 100.
percentLoaded
=
int(
100
*
amountLoaded);
// Определяем масштаб полосы загрузки.
this
._xscale
=
percentLoaded;
// Устанавливаем текстовое поле в основной временной шкале.
_root.loadingMessage
=
percentLoaded
+
"%"
;
// Проверяем, все ли уже загружено,
if
(amountLoaded
>
=
1.0
) {
_root.gotoAndStopt
"complete"
);
}
}
Просмотрите ролик Loaderl.fla, чтобы понять, как работает приведенный код. Загрузка выполняется в первой сцене, а остальная часть ролика – во второй. Когда пользователь щелкает по кнопке Play (Начать игру), с помощью команды play() ролик переходит от кадра "complete" к последующим.
Обратите внимание, что если вы откроете swf-файл Loaderl.fla и просмотрите его во Flash, то увидите немногое. С вашего локального жесткого диска ролик грузится слишком быстро, чтобы можно было увидеть экран загрузки. Вам нужно разместить файл на вашем Web-сайте, а затем просмотреть его с помощью браузера.
Намного проще все-таки использовать возможность Flash эмулировать модемное соединение. В меню окна предварительного просмотра выберете View › Show Streaming (или нажмите CTRL + Enter) и ролик будет отображаться так же, как если бы он загружался по модемному, то есть очень медленному соединению. Пропускную способность этого виртуального соединения вы можете установить, выбрав пункт меню Debugging в окне предварительного просмотра.
Сложные экраны загрузки
Исходный файл: Loader2.fla.
На рис. 17.3 видно, что в текстовом поле отображается величина 63%. Вместо такого метода измерения можно сообщать пользователю, сколько байт уже загружено и каков размер всего ролика. Для этого нужно изменить значение loadingmessage, записав следующее:
_root.loadingmessage
=
int(bytesLoaded
/
1000
)
+
"kb/"
+
int(totalFileSize
/
1000
)
+
"kb"
;
Тогда вместо 63% вы увидите 90 Kb/143 Kb, что лично мне больше нравится.
Выполняя несложные математические вычисления, вы можете сообщить пользователю, как быстро идет загрузка. Для этого нужно создать переменные, в которых будет храниться количество загруженных байт и время на их загрузку. Теперь вы можете определить скорость загрузки, разделив первую величину на вторую. Это позволит спрогнозировать, сколько времени займет загрузка всего ролика.
Следующий код представлен в ролике Loader2.fla. Он похож на предыдущий фрагмент кода, только здесь на экран выводится еще и дополнительная информация: скорость загрузки и оставшееся время.
onClipEvent(load) {
// Получаем исходную информацию.
totalFileSize
=
_root.getBytesTotal();
startTime
=
getTimer();
startBytes
=
_root.getBytesLoadedf);
// Прячем полосу загрузки,
this
._xscale
=
0
;
}
onClipEvent(enterFrame) {
// Выясняем, сколько байт уже загружено.
bytesLoaded
=
_root.getBytesLoaded();
// Преобразуем это значение в величину от 0 до 1.
amountLoaded
=
bytesLoaded
/
totalFileSize;
// Преобразуем полученное значение в величину от 0 до 100.
percentLoaded
=
int(
100
*
amountLoaded);
// Определяем масштаб полосы загрузки.
this
._xscale
=
percentLoaded;
// Определяем скорость загрузки.
timeSoFar
=
getTimer()
-
startTime;
speed
=
bytesLoaded
/
timeSoFar;
// Выясняем, сколько времени осталось до конца загрузки.
bytesLeft
=
totalFileSize
-
bytesLoaded;
timeLeft
=
(bytesLeft
/
speed)
/
1000
;
// Преобразуем полученное значение в величину с одной цифрой после запятой.
speed
=
int(
10
*
speed)
/
10
;
// Устанавливаем текстовые поля.
_root.bytesMessage
=
int(bytesLoaded
/
1000
)
+
"kb/"
+
int(totalFileSize
/
1000
)
+
"kb"
;
_root.speedMessage
=
speed
+
"k/sec"
;
_root.timeMessage
=
int(timeLeft)
+
" seconds remaining"
;
}
Поскольку мы округлили значение timeLeft до целого числа, то в течение последней секунды загрузки в соответствующем окне будет отображаться ноль. Если вас не устраивает такое положение дел, то вы можете округлить это значение до одного или большего количества знаков после запятой.
// Проверяем, все ли уже загружено.
if
(amountLoaded
>
=
1.0
) {
_root.gotoAndStop(
"complete"
);
}
Другие типы экранов загрузки
Только что рассмотренные экраны загрузки – стандартные. Кроме них существует множество других вариантов. Самый простой: можно отображать только статический кадр с надписью "Loading, Please Wait…" (Идет загрузка, пожалуйста, подождите…). Когда загрузка будет завершена, ролик просто перейдет следующему кадру.
Этот вариант можно усложнить и поместить какую-либо повторяющуюся анимацию в кадр.
Еще более сложный вариант: каждый кадр будет отображать различные этапы загрузки. Например, будет собираться некая картинка: чем ближе загрузка будет подходить к концу, тем более целостным будет становиться изображение.
Возможно, для создания таких экранов загрузки функции getBytesTotal () и getBytesLoaded () не понадобятся. Вместо них можно воспользоваться функцией ifFrameLoaded (), чтобы узнать, загружены ли все графические объекты определенного кадра. Эта функция пригодится, если вы хотите, чтобы пользователь начал какую-то часть игры, но не смог продолжить до тех пор, пока необходимые кадры не будут готовы.
Но лучше сделать время загрузки полезным для игрока. Например, поместить в кадр руководство к игре. Вместо того чтобы просто сидеть и смотреть, как заполняется полоса загрузки, игрок сможет узнать полезную и необходимую для него информацию.