к оглавлению Flash   Алгоритмизация   4GL - визуальные среды мультимедийные технологии  

Мультимедийный скриптовый язык ActionScript

Циклы в ActionScript

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

Повторяющиеся операции

Часто бывает необходимо выполнить в сценарии ряд в высшей степени сходных между собой операций. Например, чтобы перемещать какой-либо объект по экрану, вам может понадобиться переменная, которая будет принимать разные значения в различные моменты времени. Предположим, что такой переменной является count (счетчик), а ее значения — все целые числа в интервале от 1 до 10. Разумеется, вы можете написать примерно так:

count = 1

count = 2

count = 3

count = 4

count = 5

count = 6

count = 7

count = 8

count = 9

count = 10

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

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

count = count + 1

count += 1

По достижении переменной count значения 10 специальная условная инструкция автоматически прекратит дальнейшее увеличение значения переменной. Вы сэкономите время и добьетесь нужного результата, затратив меньше усилий.

К аналогичному выводу давно пришли программисты, пользующиеся обычными языками программирования. Уже в тех языках, которые возникли на заре эпохи программирования, была предусмотрена особая структура, которая получила название цикла. Цикл позволяет повторить некий процесс такое количество раз, которое соответствует заданному условию. В языке Action-Script и в системе Flash циклы представляются либо через условные инструкции, либо с помощью особой инструкции цикла. В языке ActionScript пакета Flash 5 используются четыре различных типа циклических операций.

  • while. В циклах подобного типа условие, заданное в начале цикла, определяет обстоятельства, при которых выполнение цикла следует завершить. Все циклические операции заключаются в фигурные скобки ({}); обычно в числе повторяемых инструкций присутствует инкремент или декремент параметра цикла. Пример:

    count=20;

    while (count >10) {

    Fungus[count]=count * 2;

    count = 1 ; }

  • do... whi1e. Циклы подобного вида отличаются от циклов типа whi 1 e только тем, что проверка условия выхода из цикла осуществляется здесь в конце цикла, что обеспечивает как минимум однократное выполнение тела цикла. Пример:

    do {

    Fungus[count]=count * 2 count -= 1

    } while (count >10)

  • for. Такой цикл позволяет задать начальное значение параметра цикла, условие завершения, а также операцию изменения значения параметра цикла в одной строке. Пример:

    for (count=100: count >10: count--) {

    Fungus[count]=count * 2

    }

  • for... in. Циклы данного вида применяются только для свойств объектов. За счет существования в таком цикле переменной, которая пробегает все поля объекта (переменная feature в приведенном ниже примере), цикл обрабатывает все элементы, входящие в состав заданного объекта. Пример:

    auto = {make:'Rolls-Royce', model:'Silver Spur', year:'1983'};

    for (feature in auto) {

outtie+=("auto."+feature+"="+auto[feature])+newline;

}

На выходе предыдущего примера (предполагается, что outtie является переменной, связанной с текстовым полем) окажутся следующие строки:

  • auto.make=RolIs-Royce;
  • auto.model=Silver Spur;
  • auto.year=1983.

Циклы на основе условных инструкций обычно создаются при необходимости произвести многократный проход через определенный кадр либо обработать повторяющиеся щелчки на какой-либо кнопке или клипе, содержащем переменную, значение которой увеличивается при каждом щелчке. Циклы первого вида мы будем называть циклами повторений, поскольку в них речь идет о многократном повторении каких-то действий, а циклы второго вида принято называть структурными, поскольку они записываются в виде определенной структуры языка ActionScript.

СОВЕТ

КОПИРОВАНИЕ СЦЕНАРИЕВ. При дублировании идентичных или похожих сцена-риев, относящихся к различным кадрам и кнопкам, можно выбрать готовый текст сценария, щелкнув на нижней его строке, а затем щелкнув на верхней строке нужного вам фрагмента при нажатой клавише Shift в поле редактора сценариев ActionScript панели операций. Затем нужно выбрать команду Edti > Copy (Правка > Копировать), открыть панель операций для другого кадра или кнопки и воспользоваться командой Edti > Paste (Правка> Вставить). В результате сценарий будет скопирован. Можно также применять клавиатурные соответствия: для команды копирования — Ctrl+C (Windows) либо Cmd+C (Macintosh), для команды вставки — Ctrl+V (Windows) либо Cmd+V (Macintosh). Кроме того, можно воспользоваться щелчком правой кнопкой мыши на платформе Windows PC либо щелчком при нажатой клавише Cmd на платформе Macintosh, чтобы открыть контекстное меню, в котором предусмотрены команды копирования и вставки.

Циклы повторений

В уроке 4 мы рассмотрели применение условных инструкций для оценки данных и принятия решений. Механизм принятия решений требуется, в частности, когда фильм повторно выполняет определенную последовательность кадров, пока не будет выполнено некоторое условие. Когда это условие удовлетворено, циклическое повторение кадров прекращается и фильм переходит к какой-то другой части либо прекращает свою работу.

Создание циклов с помощью условных инструкций

Давайте рассмотрим циклическую последовательность кадров в фильме из двух кадров. Один из этих кадров осуществляет увеличение или уменьшение значения некой переменной, в то время как другой вновь и вновь «примеряет» это значение к заранее заданному условию. Если условие не выполняется, фильм возвращается к первому кадру. Модель подобного цикла выглядит следующим образом:

Кадр А

varName = varName + 1

Кадр В

if (varName=Condition) {

gotoAndPlay ("OutOfLoop");

} else {

gotoAndPlay ("Frame_A");

}

