Flash:
Загрузка переменных
Часто требуется "научить" flash-ролик брать информацию извне, то есть из какого-либо файла. Этим файлом может быть как простой .txt-шник, где записана какая-либо информация, так и .cgi скрипт, который формирует переменные для flash "на лету". Отсюда все: от счетчиков и гостевых книг до бесконечности.
Файл с flash - переменными не отличается особой сложностью и может редактироваться обычным notepad'ом. Его синтаксис таков:
name=AMDmi3&company=IO+Labs&...
где name, company - имена переменных, а AMDmi3 и IO+Labs - соответственно их значения.
Заметьте, что формат файла переменных схож с результатом, возвращаемым html - формой: пары переменная-значение разделяются символом &qout;&&qout; и имя отделяется от значения знаком &qout;=&qout;. Также пробеты заменяются на знак &qout;+&qout;, а все символы за исключением букв латинского алфавита и цыфр - знаком проценти и их шестнадцатеричным кодом. Хотя менять пробелы на плюсы не обязательно.
Для загрузки во Flash 5.0 имеется функция loadVariablesNum ( url, level, method ), где url - путь к файлу или скрипту, содержащему или генерирующему переменные, level - уровень в ролике, в который загружаются переменные (по умолчанию - 0) и method - необязательный параметр, который, если он присутствует, принимает значения "POST" или "GET" (с кавычками) и определяет способ, которым скрипту будут отправляться текущие значения переменных. Так как в нашем случае происходит всего лишь загрузка переменных, причем всего лишь из файла, этот параметр будет опущен.
После вызова этой функции flash незамедлительно начнет загружать переменные, причем работа ролика не будет прервана на время загрузки. Тут и кроется основная проблема: в силу специфики flash, узнать, сколько байт файла уже загрущено, нефозможно. Это не критично для, допустим, счетчика: ведь объем загружаемой информации невелик, и значение переменной будет обновлено сразу после ее загрузки. В случае же с большими объемами данных ситуация усугубляется: пользователь не сможет узнать, загрузились ли значения, или еще нет.
Поэтому в ход идет небольшая хитрость: в конце файла с переменными записывается еще одна переменная, например loaded=1. В этом случае процесс загрузки выглядит так: перед ее началом переменной loaded присваивается значение 0. Далее вызывается loadVariablesNum, и ролик зацикливается, показывая надпись "loading..." и каждый раз проверяя значение переменной loaded. Теперь, когда файл загрузится полностью, значение переменной loaded изменится на "1", что будет сигналом ролику выполнять какие-либо действия дальше, исходя из того, что все переменные загружены.
Вот, теория окончена, дело за созданием ролика.
Для простейшего загрузчика переменных наряду с интерфейсом понадобится 3 кадра и слой actions.
А интерфейс пусть будет состоять из кнопки, поля типа dynamic text, связаным с переменной status и еще одного поля типа dynamic text, связаным с переменной testvar.
В actions для первого кадра напишем:
// Текущее состояние - "готов к загрузке переменных"
status="Ready"
// 0 значит что в данный момент переменные не загружаются
loading=0;
// Ждем нажатий на кнопки
stop ();
Actions для второго кадра:
if(loading==0)
{
// если в данный момент переменные не загружаются...
status="Ready";
gotoAndStop(1);
}
else if(loading==1)
{
// а если загружаются
status="Loading variables..."; // так и напишем
}
3-й кадр - всего лишь одна строчка
// продолжить воспроизведение ролика
gotoAndPlay (2);
И, самое главное, actions для кнопки
on (release)
{
// начать загрузку
loadVariablesNum ("variables.txt", 0);
loading=1;
play ();
}
Нетрудно понять ход работы ролика. Содержимое файла variables.txt следующее: testvar=hello, world!&loading=0
- Ставится флажок loading=0 (переменные не загружаются) и ролик останавливается, ожидая нажатия на кнопку
- Пользователь нажимает на кнопку. Ставится флажок loading=1 (идет загрузка) и ролик запускается, нереходя ко второму кадру.
- Происходит проверка переменной loading. Так как она все еще равна 1 (переменные еще не загрузились), надпись в строке состояния остается на месте (Loading...). Ролик "зацикливается" между 2-м и 3-м кадрами
- То же самое...
- То же самое...
- ... пока, наконец, переменные ен загрузятся. Тогда, наряду с переменной testvar загрузится и переменая loading=0
- "Проходя" через 2-й кадр, ролик уже идет по другой ветви IF, сообщая, что переменные загружены и снова останавливаясь на первом кадре.
Наглядно процесс загрузки можно посмотреть прямо сейчас, как и скачать тестовую сцену для Flash 5.0, показывающую обработку немного более сложной информации.
Reloader
Иногда flash ролики занимают довольно прилично места, и, следовательно, грузятся довольно долго.
Человек по своей природе не любит ждать, а закоренелый интернетчик тем более, тем более если неизвестно,
сколько ждать осталось. Люди даже готовы ждать дольше, зная, сколько еще ролик будет грузиться.
Поэтому логично будет сделать preloader - небольшой элемент ролика, который будет показывать
в виде индикатора - полоски, какой процент ролика загружен, а после полной загрузки автоматически
начнет воспроизведение ролика.
Возьмите уже имеющийся ролик. Нам понадобятся три какдра в его начале, поэтому сужествующие кадры нужно сдвинуть, и добавить следующие слои:
- actions - для скриптов, обеспечивающих работу загрузчика.
- preloader screen - просто оформление экрана загрузчика. Обычно тут указывается размер и название ролика, его автор.
- progress bar - в этом слое будет двигаться полоска загрузчика.
- progress bar mask - маска для предедущего слоя.
В слое actions все три кадра должны быть ключевыми, дабы в кажный записать свой скрипт.
В других слоях все три кадра будут одинаковые.
Начать можно, пожалуй, с добавления символа (Insert - New Symbol) - Movie Clip'а с названием
progressbar. Редактируем этот символ - нам нужна полоска размеров желаемого индикатора загрузки.
Причем правый край полоски должен совпадать с крестиком - началом координат для клипа.
Далее помещаем этот клип в слои progress bar и progress bar mask. Причем в обоих слоях символ надо разместить так, как
вы хитите расположить индикатор загрузки. Для символа в слое progress bar нужно задать имя progressbar,
чтобы обращаться к нему при движении полоски (это производится в окне instance (Window - Pandels - Instance в графе Instance).
Далее переходим к редактированию скриптов, управляющих загрузчиком.
Cлой actions, 1-й кадр:
// Координата левого края полоски
left=10;
// Изначальные координаты полоски
coord=left;
// %% Загруженного ролика
percent=0;
// Длина полоски
width=530;
2-й кадр:
// Считаем, сколько % ролика загружено
percent=_framesloaded/_totalframes*100;
// Cчитаем координаты полоски
coord=left+_framesloaded/_totalframes*width;
// Перемещаем полоску
setProperty("progressbar",_x,coord);
// Если ролик загрузился, то начать его воспроизведение с первого кадра
if(percent==100) { gotoAndPlay (4);}
3-й кадр:
// Продолжить загрузку (перейти ко 2-му кадру)
gotoAndPlay (2);
Теперь осталось только оформить экран загрузки и включить режим mask для слоя
progress bar mask.
Напоследок скажу, что, так как в flash роликах размер кадров обычно распределен очень неоднородно,
то именно такая полоска будет наиболее наглядно показывать процесс загрузки, хотя можно сделать и
текстовый индикатор.
А тестировать работы загрузчика можно и вне интернета, достаточно во Flash при просмотре ролика
(Ctrl+Enter) нажать Ctrl+Enter еще раз, чтобы увидеть процесс загрузки ролика при скорости интернет -
соединения.
|