Тема 16. Всякая всячина


  1. Сохранение данных на диске
  2. Компоненты
  3. Проекторы
  4. Отладчик
  5. Flash и PowerPoint

1. Сохранение данных на диске

Поскольку Flash часто применяется в Интернете, в целях безопасности программа не имеет возможности записать данные на диск. Однако данные все-таки можно сохранить, используя так называемые разделяемые объекты (shared objects). Посмотрим пример их использования. В ролике, показанном ниже, для входа в основную часть фильма нужно ввести кодовое имя и пароль. Если пользователя нет в базе, он должен сначала зарегистрироваться и зайти со своим именем и паролем.

Данные запоминаются в специальном файле на диске, и при повторном запуске можно входить с введенными ранее именем и паролем. Этот файл имеет расширение *.sol и хранится в папке Documents and Setting\User, где User — это имя пользователя.

Для того, чтобы открыть файл с именем userBase.sol, нужно использовать метод SharedObject.getLocal (получить локальную ссылку):

v = SharedObject.getLocal ( "userBase" );
Теперь обращаться к объекту можно через переменную v. Все данные, которые нужно сохранить, рассматриваются как свойства поля data. Например, проверить существование переменной base можно так
if ( v.data.base != undefined )
     trace ( "Нашли!" );
else trace ( "Нету..." );
Напомним, что undefined обозначает неизвестную (неопределенную) величину. В программе можно добавить новые элементы к полю data:
v.data.x = 12;
Удалить эту переменную можно с помощью оператора delete:
delete v.data.x;
Если нужно очистить все переменные, используют метод clear:
v.clear();
Разделяемый объект автоматически записывается на диск при завершении работы ролика. С помощью метода flush можно сделать это немедленно:
v.flush();
Важно помнить, что разделяемые объекты, созданные в каком-либо фильме, не могут использоваться другими фильмами, даже выполняющимися на том же компьютере.
  С помощью разделяемых объектов можно сохранять на компьютере пользователя счетчик посещений, личные настройки, информацию о пройденных уровнях игры и т.д.
к началу К началу страницы

2. Компоненты

Обзор

Чтобы не тратить время на разработку элементов интерфейса (кнопки, поля ввода и т.д.), можно использовать готовые компоненты, которые поставляются вместе с Flash. К ним относятся, например, Для того, чтобы добавить компоненты на сцену, нужно вывести на экран панель Components (меню Window—Components или клавиши Ctrl+F7). Когда откроется эта панель, вы увидите 4 папки: Мы будем работать только с компонентами из группы User Interface.

Для настройки компонентов используются параметры — общедоступные свойства объектов. Их можно читать и изменять с помощью панели Parameters в нижней части экрана, а также из программы на ActionScript.

Компоненты хранятся в библиотеке в виде скомпилированных клипов (то есть, нельзя «заглянуть» внутрь и посмотреть, как они устроены). Их можно только перетащить из библиотеки на сцену и настроить свойства с помощью панели Parameters.

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

Компоненты существенно упрощают создание интерфейса стандартного типа, но сильно увеличивают объем файла. Например, ролик, показанный в начале урока, занимает 140 Кб. Поэтому их используют тогда, когда размер файла не играет особой роли. В профессиональных роликах они встречаются достаточно редко.

Проект

  Откройте файл PRACTICE\16\register.fla и изучите его.
В единственном слое Фон два ключевых кадра (с номерами 1 и 10), их фоновые рисунки уже помещены на сцену. Логика работы будущего фильма следующая
  Создайте новые слои Компоненты, Программа и Метки. В слое Метки добавьте ключевые кадры в кадрах 10, 20 и 30. С помощью панели Properties дайте кадрам 1, 10 и 20 метки start, register и main.
  В слое Программа вставьте ключевые кадры с номерами 10 и 20. В кадр 1 добавьте команду
 stop();
а в кадр 20 (начало основной части) — загрузку внешнего ролика
 loadMovieNum ( "cube.swf", 0 );
Второй параметр функции loadMovieNum — это уровень, в который загружается новый фильм. Уровень 0 — это _root, поэтому текущий фильм будет просто заменен на новый.