Нетрудно видеть, что структура циклических кадров довольно проста. Образец фильма, который мы рассмотрим ниже, обеспечивает генерацию значений, отображаемых на экране. Этот фильм содержит большое количество меток и ряд комментариев, позволяющих лучше понять, для чего предназначен тот или иной кадр. Однако практически все значимые действия в этом фильме выполняются в кадрах Bump (Увеличение) и Evaluate (Оценка). На рис. 5.1 показаны вид начальной страницы и рабочая зона фильма; обратите внимание на текстовое поле Output (Вывод) и панель Text Options (Параметры текста).

Рис. 5.1. Простой фильм с циклическими кадрами

Пример фильма. Циклы в кадрах

Рассматриваемый фильм (он находится в файле FrameLoop.fla на компакт-диске) демонстрирует механизм цикла повторений. В фильме присутствуют три слоя:

  • Output (Вывод);
  • Condition (Условие);
  • Comments (Комментарии).

Данный фильм чрезвычайно прост. Вообще говоря, в нем было бы достаточно разместить всего 2 кадра, однако, чтобы все комментарии и метки были видны на экране и циклический механизм фильма стал для вас более понятным, использовалось больше 25 кадров.

Слой Output

Слой Output (Вывод) включает в себя лишь одно текстовое поле (параметры шрифта: 14 пунктов, красный, Times) и надпись Output (Вывод) зеленого цвета. В табл. 5.1 представлены данные для этого текстового поля.

Таблица 5.1. Свойства текстового поля и имя переменной

Имя переменной

Флажок Border/Bg

Способ выравнивания

Output

Снят

По центру

 

Слой Condition

Слой Condition (Условие) вполне можно было бы назвать Loop (Цикл), поскольку именно здесь находятся кадры, сценарии которых выполняют цикл.

  • Кадр 4 с меткой Bump (Увеличение) обеспечивает приращение значения переменной Output всякий раз, когда фильм проходит через этот кадр. Поскольку указанная переменная связана с текстовым полем, ее значение отображается на экране.

    output = output+1

  • Кадр 15 с меткой Evaluate (Оценка) содержит переменную Beta, которая получает значение 5. Текущее значение переменной Output сравнивается со значением переменной Beta; фильм возвращается к кадру Bump (Увеличение), пока значения Output и Beta не станут равными. Разумеется, можно было бы (и намного проще) сравнивать значение переменной Output с константой 5. не вводя дополнительной переменной (в нашем случае Beta). Но вам нужно получить определенный опыт сравнения значений переменных в условных выражениях. По мере возрастания сложности ваших сценариев вы все больше будете иметь дело с переменными и все меньше — с константами.

    Beta = 5;

    if (output==Beta) {

output = "End!";

stop (); }

Как только сравнение приносит положительный результат, фильм останавливается, сообщая об этом зрителю выводом строки End! (Конец). Обычно при выходе из цикла фильм переходит к решению каких-то других задач, но в нашем примере таковых не наблюдается.

Циклы в кадрах используются в фильмах Flash достаточно часто. Их применяют для изменения свойств клипов и выполнения других повторяющихся операций, в которых производится увеличение или уменьшение размеров, расположения и других параметров какого-либо объекта (подробно эта тема будет рассматриваться в уроке 7).

Структурные циклы

Структурный цикл не выходит за рамки одного кадра, кнопки или клипа. В структурных циклах используются условные инструкции, сходные с конструкциями IF, о которых шла речь в уроке 4. Так, приведенные ниже циклы While и For по форме весьма похожи на условную инструкцию if:

while (count < 3)

for (count=0; count < 3; count++)

if (count > 3)

Основное различие между приведенными выше циклами и условной инструкцией состоит в том, что цикл продолжает выполняться, если условие ложно, в то время как инструкция i f сразу передает управление следующей инструкции.

В цикле for первый параметр (count=0;) служит для начальной установки значения параметров цикла; второй параметр (count < 3;) представляет собой условие продолжения цикла, а третий параметр (count++) используется как инструкция присваивания, изменяющая значение параметра цикла. В нашем случае после каждого выполнения тела цикла значение переменной count увеличивается на 1.

Циклы и массивы

Один из стандартных способов использования циклов состоит в начальной установке значений элементов массива; применяются циклы и для получения информации, записанной в массиве, а также для ее вывода на экран. Поскольку в массиве содержится целый ряд элементов, причем каждый из них идентифицируется особым числом, начиная с 0, циклы часто используются для сканирования массива с целью изменить или получить значения элементов.

Пример:

Task = new Array():

for (count=0: count<10: count++) {

Task[count] = count+1;

}

Альтернативное решение состоит в ручном перечислении всех элементов:

"Task1" = 1

"Task2" = 2

"Task3" = 3

"Task10" =10

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

Пример фильма. Вложенные циклы

Циклы могут находиться внутри других циклов. Тогда говорят, что одни циклы являются вложенными по отношению к другим; как правило, вложенные циклы используются для обработки многомерных массивов. Допустим, у вас есть две команды, в каждой из которых десять игроков. Вполне логично представить игроков каждой из команд массивом. Цикл, обрабатывающий какую-то информацию обо всех игроках одной команды, должен пробегать значения от 1 до 10. Рассмотрим пример использования вложенных циклов в Action-Script (образец этого фильма вы найдете в файле NestedLoop.fla на компакт-диске). Цикл, находящийся в сценарии кадра, создает массив и инициализирует его, помещая в элементы массива числа, на единицу большие соответствующего значения индекса. В фильме два слоя:

  • Build Array (Построить массив);
  • Button Out (Кнопка вывода).

Слой Build Array

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

