В ActionScript,
как в любом языке программирования, одно из центральных мест принадлежит структурам
данных. Понимание природы данных и механизма их хранения в ActionScript — основа
успешного освоения этого языка. Другим важным шагом на этом пути является изучение
уникального метода задания сценария ActionScript.
Понятие переменной
(variable) во многих отношениях является одним из краеугольных камней программирования.
В полном соответствии с названием основная характеристика переменных — это их
способность изменяться. Пожалуй, переменную проще всего представить себе в виде
ящика, в котором могут находиться разные предметы. В программировании переменные
способны содержать различного вида данные, обладающие разными значениями. При
этом переменная похожа на магазин, на полках которого одни товары приходят на
смену другим. Допустим, сначала наш магазин торговал только макаронными изделиями.
Затем хозяин решил, что торговлю следует расширить, и включил в ассортимент
товаров мясо, рыбу и овощи. Магазин остался тем же самым, возможно, над его
дверями даже сохранилась старая вывеска, но теперь его полки заполнены совершенно
новыми товарами. Следовательно, изменилось его содержимое.
С точки зрения
программиста одной из важных характеристик языка Action-Script является контекстно-зависимая
природа переменных. В таких языках, как C++, существуют жесткие правила, требующие,
чтобы при объявлении переменной был обязательно указан ее тип — строковый, целочисленный,
вещественный и т. п. В ActionScript, как и в других языках сценариев, такие
объявления не нужны. При исполнении сценариев ActionScript система автоматически
распознает тип данных, хранящихся в той или иной переменной.
Имя, которое
вы даете переменной, должно служить указанием на ее назначение. Такие имена,
как VariableA, Variables и им подобные, фактически бесполезны. В отличие от
них осмысленные имена переменных, например ItemCost (цена за штуку) или Tax
(налог), подсказывают программисту, какая информация хранится в той или иной
переменной — такую переменную легко найти, запомнить и использовать в соответствии
с ее назначением. Краткие имена переменных, такие как а, Ь, с, хороши при написании
очень коротких сценариев, однако при работе над большими и сложными фильмами
следует, закончив очередной сценарий, подвергнуть ревизии все использованные
идеитификаторы, чтобы
переменные получили значимые, «говорящие» имена. Применение осмысленных
имен переменных в фильмах Flash важно еще и потому, что сценарии ActionScript
обычно невелики по объему и разбросаны по всему фильму. Допустим, вам захотелось
изменить значение переменной, которая используется в некоем кадре, входящем
в клип, в свою очередь являющийся частью другого клипа. Думаете, вам легко будет
вспомнить, что означает в таком контексте переменная k? Определенно нет.
Имя переменной
должно представлять собой цепочку символов, в которой нет пробелов между словами.
Такие имена, как Pet Store или John Smith, недопустимы. Следует использовать
имена вида petstore, Pet_Store или PetStore. Следует также учитывать, что регистр
в именах переменных ActionScript не учитывается. Если вы уже назвали какую-то
переменную PetStore, то вы не сможете завести другую — с именем PETSTORE или
petstore. Однако имя Pet_Store не будет рассматриваться как имя той же самой
переменной, поскольку здесь присутствует «лишний» символ — знак
подчеркивания. С одной стороны, тот факт, что в именах переменных регистр не
имеет значения, облегчает жизнь, поскольку программисту не нужно помнить о том,
как именно он назвал некую переменную, BIGSTORE или bigstore, но, с другой стороны,
при этом появляется риск случайно использовать идентификаторы BIGSTORE и bigstore
как имена разных переменных, каковыми они никак не могут быть. Вы, конечно,
вольны считать их разными переменными, но ActionScript с вами никогда не согласится.
Еще одно
условие, которое необходимо соблюдать при выборе имен переменных, — это ограничение
на использование зарезервированных, или ключевых, слов. Ключевые слова в ActionScript
не могут служить именами меток, переменных и функций. Всего в ActionScript существует
16 ключевых слов: break, continue, delete, else, for, function, if, in, new,
return, this, typeof, var, void, while, with.
Существуют
также два особых литерала (literals) — true и fal se, — которые обозначают логические
значения и не могут употребляться как имена переменных. Кроме того, следует
избегать использования имен операций, встроенных функций и идентификаторов,
которые легко перепутать с «грамматическими» словами языка сценариев
ActionScript.
В версии
Flash 5 появился новый тип переменных — массивы (arrays). В языках сценариев,
таких как JavaScript, применяются встроенные массивы, на основе которых создается
значительная часть структуры Web-страниц, включая графические изображения и
формы. Строго говоря, массивами называются переменные с индексами, которые могут
изменяться по одному или нескольким измерениям. Массивы рассматриваются как
разновидность объектов (objects). Объектами называются структуры данных,
представляющие собой объединение свойств; в данном случае свойствами являются
элементы массива. Рассмотрим пример массива Fruits (фрукты), состоящего из четырех
элементов:
Fruit[0] = "яблоки"
Frint[l] = "апельсины"
Fruit[2] = "персики"
Fruit[3] = "сливы"
В виде массивов
часто представляются таблицы данных. Доступ к элементу данных осуществляется
через указание имени массива и ряда целых чисел — индексов, соответствующих
различным измерениям. В табл. 2.1 показан двухмерный массив, содержащий данные
обычной матрицы.
Таблица
2.1. Двухмерный массив
|
Столбец 1 |
Столбец 2 |
Строка 1 |
Var (1,1) |
Var (1,2) |
Строка 2 | Var (2,1) | Var (2,2) |
Переменная
с индексами Var (2,1) позволяет легко и наглядно адресовать ячейку, находящуюся
на пересечении первого столбца и второй строки. Именно поэтому массивы пользуются
столь большой популярностью у программистов. В дальнейшем вы узнаете, как создавать
массивы, — эта тема будет рассмотрена в разделе, посвященном объектам.
Типы данных в языке ActionScript
Строку легче всего представить себе в виде последовательности слов или текста. В программировании строки часто используются в качестве содержания различных сообщений. Строковой переменной можно присваивать строковые значения, как показано ниже:
Airplane = "Фарман"
Именем переменной, представляющей тип самолета, здесь является Ai rpl ane, а строковым литералом (literal) — "Фарман". Строковыми литералами называются данные, которые могут использоваться в качестве значения строковой переменной. В отличие от переменных (тип самолета может измениться в любой момент), литералы всегда остаются сами собой — «Фарман» всегда останется «Фарманом». Иногда в виде строк записывают числа:
StreetNumber
= "250"
Значением
переменной StreetNumber является строковый литерал, который состоит из десятичных
цифр. Вообще говоря, в виде строки можно представить практически любую цепочку
алфавитно-цифровых символов. Кроме букв и цифр такая цепочка символов может
включать в себя знаки препинания и пробелы. Буквы и цифры могут присутствовать
в строковом литерале в любой последовательности. Приведенная ниже строка скорее
всего будет иметь смысл лишь для разработчика фильма в формате Flash и для самой
системы Flash; подобные строки не демонстрируются пользователям:
MixUp = "Juan2Tree4"
Учтите, что
строки — это не числа. Строковый литерал всегда заключается в кавычки. В приведенном
выше примере со строкой StreetNumber литерал "250" заключен в кавычки.
Если мы сложим "250" и "250", то получим "250250",
а не "500".
О выражениях
принято говорить как о составных (compound) конструкциях, потому что
они состоят из двух или нескольких элементов. Приведем пример простого выражения
в языке ActionScript: [ Под выражением автор здесь имеет в виду 7+5, а не
всю приводимую им строку сценария. — Примеч. перев.]
Total =7 + 5:
Значение переменной Total после выполнения этой инструкции будет равно 12. Рассматриваемое выражение является составным (здесь два слагаемых — 7 и 5), однако значение переменной Total целостно и равно 12, поскольку значение переменной не разбивается на какие бы то ни было поля свойств. Возможно, вы спросите, зачем нужно писать в тексте сценария 7+5, когда можно просто написать 12. Действительно, программисты редко используют настолько простые выражения. Смысл понятия выражения станет для вас более очевидным, если вы взглянете на следующий пример:
Total = ItemCost
+ Tax;
Переменная
Total здесь получает значение суммы значений двух других переменных. В общем
случае нам неизвестно, какие именно у них будут значения в момент вычисления
данного выражения, потому что мы имеем дело с переменными. Язык ActionScript
избавляет нас от необходимости выяснять, какие значения имеют переменные-слагаемые.
Все вычисления производятся автоматически. Рассмотрим, к примеру, следующий
сценарий, в котором используются переменные и выражения.
ItemCost =12:
Tax = ItemCost
* .08;
sum = ItemCost
+ Tax;
Сначала мы
определяем переменную ItemCost — присваиваем ей значение числовой константы
12. Другая переменная — Tax — получает значение выражения, в котором используется
переменная ItemCost, — ее значение умножается на 0,08 (что соответствует 8-процентной
ставке торгового налога). Наконец, переменная sum принимает значение еще одного
выражения, представляющее собой сумму значений двух упомянутых выше переменных.
До сих пор
мы имели дело с довольно простыми выражениями, призванными продемонстрировать
лишь общий принцип использования выражений в сценариях. В то же время выражения
могут быть и очень сложными, особенно если в них имеется несколько взаимосвязанных
переменных. Однако, каким бы сложным ни было то или иное выражение, о том, чтобы
правильно вычислить его значение, во всех случаях позаботится компьютер — вам
не понадобится ничего
высчитывать вручную. Тем не менее при использовании сложных выражений рекомендуется
всегда четко и ясно оформлять в тексте сценария все составляющие эти выражения
части. Редактор сценариев Action-Script в версии Flash 5 всячески помогает программисту
создавать «допустимые», то есть корректные, выражения. Средства
создания сложных выражений в ActionScript более подробно рассматриваются в уроке
4.
Конкатенация
строк
Операция
соединения, или склейки, двух или нескольких строк носит название конкатенации
(concatenation). Конкатенация всегда записывается в виде выражения. Для
соединения строк в языке ActionScript используется оператор сложения + или строковый
оператор add. Рассмотрим пример.
Both = "Джонни"
+ "Салли"; Both = "Джонни" add "Салли":
В обоих случаях
при выполнении конкатенации получается строка "Джонни -Салли". Именно
эта строка будет значением переменной Both. Конкатенация часто используется
при необходимости соединить строки, связанные в смысловом отношении, например
имя и фамилию человека. Вам наверняка не раз доводилось заполнять анкеты, где
имя вписывается в одну графу, а фамилия — в другую. Чтобы получить полное имя,
при обработке анкеты содержимое соответствующих граф следует объединить. Поскольку
между именем и фамилией обычно ставится пробел, необходимо учесть его в конкатенации,
как показано ниже:
WholeName =
"Джон" + " " + "Дэвис":
Нам потребовались
два плюса (+). Первый из них соединяет строку "Джон" с пробелом (две
пары кавычек с пробелом между ними), а второй присоединяет к получившейся строке
фамилию "Дэвис". В результате мы получаем строку "Джон Дэвис",
а не маловразумительное слово "ДжонДэвис".
Другие операции
над строками мы рассмотрим в уроке 4.
В ActionScript
используются также логические, или булевы, выражения. Логическое выражение может
принимать значения 0 (нет, ложь) и 1 (да, истина). Булевы выражения названы
так в честь Джорджа Буля (George Boole), блестящего британского математика.
Логические выражения обладают особым статусом в современной науке и программировании.
(Краткую биографическую справку о Буле можно найти в Интернете по ссылке http://
encarta.msn.com/find/Condse.asp?ti=058D1000.)
В следующем
примере в переменную Bi ддег помещается логическое значение высказывания «10
больше 15». Поскольку это высказывание неверно, переменная Bigger получает
значение «ложь». Bigger = 10 > 15
Логическое
значение здесь выражается в форме 10 > 15, а не в виде константы (0 или 1).
Любому программисту хорошо известно, какую важную роль булевы
выражения играют в самых разных алгоритмах. Если у вас совсем нет опыта программирования,
поначалу это утверждение может показаться вам сомнительным, однако со временем
вы наверняка по достоинству оцените значение логических выражений.
Логические
объекты
Применение
логических значений весьма разнообразно. Вы можете, например, присвоить логическое
значение какой-либо переменной:
BooVar= 9 <
10;
В результате
получается значение «истина», однако его можно интерпретировать
и как число 1. Предположим, в некоем сценарии используется следующая последовательность
команд:
BooVar= 9 < 10;
Total=BooVar
+ 20;
После выполнения
этих инструкций присваивания переменная Total получит значение 21. Чтобы явным
образом указывать, какое именно значение имеется в виду в том или ином случае
— логическое или какое-то иное, — следует применять логические объекты. Логические
объекты служат контейнерами свойств логического типа. В ActionScript предусмотрены
три логических объекта:
В следующем
сценарии используются все три вида объектов.
booVar = new BooleanC 8 > 7);
s=booVar.toString();
v=booVar.valueOf();
textVal=s + 2;
realVal=v +
2;
output=textVal
+ newline + realVal;
Переменная
output представляет здесь текстовое поле, и результат вычислений будет выведен
на экран. Функция newline автоматически позаботится о «возврате каретки»;
поэтому результаты предъявляются пользователю в текстовом поле в ясной и четкой
форме:
true2
3
Если у вас
совсем нет опыта программирования, поначалу вы можете недооценить значимость
логических выражений, однако со временем вы наверняка поймете, насколько важен
этот механизм. Пример работы с логическими выражениями вы найдете в конце урока,
где логическое значение используется при переключении режима округления в функции,
которая отбрасывает лишние цифры в десятичном представлении числа.
С числами
все гораздо проще. В отличие от строк числа могут представляться единственным
способом. Любые некорректные символы, использованные для представления числа,
приведут к возникновению проблем, если только они не являются частью имени переменной.
Переменная, определенная как числовая, может использоваться для хранения только
числовых значений и обладает всеми признаками чисел.
Числа бывают
положительными и отрицательными. Эти разновидности чисел арифметически совместимы.
Вы можете создать переменную, в значении которой используются как положительные,
так и отрицательные величины. Примеры:
Nuts = -5 + 15;
ReallyNuts =
-5 + -15 + 3;
Целые
числа
Целые числа
в языке ActionScript — это обычные математические целые числа. У них отсутствует
дробная часть. При создании числовой переменной вы не обязаны указывать, какой
именно числовой тип вам нужен — целочисленный или вещественный. Но если вы хотите
создать именно целочисленную переменную, то должны сообщить системе ActionScript
о том, что эту переменную необходимо трактовать как целочисленную. Объявление
целых чисел осуществляется с помощью функции int. Пример: whole = int(AllStuff
/ Parts):
Выражение
All Stuff / Parts здесь означает, что значение переменной All Stuff делится
на значение переменной Parts. Вне зависимости от результата деления функция
int обеспечивает на выходе целое число, отбрасывая дробную часть. Например,
число 17,9 будет округлено до 17. (Если вы возьмете значение 17,84563, все равно
получите 17. Количество десятичных цифр в дробной части здесь не играет никакой
роли.)
В фильмах
Flash числа часто используются при организации цикла. (Всестороннее рассмотрение
проблем, связанных с циклами, вы найдете в уроке 5.) Поскольку каждый шаг любого
цикла обычно выполняется целиком как единый шаг программы, некоторые создатели
фильмов в формате Flash считают, что все шаги цикла должны обозначаться только
целыми числами. Сходным образом, если вы вычисляете номер кадра, следует позаботиться
об округлении результата вычислений, поскольку в качестве номеров кадров также
используются целые числа (не может быть кадра 7,5).
СОВЕТ
ОКРУГЛЕНИЕ.
Если вам нужно, чтобы числа округлялись до ближайшего целого (то есть в большую
сторону, когда дробная часть числа больше или равна 0,5, и в меньшую сторону
в противном случае), следует применить логическое выражение. Как именно должно
выглядеть такое выражение и где его надо использовать, вы увидите в примере,
приведенном в конце этого урока. Имейте в виду, что лучше всего ваш компьютер
умеет обращаться именно с числами. Вы должны максимально задействовать его вычислительный
потенциал.
Вещественные
числа
Чтобы предотвратить
потерю дробной части числа и добиться большей точности, большинство программистов
применяют в работе вещественные числа (real numbers), или числа с
плавающей точкой (floating point numbers). По умолчанию все числа в сценариях
ActionScript рассматриваются именно как числа с плавающей точкой. Более того,
все целые числа в составе различных выражений представляются в форме чисел с
плавающей точкой, если отсутствует явное обращение к функции int. Рассмотрим
следующий пример.
whole = int(All Stuff / Parts);
SplitWhole =
whole / 7;
Если в результате
деления значения переменной whole на 7 получится дробное число, переменная SplitWhole
также получит дробное значение, несмотря на то что как whol e, так и 7 — числа
целые.
В ActionScript
объектом (object) называется любая коллекция свойств (properties). Вы
можете создавать собственные и использовать готовые, предопределенные объекты.
Каждое поле свойства обладает именем (name) и значением (value).
Например, у объекта может быть свойство с именем _rotation, обозначающее угол
поворота и способное принимать значения в интервале от О до 360. Кроме свойств
объекты могут располагать методами (methods), или действиями, выполняющими
те или иные вычисления или производящими определенные преобразования. К примеру,
у логических объектов существует метод, преобразующий логическую константу в
строку. Все вопросы, связанные с применением объектов, будут рассмотрены в уроке
8. Кроме того, целый ряд различных типов объектов будет появляться в других
уроках. Здесь мы рассмотрим лишь объекты-массивы.
Массивы
Массивом
(array) называется объект, содержащий несколько свойств. В общем случае
массивы можно считать коллекциями переменных — элементов массива, — снабженных
числовыми индексами. Каждый элемент представляет собой отдельное свойство; значением
элемента массива является строка, логическая константа или число, соответствующее
индексу этого элемента. Элементы массива нумеруются, начиная с нуля; индекс
последнего элемента на единицу меньше длины массива. Приведем пример массива
из шести элементов.
Friends[0]="Делия":
Friends[l]="Pn4apfl";
Friends[2]="Билл";
Friends[3]="Мелани";
Fnends[4]="Дэвид";
Friends[5]="Патрик";
Чтобы создать
массив, следует использовать объект Array. К примеру, массив, состоящий из перечисленных
выше элементов, можно организовать с помощью вызова конструктора new Array,
как показано ниже.
Friends=new
Аrrау('Делия". "Ричард". "Билл",
"Мелани",
"Дэвид", "Патрик");
Альтернативный
метод предполагает указание при создании нового массива лишь количества его
элементов с последующим присваиванием им соответствующих значений:
Friends=new Аггау(6);
Friends[0]="Делия";
Важность
роли, которую играют массивы, становится особенно очевидной, когда в сценарии
необходимо организовать цикл для ввода или пересылки некоторых данных. Объект
Array располагает целым рядом методов. Их характеристика приводится в табл.
2.2.
Таблица
2.2. Методы объекта Array
Метод concat() |
Описание Конкатенация
двух или нескольких массивов |
Пример Group = friends,
concat(neighbours) |
Результат Новый массив
group будет состоять из всех элементов массивов friends и neighbors |
||
join() |
Элементы массива
преобразуются в строки и конкатенируются с заданным разделителем |
pair= new Array
("Джо" , "Мэй"); together» pair.join("
* "); |
Переменная together
будет содержать строку Joe * Мае |
||
length |
Возвращает длину
массива без аргументов |
trio=new Array
("Король" , "Королева", "Принц"); royaWength.trio; |
Переменная royal
получает значение 3 |
||
Метод |
Описание |
Пример |
Результат |
||
рор() |
Удаляет последний
элемент из массива; используется без аргументов |
Landers=new
Array ("Спок", "Боунс", "Сулу", "Смит");
Zapped=landers.pop(); |
Переменная Zapped
будет иметь значение "Смит", а в массиве lenders остаются
только три элемента: "Спок", "Боунс" и "Сулу" |
||
push() |
Добавляет к
концу массива новый элемент и возвращает новое значение длины массива |
usTwo= new Array
("Мэй", "Ларри"); опеМоге=usTwo.рush("Керли"); |
Переменная опеМоге
получает значение 3, а массив usTwo будет содержать три элемента:
"Мэй", "Ларри" и "Керли" |
||
reverse() |
Инвертирует
порядок следования элементов массива |
right= new Array
("Хуан", "Чуи","Тереза"); rightreverse(); |
В массиве right
будут содержаться три элемента, причем порядок их следования таков:
"Тереза", "Чуй", "Хуан" |
||
shift() |
Удаляет первый
элемент массива и возвращает этот элемент |
adios=new Array
("рэп", "свинг", "опера"); diglt=adios.shift(); |
После выполнения
метода shift в массиве adios будут два элемента: "свинг"
и "опера", а переменная digit будет иметь значение "рэп" |
||
slice (start,
end) |
Исходный массив
не меняется, но из него берется подмассив с элемента с индексом start
до элемента с индексом end (исключая последний). Для получения всех
элементов массива, начиная с элемента с индексом start, значение параметра
end следует опустить |
Pizza=new Array
("грибы", "килька", "маслины"); piece=pizza.slice(0,2); |
Массив piece
будет состоять из двух элементов: "грибы" и "килька".
Содержимое массива pizza не меняется |
||
sort() |
Сортировка элементов
массива |
bakeArray=new
Array ("M", "B", "D","P");
chooseEm=bakeArray.sort(); |
Массив chooseEm
содержит элементы исходного массива в алфавитном порядке: "В",
"D", "М" и "Р" |
||
Метод |
Описание |
Пример |
Результат |
splice (start,
deleteN, v0 vl...vN) |
Удаляет заданное
параметром deleteN число элементов массива, начиная с элемента с индексом
start, а также добавляет к массиву элементы v0 — vN на место удаленного |
weather=new
Array ("дождь", "снег", "мокрый снег",
"град"); weather.splice(3, 1, "хорошая погода"); |
В результате
вызова метода splice четвертый элемент массива weather — строка "град"
(не забудьте, что нумерация начинается с 0) — удаляется, а строка
"хорошая погода" добавляется к массиву. В результате он
будет состоять из четырех элементов: "дождь", "снег",
"мокрый снег" и "хорошая погода" |
unshift (v0) |
Ничего не удаляя,
размещает в начале массива новый элемент и возвращает новое значение
длины |
pigHouse=new
Array ("солома", "древесина", "кирпич");
a=pigHouse. unshift ("сталь"); |
Массив pigHouse
будет состоять из элементов "сталь", "солома",
"древесина" и "кирпич". Переменная а получает
значение 4 |
В языке ActionScript
существует особый тип данных для представления клипов. Это единственный тип
данных, который обеспечивает ссылку на графическую информацию. Так же как у
массивов, у объекта клипа MovieClip есть особые методы. В последующих уроках
вы будете периодически сталкиваться с объектами MovieClip; подробные сведения
о работе с ними будут предоставляться по мере необходимости. В целом можно сказать,
что клипы чаще выступают объектами, на которые направлено воздействие со стороны
других объектов, нежели источниками команд для иных объектов. Клипы способны
лишь отдавать команды другим клипам и переходить к определенным кадрам. Ниже
приводится несколько примеров, связанных с использованием объектов MovieClip.
В этих примерах экземпляр flame представляет собой ссылку на некоторый клип.
f1ame.gotoAndStop(
8 );
flame.gotoAndPlay(6);
flame.play();
flame.stop():
flame.nextFrame();
Один
из важнейших элементов клипа — это имя его экземпляра. Множество оши-бок в сценариях
ActionScript связано с тем, что разработчики забывают включить в текст сценария
имя экземпляра. Это имя не обязано совпадать с меткой клипа. Чтобы поставить
в соответствие всем клипам определенные имена экземпляров, следует воспользоваться
средствами панели Instance (Экземпляр). Рекомендуется позаботиться о назначении
имени экземпляра сразу по завершении работы над клипом.