Текстовые поля

Текстовые поля — это TextInput (для ввода одной строки) и TextArea (многострочный текст). С помощью свойства (параметра) — text можно читать и записывать содержимое поля.

Параметр password для TextInput устанавливается в true, если нужно ввести пароль, вместо введенных символов будут отображаться звездочки.

У многострочного текста TextArea есть еще логические параметры

  Закройте окно Actions (F9) и перейдите в кадр 1 слоя Компоненты. Откройте панель Components и из группы user Interface перетащите на поле два компонента TextInput для ввода имени и пароля. Первому из них присвойте имя name, а второму — pass.
Если в нижней части экрана нет панели Parameters, ее нужно вывести на экран, выбрав пункт меню Windows—Properties—Parameters.
  Выделите поле pass, перейдите на панель Parameters и измените значение параметра password (пароль) на true.
Если посмотреть в окно библиотеки, вы увидите, что туда добавлены элементы TextInput и TextArea типа Compiled Clip (скомпилированный клип). Они существенно влияют на размер получаемого SWF-файла.

Кнопки

  Добавьте кнопку (компонент Button) ниже полей ввода и присвойте ей имя enter и задайте ее параметру label значение Войти.
Используя параметр icon, можно построить кнопку с рисунком и надпись. В поле icon нужно записать кодовое имя символа из библиотеки (пункт Linkage контекстного меню), а параметр labelPlacement определяет положение надписи относительно рисунка.

Если присвоить параметру toggle значение true, кнопка ведет себя как кнопка с фиксацией, то есть после щелчке она остается в нажатом положении, а после повторного щелчка возвращается в «ненажатое». В этом случае параметр selected определяет начальное состояние кнопки.

Форматирование

Форматирование компонентов (изменение внешнего вида) возможно только из программы. Для этого используется метод setStyle в следующей форме
компонент.setStyle ( параметр, значение );
В качестве параметров можно использовать, например, Полный список параметров стиля для каждого компонента можно посмотреть в справочной системе.

Общие свойства всех компонентов можно установить с помощью метода setStyle глобального объекта style. Например строка

_global.style.setStyle("fontSize", 18);
устанавливает размер шрифта 18 по умолчанию.
  С помощью панели Properties увеличьте высоту всех элементов до 26 (выделяя их поочередно). Добавьте в кадр 1 слоя программы код
 _global.style.setStyle("fontSize", 18);
 enter.setStyle("fontSize", 16);
Проверьте работу клипа.

Теперь добавим в нижнюю часть сцены текст с сообщением об ошибке, но сначала скроем его, изменив свойство _visible.

  Добавьте в нижнюю часть сцены динамическую текстовую надпись (Dynamic Text) "Невозможно войти в систему. Неверное имя или пароль.". Присвойте надписи имя errInfo. Установите шрифт Arial красного цвета, размер — 18 пунктов. На панели Properties выберите вариант Multiline (многострочный текст). Добавьте к коду кадра 1 строчку
 errInfo._visible = false;

Текст-ссылка

Для того, чтобы сделать метку-ссылку Регистрация, мы добавим новое динамическое текстовое поле и отформатируем его с помощью HTML-кода. Чтобы использовать эту возможность, нужно включить для текстового поля режим Render Text as HTML (кнопка на панели Properties).

Напомним, что все, что находится в блоке

<U>...</U>
подчеркивается, а содержимое блока
<A HREF='xxx'>...</A>
становится ссылкой на документ с именем xxx.

Для того, чтобы перейти на нужный кадр внутри документ, мы используем специальный протокол asfunction:

<A HREF='asfunction:gotoAndStop,register'>...</A>
Это означает, что после щелчка на этой метке выполняется команда
gotoAndStop ( "register" );

Заметим, что если бы мы работали со статическим текстом, можно было бы просто добавить текст

asfunction:gotoAndStop,register
в поле ссылки справа от значка на панели Properties. Однако такая ссылка не подчеркивается.
  Создайте динамическое текстовое поле Регистрация. Настройте его шрифт, присвойте имя regText и разместите справа от кнопки. Включите режим Render Text as HTML (кнопка на панели Properties). Добавьте к кадру 1 код
 regText.htmlText = "<U><A HREF='asfunction:gotoAndStop,register'>"
                  + "Регистрация</A></U>";