В первом, и единственном, кадре сначала производится инициализация двух глобальных переменных константой 0. Поскольку эти переменные являются глобальными, их значения могут изменяться другими сценариями; поэтому необходимо произвести инициализацию. Во внешнем цикле должно быть 2 прохода, соответствующих двум командам, а во внутреннем цикле — 10 проходов, по числу игроков в команде. Для увеличения значений параметров циклов используются составные операторы присваивания. В конце работы сценария переменные — параметры циклов вновь обнуляются.

t = 0;

m = 0; .

Team = new Аггау():

Member = new Аггау();

while (t<2) {

while (m<10) {

Team[t] = t+1:

Member[m+(t>0)*(m+11)] = m+1;

m+=l;

}

t+=l;

m = 0;

}

t = 0;

m = 0;

Единственная не вполне очевидная тонкость в этом сценарии — это определение индекса элемента массива Member. Co значением элемента все предельно просто, но определение индекса конкретного элемента массива требует выполнения ряда вычислений. Переменная t — параметр внешнего цикла принимает значения 0 и 1. При первом проходе по внешнему циклу сценарий обрабатывает 10 элементов с индексами от 1 до 10, соответствующих игрокам первой команды. Когда сценарий переходит ко второй команде, значение переменной m оказывается равным 0. Поэтому, если вы просто обработаете соответствующие элементы массива при значениях m в интервале от 0 до 9, эти элементы окажутся обработанными дважды, причем между двумя командами не будет проводиться никаких различий. В приведенном выше сценарии описанная проблема решается с помощью переменной t, последовательно принимающей значения 0 и 1, — она используется в логическом выражении как множитель. Если значение t не больше 0, как при первом проходе по внешнему циклу, множитель оказывается равным 0 и к значению параметра цикла m ничего не добавляется. При втором проходе по внешнему циклу переменная t имеет значение 1 и результат вычисления значения выражения пн-11 умножается на 1 и добавляется к значению т. Таким образом, при первом проходе по внутреннему циклу мы получаем 0+1*(0+11), то есть 11. Номер последнего элемента массива Member равен 10, потому что именно таково условие выхода из цикла. Когда в начале тела цикла m получает значение 9, это значение складывается с константой 11, что в сумме дает 20, а это общее число игроков в двух командах.

Слой Button Out

Во втором слое содержатся единственная кнопка и текстовое поле. Текстовое поле связано с переменной, это позволяет зрителю видеть, что происходит при выполнении вложенных циклов. В сценарии кнопки используется объект массива, определенный в сценарии кадра; никакой необходимости переопределять его нет. Сценарий обрабатывает оба массива с помощью цикла, аналогичного рассмотренному выше. Обратите внимание на то, что после первого прохода по внешнему циклу значение переменной m устанавливается равным 0, — в результате при втором проходе, когда внутренний цикл обрабатывает информацию об игроках второй команды, процесс действительно начинается с первого игрока второй команды. Рассмотренный выше прием использования логического множителя позволяет нам обработать все 20 элементов массива Member. Необходимые для определения текстового поля данные приводятся в табл. 5.2.

Таблица 5.2. Свойства текстового поля и имя переменной

Имя переменной

Флажок Border/Bg

Способ выравнивания

arrayOut

Снят

Полевому краю

 

Экземпляр кнопки Out

Создайте кнопку, нарисовав окружность, выделив ее и нажав клавишу F8. Установите переключатель Button (Кнопка), назовите кнопку Out (Вывод) и щелкните на кнопке ОК в окне свойств символа. Сценарий кадра осуществил загрузку значений в массив. Чтобы вывести эти значения на экран, следует обратиться к массиву и внести значения его элементов в строку, предназначенную для вывода на экран. Соответствующая строковая переменная (Cull) в дальнейшем может передать свое значение переменной, связанной с текстовым полем на экране (arrayOut).

on (release) {

while (t<2) {

while (m<10) {

ccull+="Теаm "+Team[t]+" member "+Member[m+(t>0)*(m+ll)]+newline;

m+=l;

}

t+=l; m = 0;

}

arrayOut = cull;

t = 0;

m = 0;

}

Чтобы помочь вам лучше разобраться в механизме работы вложенных циклов, описанный процесс разбит на несколько шагов.

  1. В начале работы сценария обе переменные, используемые как параметры циклов: t и т, — получают значение 0.
  2. Внешний цикл выполняется в два прохода, так как после второго прохода параметр цикла (t) достигает предельно допустимого значения 2.
  3. Внутренний, или вложенный, цикл будет работать, пока значение счетчика m не станет равным 10. Таким образом, вложенный цикл выполняется в 10 проходов.
  4. По завершении первого внутреннего цикла сценарий увеличивает значение параметра внешнего цикла (для команд) и устанавливает значение параметра внутреннего цикла (для игроков) равным 1. Если бы счетчик игроков не сбрасывался, его значение оказалось бы слишком большим при повторном входе во внутренний цикл, который в этом случае вообще не стал бы выполняться.
  5. После второго прохода по внешнему циклу сценарий его покидает. На рис. 5.2 показаны выходные данные фильма, отображаемые на экране при щелчке на кнопке.

Применение простых и вложенных циклов в фильмах в формате Flash — это один из способов управления множеством объектов, находящихся в рабочей зоне. В уроках 7-9 вы познакомитесь с методикой управления объектами, находящимися в различных компонентах фильма, и их свойствами. Вы убедитесь в том, что простые и вложенные циклы обеспечивают возможность создания различных сценариев, обеспечивающих целый ряд интересных ходов в фильмах Flash.

Рис. 5.2. При щелчке на кнопке на экране отображаются значения элементов массивов

Проект. Перемещение данных в цикле

Рассматриваемая программа (файл TransLoop.fla) демонстрирует использование одного цикла для перемещения данных из трех входных редактируемых текстовых полей в единственное выходное текстовое поле. В данном фильме имеются следующие слои:

  • ButtonActions (Действия кнопок);
  • Give (Передача);
  • Labels (Надписи);
  • Show (Отображение);
  • Background (Фон).

В цикле используются организованные наподобие массива переменные, связанные с тремя входными текстовыми полями; функция Eval () и переменная — параметр цикла. В ходе работы цикла введенные пользователем значения переносятся из текстовых полей в массив. Считывание данных из входных полей осуществляется в цикле, который передает входную информацию в массив, а затем осуществляет необходимое форматирование, позволяющее разместить ее в одном выходном текстовом поле.

К сожалению, при помещении данных в текстовое поле его прежнее содержимое теряется. (То же самое происходит с переменными; вообще говоря, текстовые поля во многих отношениях ведут себя подобно переменным.) К примеру, если вы хотите вывести в текстовом поле 10 элементов данных и используете при этом цикл, то на экране будет отображаться только последний, десятый элемент.

Выход из положения можно найти за счет конкатенации всех пересылаемых данных и применения функции перевода строки newline, позволяющей разбить элементы данных на несколько строк. Упрощает задачу применение механизма циклов и массивов. В данном случае хорошо работает прием использования индексированных имен входных переменных, связанных с текстовыми полями.

Чтобы создать такой фильм, достаточно написать всего один сценарий, но необходимо учитывать, что имена текстовых полей должны быть именно такими, как указанно ниже. Входные текстовые поля связаны с индексированными именами Natne1, Name2 и Name3. На рис. 5.3 над всеми текстовыми полями присутствуют надписи, соответствующие именам связанных с этими полями переменных.

Рис. 5.3. Кнопка в форме стрелки содержит сценарий ActionScript в котором для пересылки данных, введенных пользователем, из трех текстовых полей слева в текстовое поле большего размера справа используется цикл

В слое ButtonActions (Действия кнопок) используется одна из кнопок стандартной библиотеки Flash. Большая стрелка, указывающая вправо, — это кнопка, сценарий которой перемещает данные из трех отдельных полей слева в текстовое поле справа.

Приведенный ниже сценарий невелик по объему, но весьма эффективен. Чтобы создать его, выполните следующие шаги.

  1. Введите текст сценария (см. ниже), ничего в нем не меняя. Здесь крайне важно точно скопировать каждую пару скобок, каждый оператор, каждый пробел.
  2. Щелкните на кнопке в форме стрелки, чтобы выделить ее, а затем щелкните на кнопке Show Actions (Показать операции) в правом нижнем углу окна рабочей зоны, чтобы вывести на экран панель операций.
  3. В обычном или экспертном режиме введите следующий текст сценария:

on (release) {

accum = "";

show = "";

tname = new Array();

for (count=1: count<4; ++count) {

tname[count] = eval("Name"+count);>

eval("Name"+count) = "";

accum+=tname[count]+newline;

}

show = accum:

}

Рис. 5.4. Сначала пользователь вводит три имени в соответствующие текстовые поля

Рис. 5.5. После щелчка на кнопке в форме стрелки данные, находящиеся слева, пересылаются в правое текстовое поле, а входные поля очищаются

Ключевой для понимания этого сценария является строка, в которой устанавливается значение переменной ассum. Это строка accunt+=tname[count]+newline;.

  • Переменная accum аккумулирует данные, полученные из трех входных текстовых полей. Обратите внимание на то обстоятельство, что здесь применяется составной оператор присваивания, позволяющий осуществить добавление новой информации к значению переменной. В результате создается строка большого размера, которая по завершении цикла пересылается в переменную show, связанную с текстовым полем.
  • Данные, находящиеся в трех текстовых полях (рис. 5.4 и 5.5), помещаются в переменную accum с помощью цикла, в котором используется массив (tnarae[count]) и псевдомассив eval("Name"+count).

Проект. Программа составления календаря

С помощью циклов вы можете добиваться удивительных результатов, создавая предельно короткие сценарии. В рассматриваемом проекте (образец фильма вы найдете в файле Calendar.fla на компакт-диске) пользователю предоставляется возможность создать календарь на месяц щелчком на представлении начального дня недели; при этом пользователь должен указать количество дней в месяце. В фильме присутствуют 4 слоя:

  • Start (Начало);
  • Dates (Даты);
  • Buttons and Actions (Кнопки и действия);
  • Cells (Ячейки).

Сценарий должен распределить даты по дням недели. Для представления дней недели используются кнопки со сценариями ActionScript. Кнопка Clear (Очистить) сбрасывает представленную на экране информацию календаря, позволяя повторить процесс построения для того же самого или другого месяца. Для генерации информации о распределении чисел по дням недели во всех кнопках используются цифры; сброс информации также осуществляется через циклы. На рис. 5.6 показана страница фильма, а также поле редактора сценариев в панели операций. Все сценарии, определенные для кнопок,, идентичны, если не считать значения переменной Begin.

Рис. 5.6. Календарь позволяет получить распределение чисел по дням недели с использованием механизма циклов

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

Слой Cells