Проверьте работу ссылки.
Поскольку мы используем текст с HTML-форматированием, нужно записывать его не в свойство text, а в свойство htmlText. Слово Регистрация подчеркивается, при щелчке на нем выполняется переход на метку register.

Работа с базой пользователей

Мы будем хранить базу пользователей как разделяемый объект с именем userBase. Внутри этого объекта массив base хранит структуры (объекты с несколькими полями) с информацией о пользователях. Поле name каждого элемента обозначает имя, а поле pass — пароль.

В начале работы фильма создадим ссылку v на объект userBase. Написанная ниже функция findUser принимает имя пользователя как параметр и возвращает его номер в базе или -1, если он не найден (база еще не создана или пользователь не регистрировался).

  Выделите кадр 1 слоя Программа и добавьте код
 v = SharedObject.getLocal("userBase");
 function findUser ( name ) {
   if ( v.data.base == undefined ) return -1;
   users = v.data.base;
   for(i=0; i<users.length; i++)
      if ( users[i].name == name ) return i;
   return -1;
 }
Если база не создана, значение v.data.base будет равно undefined, и функция возвращает -1. Для массива вводится имя users (чтобы сократить запись) и перебираются все его элементы. Если имя пользователя совпадает с именем в одном из элементов массива, возвращается его номер. Если весь массив проверен и совпадений не обнаружено, возвращается -1 (последняя строчка в функции).

Напишем еще одну функцию для проверки правильности ввода имени и пароля.

  Добавьте к кадру 1 код функции
 function checkPass ( name, pass ) {
   var no = findUser(name);
   if ( no < 0 ) return false;
   return (v.data.base[no].pass == pass);
 }
Функция принимает два параметра (имя и пароль) и возвращает true, если пользователь опознан, и false, если нет. Последняя строчка означает «определить истинность условия v.data.base[no].pass == pass и вернуть это значение как результат».

Теперь добавим код к кнопке Войти. Если пользователь не опознан, сообщение об ошибке (поле errInfo) становится видимым, иначе происходит переход к основной части фильма на метку main.

  Выделите кнопку Войти и добавьте к ней код
 on ( click ) {
   with ( _root ) {
     if ( ! checkPass(name.text, pass.text) )
          errInfo._visible = true;
     else gotoAndStop("main");
   }
 }
Проверьте, появляется ли сообщение об ошибке.
Здесь используется блок
with ( _root ) {
  ...
}
который говорит о том, что все имена элементов и функций относятся к главному монтажному столу, а не к компоненту-кнопке.

Регистрация

В окне регистрации нужно ввести все данные и после щелчка по кнопке добавить их в базу. Здесь применяются уже известные приемы — добавление компонентов и настройка их параметров с помощью панели Parameters и из программы.
  Перейдите в кадр 10 слоя Компоненты и создайте там пустой ключевой кадр (F7). Добавьте на сцену два элемента TextInput из панели компоненты для ввода имени и пароля, назовите их nameNew и passNew (панель Properties). Увеличьте высоту этих элементов до 26.
  Для ввода дополнительных сведений (О себе) добавьте многострочное текстовое поле TextArea и дайте ему имя memo.

Радиокнопки

Для выбора пола нужно добавить две радиокнопки (Radio Button). Это элементы выбора, то есть из них может быть включен только один, как при переключении каналов в радиоприемнике. Основные свойства радиокнопок:
  Добавьте две радиокнопки для выбора пола, дайте им имена male (мужской) и female (женский). С помощью панели Parameters присвойте им нужные метки (Label), одну и ту же группу (параметр groupName), сделайте, чтобы элемент male был выбран по умолчанию (параметр selected равен true).

Выпадающий список

Для выбора года рождения используем выпадающий список (ComboBox). Его свойство labels — это массив меток, которые отображаются на экране. После двойного щелчка по полю labels на странице Parameters открывается окно для ввода меток в диалоговом режиме.