В этом слое размещены ячейки, соответствующие отдельным датам. Всего необходимо 37 ячеек, потому что «в худшем случае» месяц может начаться в субботу и в нем 31 день (как, например, в июле 2000 года). Чтобы создать слой Cells (Ячейки), необходимо выполнить следующую последовательность действий.

  1. Выполните команду Insert > New Symbol (Вставка > Новый символ) или воспользуйтесь комбинацией клавиш Ctrl+F8 (Windows) либо Cmd+F8 (Macintosh). В диалоговом окне Symbol Properties (Свойства символа) установите переключатель Graphic (Графика) и введите имя Cell в поле Name (Имя).
  2. Нарисуйте в режиме редактирования символов квадрат с помощью инструмента Rectangle (Прямоугольник). Чтобы получить квадрат, удерживайте при рисовании клавишу Shift. Выберите сплошную рамку; установите толщину рамки, равную 2 пунктам; установите отсутствие заливки; задайте ширину и высоту квадрата, равные 45 пикселам. Для редактирования этих параметров можно использовать панели Info (Информация), Stroke (Рамка) и Fill (Заливка).
  3. Щелкните на значке Scene 1 (Сцена 1) в верхнем левом углу главного рабочего окна, чтобы выйти из режима редактирования символов.
  4. Выполните команду Window > Library (Окно > Библиотека) или воспользуйтесь комбинацией клавиш Ctrl+L (Windows) либо Cmd+L (Macintosh), чтобы открыть окно Library (Библиотека). Перетащите с помощью мыши 5 экземпляров символа Cell (Ячейка) в рабочую зону. Расположите эти 5 ячеек вертикально в левой части рабочей зоны, как показано на рис. 5.6 и 5.7 (дополнительные ячейки в нижней части экрана мы добавим позднее).

Рис. 5.7. Готовая программа составления календаря автоматически размещает даты с помощью цикла

  1. Выполните команду Window > Panels > Align (Окно > Панели > Выровнять) или воспользуйтесь комбинацией клавиш Ctrl+K (Windows) либо Cmd+K (Macintosh), чтобы открыть панель Align (Выравнивание). С помощью инструмента Arrow (Стрелка) выделите все 5 экземпляров символа ячейки, щелкните на кнопке Align left edge (Выровнять по левому краю) и на одной из кнопок вертикального распределения. В результате вы должны получить вертикальный ряд равномерно распределенных квадратных ячеек.
  2. Выделите все 5 ячеек и выполните команду Edit > Сору (Правка > Копировать) или воспользуйтесь комбинацией клавиш Ctrl+C (Windows) либо Cmd+C (Macintosh), чтобы скопировать все 5 ячеек. Затем выполните команду Edit > Paste (Правка > Вставить) или воспользуйтесь комбинацией клавиш Ctrl+V (Windows) либо Cmd+V (Macintosh) и вставьте 6 копий содержимого буфера обмена. У вас должно получиться 7 столбцов — по одному на каждый день недели.
  3. Воспользуйтесь средствами панели Align (Выравнивание), чтобы выровнять все столбцы, как показано на рис. 5.7. После этого добавьте еще два экземпляра символа Cell (Ячейка) в левом нижнем углу, чтобы получить 37 ячеек, необходимых для календаря.

Слой Cells (Ячейки) используется как фон. Тот факт, что мы применили множество экземпляров одного символа, существенно уменьшает объем данных, подлежащих загрузке (а значит, и время загрузки фильма). Кроме того, несколько раз скопировать символы проще, чем нарисовать 37 ячеек вручную.

Слой Dates

Слой Dates (Даты) включает в себя 38 текстовых полей. Они размещаются в правом верхнем углу всех ячеек. Поскольку здесь мы имеем дело с текстовыми полями, у нас есть возможность поставить им в соответствие переменные. Эти переменные составляют псевдомассив. Вот шаги, которые необходимо выполнить при создании слоя Dates.

  1. Создайте текстовое поле в виде прямоугольника размером 29x27 пикселов с помощью инструмента Text (Текст). Выберите вариант Input Text (Набираемый текст) в раскрывающемся списке, находящемся в панели Text Options (Параметры текста).
  2. Создав первое текстовое поле, введите имя связанной с ним переменной (в нашем примере — datel), установите соответствующие параметры и сделайте 36 копий текстового поля. Разместите каждую из 37 копий в правом верхнем углу соответствующей кнопки. Первое поле должно находиться в верхней левой кнопке.
  3. Откройте панель Text Options (Параметры текста) и последовательно выделяйте текстовые поля с помощью инструмента Arrow (Стрелка). Для каждого из них в поле Variable (Переменная) введите имя переменной; установите также значения других параметров, как показано в табл. 5.3.

Таблица 5.3. Свойства текстового поля и имя переменной

Имя переменной

Флажок Border/Bg

Способ выравнивания

Максимальная длина

date1

Снят

По правому краю

2 символа

date37 Снят По правому краю 2 символа

 

  1. Продвигаясь слева направо и сверху вниз, дайте переменным, связанным с текстовыми полями, имена от datel до date37. Поскольку все остальные параметры текстовых полей были корректно установлены еще до копирования, менять их не нужно.

Слой Start

Слой Start (Начало) содержит все надписи и одно текстовое поле. Надписи можно размещать в любом месте рабочей зоны по вашему желанию. Параметры текстового поля представлены в табл. 5.4.

Таблица 5.4. Свойства текстового поля и имя переменной

Имя переменной

Флажок Border/Bg

Способ выравнивания

Максимальная длина

Days

Снят

По правому краю

2 символа

Это текстовое поле позволяет пользователю задать количество дней в месяце. Поскольку здесь предусмотрено ограничение на длину, любое значение, большее 99, будет отвергнуто. Однако, если пользователь задаст значение, не превосходящее 99, но превышающее 37, для некоторых «дней» места в календаре не найдется. Впрочем, при этом не произойдет никакого аварийного сбоя, так как сценарии кадров ориентируются на конкретные имена переменных (date... и dn...). В языке ActionScript имя переменной, даже если она связана с текстовым полем, являет собой лишь имя переменной, и не более того. Тот факт, что для 37 текстовых полей применяются переменные вида dateN, вовсе не означает, что у любой подобной переменной есть свое текстовое поле. Текстовые поля не являются неотъемлемым свойством переменных; система Flash лишь обеспечивает отображение на экране определенной информации, выводя значение переменной в связанном с ней текстовом поле. Представьте себе, что переменная — это дом, а текстовое поле — окно, через которое можно увидеть, что происходит в этом доме. Не перепутайте, переменная — это дом, а не окно.