С помощью кнопок и добавляются и удаляются элементы списка. Кнопки и перемещают выделенный элемент вниз и вверх соответственно. Щелкнув дважды на имени элемента, можно изменить его.
  Добавьте компонент ComboBox (выпадающий список) для выбора года рождения. Дайте ему имя year, немного уменьшите ширину и установите высоту 26. На панели Parameters в массив labels добавьте свой год рождения, предыдущий и следующий.
Для того, чтобы определить, какой элемент выбран, нужно проверить свойство selectedItem — ссылку на выбранный элемент. Тогда selectedItem.label — это метка выбранного элемента, а selectedItem.data — данные, которые могут быть записаны в массив-параметр data.

Выключатели

Элемент-переключатель CheckBox может быть включен или выключен независимо от других. Его основное свойство — selected — логическое значение, равное true, когда элемент включен.
  Под меткой Интересы добавьте 4 переключателя-флажка (CheckBox), дайте им имена int1, int2, int3 и int4, присвойте нужные метки (параметр Label).
Такие имена мы присваиваем для того, чтобы было удобно обращаться к компонентам в цикле, устанавливая их формат (см. далее).

Формат компонентов

  Добавьте кнопку Сохранить, установите ее по середине сцены, задайте высоту 26 и ширину 135. Присвойте кнопке имя save.
  Перейдите в кадр 10 слоя Программа и добавьте код для изменения формата элементов
 male.setStyle("fontStyle", "italic");
 female.setStyle("fontStyle", "italic");
 year.setStyle("fontWeight", "bold");
 for (i=1; i<=4; i++) {
   obj = _root["int"+i];
   obj.setStyle("fontFamily", "Courier New");
   obj.setStyle("color", 0xFF);
   obj.setStyle("fontWeight", "bold");
 }
Формат для всех выключателей CheckBox задается в цикле. Для них устанавливается шрифт Courier New размером 18, жирный, синего цвета.

Добавление пользователя

Для добавления пользователя в базу (разделяемый объект, ссылка на который хранится в переменной v) будем использовать функцию addUser, которую расположим в кадре 1. Она принимает один параметр — структуру userData, в которой хранятся все сведения о новом пользователе.
  Добавьте к коду кадра 1 функцию
 function addUser ( userData ) {
   if ( v.data.base == undefined )
      v.data.base = new Array();
   v.data.base.push ( userData );
   v.flush();
 }
Сначала проверяем, если вообще база, если ее еще нет, она создается. Затем новый элемент добавляется в конец массива с помощью метода push и сразу записывается на диск (v.flush).

После щелчка по кнопке Сохранить происходит событие click. В его обработчике нужно проверить, введены ли имя и пароль. Если да, в новый объект записываются все данные, вызывается функция addUser и выполняется переход на метку start.

  Выделите кнопку Сохранить и добавьте к ней обработчик
 on ( click ) {
   if ( _root.nameNew.text == "" ) return;
   if ( _root.passNew.text == "" ) return;
   var userData = new Object();
   with ( _root ) {
      userData.name   = nameNew.text;
      userData.pass   = passNew.text;
      userData.gender = male.selected;
      userData.info   = memo.text;
      userData.born   = year.selectedItem.label;
      userData.interest = Number(int1.selected) +
                          Number(int2.selected)*10 +
                          Number(int3.selected)*100 +
                          Number(int4.selected)*1000;
   }
   _root.addUser ( userData );
   _root.gotoAndStop("start");
 }
Проверьте работу фильма.
Обратите внимание на хранение значений четырех флажков в одном поле interest объекта userData. Каждое из четырех значений — логическое, при переводе в числовую форму с помощью преобразования типа Number(...) получаем 0 или 1 (соответственно для false и true). Таким образом, если все флажки включены, в поле interest будет записано число 1111, а если включены только 1-ый и 4-ый флажки — число 1001.

Зачетное задание

С практической точки зрения в этом ролике еще много недоработок. Например,
  Сделайте эти улучшения самостоятельно.
к началу К началу страницы

3. Проекторы

Проектор — это независимая программа, имеющая расширение *.exe. В программе Flash есть возможность сделать проектор, который будет независим от установленного Flash-проигрывателя.