Слой Buttons and Actions

Основной код в нашем проекте содержится в кнопках выбора дня недели. Сценарии всех этих кнопок отличаются друг от друга только одной константой. Функция сценариев здесь состоит в том, чтобы разместить числа в ячейках календаря в строгом соответствии с информацией о дне недели, с которого начинается месяц, и о количестве дней в месяце.

Прежде всего необходимо создать кнопки.

  1. Введите названия дней недели, начиная с Sunday (Воскресенье), с помощью инструмента Text (Текст).
  2. Выделите это название и нажмите клавишу F8, чтобы преобразовать текст в символ. Установите переключатель Button (Кнопка) и введите имя символа, отражающее название соответствующего дня недели, начиная с Sunday (Воскресенье). Не снимайте выделение с символа.
  3. Нажмите комбинацию клавиш Ctrl+E (Windows) либо Cmd+E (Macintosh), чтобы перейти в режим редактирования символов.
  4. Вы увидите, что на киноленте появилась группа кадров Up (Кнопка отжата), Over (Указатель мыши над кнопкой), Down (Кнопка нажата) и Hit (Срабатывание). Выделите кадр Over и нажмите клавишу F6, чтобы сделать его ключевым.
  5. Выделите символ и выполните команду Modify > Break Apart (Модифицировать > Разбить) или воспользуйтесь комбинацией клавиш Ctrl+B (Windows) либо Cmd+B (Macintosh).
  6. С помощью кнопки выбора цветов в панели Colors (Цвета) установите красный цвет в качестве текущего и щелкните на названии дня недели. Все слово должно окраситься в красный цвет.
  7. Выделите кадр Down (Кнопка нажата), нажав клавишу F6, сделайте его ключевым и повторите шаги 5 и 6 для желтого цвета.
  8. Повторите шаги 1 -7 для всех остальных дней недели.

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

Кнопки выбора дня недели

Все семь сценариев кнопок чрезвычайно похожи друг на друга. Единственное отличие составляет значение переменной begin, содержащей количество позиций, на которые необходимо сдвинуть первое число месяца относительно начала сетки ячеек. Вот как выглядит здесь сценарий кнопки Sunday (Воскресенье):

on (release) {

begin = 0;

nd = days;

dn = 1;

while (nd>=l) {

set ("date"+(dn+begin), dn);

dn = dn+1;

nd = nd-1:

}

}

Переменная begin представляет сдвиг первого число месяца относительно начала сетки ячеек. Поскольку неделя начинается с воскресенья, никакого сдвига в данном случае не нужно; значение переменной begin устанавливается равным 0. Теоретически эта переменная здесь вообще лишняя, но она оставлена, чтобы данный сценарий можно было использовать для всех семи кнопок.

Переменная nd представляет количество дней в месяце. Значение nd получается на основе значения переменной days, связанной с текстовым полем, в котором пользователь вводит число дней в месяце. Значение nd должно находиться в интервале от 28 до 31. (Если вы хотите улучшить рассматриваемый фильм, создайте сценарий, который будет следить за тем, чтобы границы этого диапазона не нарушались. Совет: примените инструкцию вида if...Else.)

Переменной dn первоначально представляется значение, соответствующее первому дню недели, — это всегда константа 1. Данная переменная используется в цикле для последовательной вставки чисел в календарь.

Условием продолжения цикла является положительное значение переменной nd. Какое бы значение ни было задано переменной nd (через текстовое поле days), цикл всегда будет выполняться корректно.

Основное назначение сценария — поместить правильные значения в ячейки календаря. Поскольку текстовые поля обладают именами вида dateN, где N принимает значения в интервале от 1 до 38, сценарий должен найти то текстовое ноле, куда необходимо поместить число, являющееся текущим значением переменной dn. Месяц может начаться с любого дня недели, и вы не должны всецело полагаться на числа, которыми обозначены текстовые поля. Таким образом, добавляя значение сдвига, заданное переменной begin, к строке "date", вы получите сценарий, в котором происходит конкатенация строки "date" с нужным числом. К примеру, если месяц начинается со среды, переменная begin должна иметь значение 3. Поскольку первоначально переменная dn имеет значение 1, а оно складывается с константой 3, мы получаем строку "date4". Взглянув на расположение столбца Wednesday (Среда) в календаре, нетрудно увидеть, что он является четвертым слева; следовательно, в соответствующей ячейке действительно находится текстовое поле date4. Своевременно обновляя значение сдвига, мы добьемся правильного заполнения календаря. В следующих двух строках нашего сценария изменяются значения переменных dn и nd. Значение dn постепенно увеличивается по мере включения в календарь новых чисел. В то же время необходимо уменьшать значение переменной nd, так как в ней хранится количество дней, которые остается зарегистрировать в календаре.

По завершении ввода сценария вы должны выполнить следующие действия.

  1. Выделите текст сценария в поле редактора сценариев ActionScript панели Object Actions (Операции объекта). Для этого нужно щелкнуть на последней строке сценария, а затем нажать клавишу Shift и щелкнуть на его первой строке.
  2. Выполните команду Edit > Сору (Правка I Копировать) или воспользуйтесь комбинацией клавиш Ctrl+C (Windows) либо Cmd+C (Macintosh), чтобы скопировать сценарий.
  3. Щелкните на следующей кнопке выбора дня недели; затем щелкните в поле редактора сценариев ActionScript панели Object Actions (Операции объекта).
  4. Выполните команду меню Edit > Paste (Правка > Вставить) или воспользуйтесь комбинацией клавиш Ctrl+V (Windows) либо Cmd+V (Macintosh).