Фактически в состав проектора включается не только Flash-ролик, но и проигрыватель, при этом объем файла значительно увеличивается, иногда до 2,5 Мб. Но это не страшно, если вы пишете программу (например, игру) для выполнения на локальном компьютере, а не через Интернет.

Проектор создается при публикации фильма через меню File—Publish. Предварительно нужно включить нужный режим в окне настройки File—Publish Settings.

  Выберите пункт меню File—Publish Setting (настройки публикации), перейдите на вкладку Formats и отметьте флажок Windows Projector. Затем создайте проектор, выбрав пункт меню File—Publish (клавиши Shift+F12). Проверьте, как работает проектор, запустив его из Проводника.
к началу К началу страницы

4. Отладчик

Введение

Отладка — это поиск и исправление ошибок в программе. Английское название debug означает «удаление жучков» (от bug — жучок, моль). Согласно легенде, при поиске неисправности в одном из первых компьютеров (MarkII) между контактами реле был обнаружен жучок, из-за которого машина не работала.

Простейший способ отладки — это трассировка (вывод значений переменных в разных точках программы, где есть подозрение на ошибку). В среде Flash трассировка выполняется с помощью оператора trace и мы это уже использовали.

В более сложных случаях необходим отладчик — специальная программа или программный модуль. Отладчик позволяет

Для того, чтобы разобраться с встроенным отладчиком Flash мы построим ролик с небольшим кодом.
  Создайте новый документ и сохраните его в папке PRACTICE\16 под именем debug.fla. Добавьте к кадру 1 код
 _global.a = 99;
 a = 1;
 b = 2;
 y = 20;
 var s: String = "Ку-ку!";
Здесь создается несколько переменных, одна из них, _global.a — глобальная, остальные — переменные главного монтажного стола _root (или переменные уровня 0, обозначаемого как _level0). Для переменной s явно указан тип: это символьная строка.
  Щелкните по значку в нижней части панели Actions, чтобы закрепить код кадра 1. Вставьте новый ключевой кадр в кадре 10 и добавьте к нему код
 function Sum ( a, c ) {
   var x = a + c;
   x = x + _root.a;
   x = x + _global.a;
   return x;
 }
 q = Sum ( b, y );
В этом кадре добавлена функция Sum, которая принимает два параметра. Эти параметры с именами a и c рассматриваются как локальные переменные.

Внутри функции создается локальная переменная x, «видимая» только в этой функции, в нее сразу записывается сумма аргументов.

Далее к этой сумме прибавляются переменная a главного монтажного стола и глобальная переменная с тем же именем. Для обращения к ним нужно указывать соответственно _root и _global, иначе будет использовано значение локальной переменной a.

Вообще говоря, если существует несколько переменных с одним именем (как в примере), программа сначала ищет локальную переменную, затем (если не нашла) ищет переменную текущего клипа (this.a), а затем — глобальную переменную.

Функция Sum вызывается в последней строке, в качестве параметров передаются значения b и y — переменные клипа _root.

Точки прерывания

  Перейдите к коду кадра 1, щелкнув по вкладке в нижней части панели Actions. Затем щелкните мышкой слева от номера строки 5 на синем фоне, чтобы там появилась красная точка.

Мы только что установили точку прерывания (breakpoint), на которой должно остановиться выполнение программы при отладке. Отметим, что при нормальном запуске (по Ctrl+Enter, не в отладочном режиме) она никак не влияет на проигрывание фильма.

Точки прерывания, установленные в окне Actions, сохраняются внутри FLA-файла. Чтобы снять точку прерывания, нужно просто щелкнуть еще раз на красной точке.

Отладчик

Для запуска фильма в отладочном режиме нужно выбрать пункт меню Debug—Debug Movie или нажать клавиши Ctrl+Shift+Enter.
  Сохраните документ. Запустите отладочный режим для созданного файла.
На экране появляется окно отладчика. Фильм остановлен, чтобы можно было установить точки прерывания. При запуске фильм будет останавливаться на каждой такой точке (одна уже была задана раньше).
  Щелкните по кнопке , чтобы начать выполнение фильма до первой точки прерывания.

Слева в верхней части перечислены все присутствующие на сцене клипы:

Ниже — четыре вкладки: Окно Call Stack показывает, какие функции сейчас работают (пока — никакие).
  Просмотрите свойства и переменные объектов _glocal и _level0.

В правой части показан блок кода, где остановилась программа. Красная точка обозначает точку прерывания, а стрелка — точку, где остановилась программа (эта строка еще не выполнялась). Сейчас стрелка совпала с точкой прерывания.

Вы, наверное, заметили, что переменной s нет в списке переменных, поскольку соответствующая строка кода еще не выполнялась.

В выпадающем списке можно выбрать блок кода, который нас интересует (сейчас выбран блок, связанный с кадром 1, Frame 1). Чтобы установить (или снять) точку прерывания, надо щелкнуть в поле слева от номера нужной строки. То же самое можно сделать, если щелкнуть по кнопке , курсор предварительно устанавливается в нужную строчку.

Точки прерывания, установленные в отладчике, не сохраняются внутри FLA-файла и будут потеряны, если закрыть его.

Кнопка снимает все точки прерывания, а кнопка прекращает отладку.

  В выпадающем списке выберите код, связанный с кадром 10 (ищите фразу Frame 10) и поставьте точку прерывания на первой строке внутри функции Sum. Запустите фильм кнопкой .
  Посмотрите переменные на вкладке Locals (доступные внутри функции). Слово обозначает текущий клип, щелкнув по значку со знаком «плюс», вы увидите список переменных этого клипа.
Переменные, так же как и свойства объектов, можно изменять во время выполнения программы. Для этого нужно сделать двойной щелчок мышкой в столбце Value и ввести новое значение. Некоторые свойства, например _currentframe, изменить нельзя, они выводятся в таблице серым цветом.

Для продолжения выполнения программы используются кнопки
«проскочить» эту строку, не выполняя ее;
выполнить одну строку (войти в функцию);
выполнить все строки до выхода из функции.

  Выполните одну строку с помощью кнопки и посмотрите, что изменилось на вкладке Locals (там должна появиться переменная x).
Когда переменных много, удобно добавить наиболее интересные для нас в окно Watch. Для этого надо щелкнуть правой кнопкой мыши на имени переменной в окне Locals или Variables и выбрать команду Watch из контекстного меню (она там одна). Слева от имени переменной появляется синяя точка. Сделав эту операцию еще раз, мы уберем переменную из списка Watch.
  Добавьте переменную x в окно Watch и сделайте вкладку Watch активной. Измените значение переменной x на 0.
  Выполните функцию до конца в шаговом режиме, нажимая на кнопку . Наблюдайте, как меняется значение x.
  Прекратите отладку, щелкнув по кнопке .
к началу К началу страницы

5. Flash и PowerPoint

Презентации PowerPoint проникли во все сферы деятельности, где требуется наглядность при изложении материала. Flash-ролик совсем несложно добавить в такую презентацию.

Сначала нужно добавить на слайд элемент управления Shockwave Flash Object:

Далее требуется задать путь к Flash-ролику на диске: Необходимо помнить о некоторых тонкостях. Во-первых, объект Shockwave Flash Object должен быть уже установлен на вашем компьютере. Он представляет собой элемент управления ActiveX в виде файла Flash.ocx в папке
%windows%\system32\Macromed\Flash
Этот файл будет автоматически установлен и зарегистрирован (что важно!) при установке среды Adobe Flash или бесплатного проигрывателя Flash Player. В крайнем случае, можно скопировать его вручную с другого компьютера и зарегистрировать из командной строки
regsvr32 Flash.ocx

Во-вторых, сам Flash-ролик не внедряется в презентацию, а загружается во время ее выполнения. Поэтому лучше всего поместить его в ту папку, где расположена презентация, и не забывать «брать с собой» при копировании презентации.

При изменении размера объекта-контейнера на слайде размеры Flash-ролика изменяются так, чтобы помещался в отведенное место целиком без искажения пропорций.

к началу К началу страницы


Оглавление
 Трехмерный мир Назад В начало Вперед Приложение


© 2007  К. Поляков


Сайт создан в системе uCoz