СОВЕТ

Прежде чем копировать код кнопки Sunday (Воскресенье), убедитесь, что он работает правильно. Не стоит тиражировать опечатки, которые могут оказаться в тексте сценария.

Ура! Ваш календарь почти готов. Осталось только изменить значения, присваиваемые переменной begi n в сценариях разных кнопок. Корректные значения вы найдете в табл. 5.5.

Таблица 5.5. Значения переменной begin для кнопок выбора дня недели

Кнопки выбора дня недели

Значения переменной

Sunday (Воскресенье)

begin = 0

Monday (Понедельник)
begin = 1
Tuesday (Вторник) begin = 2
Wednesday (Среда) begin = 3
Thursday (Четверг) begin = 4
Friday (Пятница) begin = 5
Saturday (Суббота) begin = 6

 

Кнопка Clear

Кнопка Clear (Очистить) располагается под календарем. Чтобы получить календарь на другой месяц, пользователь должен сначала щелкнуть на кнопке Clear, удалив содержимое ячеек, составляющее старый календарь.

on (release) {

clear = 1;

while (clear<=37) {

set ("date"+clear, "");

clear = clear+1;

}

Этот цикл просто пробегает все текстовые поля и помещает в каждое из них пустое значение. Поскольку имена текстовых полей составляют массив, для изменения содержимого всех полей оказывается достаточно такого маленького сценария.

Проект. Сортировка с использованием циклов и массивов

Еще один проект с применением циклов и массивов показывает, каким образом можно сортировать данные, введенные в текстовом поле и размещенные

в массиве. В фильме, находящемся в файле loopSort.fla на компакт-диске, прилагаемом к настоящей книге, используются три слоя:

  • Text Fields (Текстовые поля);
  • Buttons (Кнопки);
  • Background (Фон).

На рис. 5.8 вы можете увидеть начальную страницу фильма, кнопки, метки и текстовые поля. Пользователь щелкает на маленькой кнопке всякий раз, когда собирается ввести очередное слово; по завершении ввода всех слов пользователь щелкает на большой кнопке, чтобы отсортировать введенные слова и увидеть результаты в правом текстовом поле.

Рис. 5.8. Основными элементами этого фильма являются две кнопки и два текстовых поля

Слой Text Fields

Первый слой фильма содержит текстовые поля для ввода информации и ее отображения на экране. В текстовом поле signln пользователь вводит данные, которые автоматически размещаются в некоем массиве по щелчку на кнопке, расположенной над полем signln. В другом текстовом поле отображаются результаты сортировки. В табл. 5.6 представлены данные для панели Text Options (Параметры текста).

Таблица 5.6. Свойства текстовых полей и имена переменных

Имя переменной

Флажок Border/Bg

Способ выравнивания

Рамка

slgnIn Установлен По левому краю Одинарная

sortOut

Снят

По левому краю

Сложная

 

Слой Buttons

Слой Buttons (Кнопки) содержит две кнопки, для которых определены сценарии, а также небольшой сценарий в первом кадре фильма.

  1. Нарисуйте окружность с помощью инструмента Oval (Овал). Автор установил для этой окружности толщину линии, равную 4 пунктам, использовав дополнительные цвета для внутреннего и внешнего кругов.
  2. Выделите рисунок и нажмите клавишу F8, чтобы открыть диалоговое окно Symbol Properties (Свойства символа). Установите переключатель Button (Кнопка) и введите имя Sortlt. Щелкните на кнопке ОК. Щелкните на кнопке Scene 1 (Сцена 1), чтобы выйти из режима редактирования символов.
  3. Нарисуйте еще одну окружность диаметром 94,5 пиксела. Выделите этот рисунок и нажмите клавишу F8, чтобы открыть диалоговое окно Symbol Properties (Свойства символа). Установите переключатель Button (Кнопка) и введите имя SortMe. Щелкните на кнопке ОК, чтобы войти в режим редактирования символов.
  4. В режиме редактирования символов выберите инструмент Text (Текст) и введите надпись Sort (Сортировать) в пределах кнопки. Средствами панели Align (Выравнивание) добейтесь расположения надписи в середине кнопки.
  5. После создания надписи для второй кнопки щелкните на значке Scene 1 (Сцена 1), чтобы выйти из режима редактирования символов.

СОВЕТ

РАЗБИЕНИЕ НАДПИСЕЙ. Если вы применяете нестандартные шрифты, не забудь-те разбить надпись, чтобы превратить ее в графическое изображение. Для этого следует воспользоваться командой Modify > Break Appart (Модифицировать > Разбить), что позволит гарантировать корректное отображение надписи на всех компьютерах.

Сценарий кадра 1

Сценарий первого кадра инициализирует массив. Сценарии обеих кнопок смогут работать с этим массивом без его предварительной инициализации при каждом щелчке на той или иной кнопке.

lword = new Array();

w=0;

Массив с именем Iword определяется глобально, и любой сценарий может обращаться к нему. В нашем фильме с этим массивом работают сценарии обеих кнопок.

Сценарий кнопки Sortlt

Сценарий первой кнопки связывает ее с верхним текстовым полем. Когда пользователь вводит очередное значение, сценарий вносит это значение в массив, созданный в кадре 1, и увеличивает значение переменной индекса w. Затем производится очистка текстового поля для ввода следующего слова.

on (release) {

lword[w] = slgnln;

w+=l;

slgnln = ""; }

Сценарий кнопки SortMe

Сценарий второй кнопки крайне важен в содержательном отношении, хотя запись алгоритма сортировки выглядит чрезвычайно просто. Введенные пользователем слова размещаются в массиве lword. Всю сортировку выполняет единственная строка сценария:

1word.sort ();

На рис. 5.9 показано, что происходит, когда пользователь щелкает на кнопке Sort (Сортировать).

Рис. 5.9. При щелчке на кнопке Sort все введенные пользователем слова сортируются в алфавитном порядке

Теперь нам осталось лишь написать цикл, который будет сканировать весь массив и переносить данные в строковую переменную. Значение этой переменной затем помещается в текстовое поле, которое используется как поле вывода, связанное с переменной SortOut.

on (release) {

accum = "";

la = 1 word.length;

Iword.sort();

for (x=0: x<la: x++) {

accum+=lword[x]+newline:

}

sortOut = accum:

for (x=0: x<la: x++) {

lword[x] = "";

}

w = 0;

lword.length = 0;

}

Если вы хотите предусмотреть возможность повторного воспроизведения фильма, вам понадобится сценарий, который будет выполнять очистку массива и его подготовку к вводу следующей порции данных. В этом сценарии должен быть цикл, который будет сканировать массив и присваивать всем его элементам значение пустой строки (""). Затем сценарий должен сбросить значение переменной индекса w и установить длину массива равной 0. Если второй набор слов, введенных пользователем, будет отличаться от первого количеством элементов, то при отсутствии описанного сценария очистки при обработке второго набора слов будет использоваться массив, длина которого соответствует количеству слов в первом наборе.

Слой Background

Слой Background (Фон) нашего фильма содержит фоновый рисунок. Для выделения выходного текстового поля используется рамка. По умолчанию при создании рамки средствами панели Text Options (Параметры текста) текстовое поле окрашено в белый цвет. Однако в данном проекте цвет фона в текстовом поле совпадает с цветом фона рабочей зоны, а для выделения текстового поля предусмотрена рамка. Поэтому был нарисован прямоугольник, скопирован командой Edit > Сору (Правка > Копировать) в буфер обмена, а затем вставлен в нужное место рабочей зоны с помощью команды Edit > Paste in place (Правка > Вставить на место). После этого средствами панели Info (Информация) размер и цветовые параметры прямоугольника были изменены таким образом, чтобы согласовать их с параметрами рабочей зоны.

В остальном фон состоит из блоков, окрашенных в различные цвета. Применение отдельных блоков позволяет лучше управлять параметрами фона при создании фильмов, рассчитанных на демонстрацию в Web. Иногда получается так, что цвет фона, определенный для фильма, не пересылается по сети, так как разработчики забывают вставить соответствующие инструкции в файл экспорта или текст на языке HTML. Поэтому лучше включить все цвета, присутствующие в фоновом рисунке, непосредственно в фильм. Это позволит избежать проблем, связанных с использованием нестандартных цветов на пользовательском компьютере.

Доработка фильма

Если вы хотите разобраться в механизме сортировки на основе ASCII-кодов, попробуйте ввести набор слов, чередуя прописные и строчные буквы. При этом вы обнаружите, что все слова, набранные прописными буквами, оказываются выше, чем слова, в которых использованы строчные буквы. Причина такого положения дел состоит в том, что символы верхнего регистра обладают меньшими значениями ASCII-кодов, чем символы нижнего регистра. Латинские прописные буквы находятся в диапазоне от 65 (А) до 90 (Z), а строчные — в диапазоне от 97 (а) до 122 (z); в результате при сортировке по возрастанию все прописные буквы располагаются перед строчными.

Однако часто бывает нужно сортировать именно список слов, набранных в виде смеси прописных и строчных букв. Эту проблему можно решить чрезвычайно просто, хотя и не слишком красиво, создав строковый объект (см. урок 7) и воспользовавшись методами stringObj.toUpperCase или string Obj.toLowerCase.

Благодаря такой методике на выходе окажется корректно отсортированный список слов, все буквы которых переведены либо в верхний, либо в нижний регистр. Однако во многих случаях и такое решение нельзя признать удовлетворительным, ибо регистр также бывает важен. Это несколько усложняет нашу задачу, но и здесь вам на помощь придет механизм строковых объектов. Попробуйте самостоятельно решить данную проблему, хотя лучше сначала познакомиться с уроком 7.

СОВЕТ

Можно хранить информацию о первоначальном регистре всех букв. Существует магическое число 32 — это расстояние между соответствующими заглавными и строчными буквами ъ кодовой таблице. Есть несколько различных способов обеспечить корректную сортировку слов, набранных в разных регистрах.

Что нового мы узнали?

В этом уроке мы научились...

  • Использовать повторяющиеся операции.
  • Создавать циклы с помощью условных инструкций.
  • Строить структурные циклы.
  • Строить вложенные циклы.
  • Работать с массивами.
  • Перемещать данные в цикле.
  • Изменять данные в цикле.
  • Использовать циклические конструкции для сортировки данных.

Знаете ли Вы, что спецификация - это документ, описывающий соглашение между разработчиками и пользователями. Разработчик берется написать модуль, а пользователь соглашается не полагаться на знания о том, как именно этот модуль реализован, т.е. не предполагать ничего такого, что не было бы указано в спецификации. Такое соглашение позволяет разделить анализ реализации от собственно использования программы. Спецификации дают возможность создавать логические основы, позволяющие успешно "разделять и властвовать".

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution