...
Совет
Все переменные, использованные в этом уроке и в остальной книге, это глобальные переменные. Это значит, что после того как вы их задали, к ним можно обращаться из ролика или других клипов. Также с помощью ключевого слова "var" вы можете определить локальные переменные. Локальные переменные, определенные в какой-либо функции, недоступны к использованию в остальном коде. Как локальную переменную, например, удобно определять счетчик цикла, используемого внутри функции.
Урок 9. Выполнение операций
Вам наверняка понадобится изменять данные, хранящиеся в переменной. Мы уже рассматривали, как с помощью команд ++ или += изменять значение переменной. В вашем распоряжении также имеется большой набор других операций.
Давайте начнем с переменных, содержащих числа. Вы можете выполнять большое количество математических операций с числами при помощи символов +, -, / и *. Приведем несколько примеров.
Допустим, у вас есть две переменные: а и b. Вы можете сложить их и поместить результат в переменную с.
a = 7;
b = 5;
c = a + b;
В предыдущем примере с будет в результате содержать число 12. Вот еще один подобный пример:
c = a – b;
c = a * b;
c = a / b;
Переменная с получит значение 2 в первой строке, 35 – во второй строке и 1,4 – в третьей строке. Вы также можете выполнять более сложные математические операции при помощи специальных функций, встроенных во Flash. Все они содержатся в объекте Math, за которым следует точка и имя функции. Например, при помощи функции Math.sqrt можно вычислить квадратный корень числа:
a = 9; b = Math.sqrt(a);
Значением b является 3 – квадратный корень из 9.
Один из важнейших элементов компьютерного языка, позволяющий программистам создавать игры, – генератор случайных чисел. Без случайных чисел игры были бы полностью предсказуемыми и скучными.
Flash генерирует случайные числа при помощи функции Math.random(). При этом генерируются случайные десятичные значения между 0.0 и 1.0. Нужные числа получают, умножая данные значения на целое число, а затем переводя их в целое число при помощи функции int. Например, следующая строка служит для генерации случайного числа от 0 до 9:
myRandomNumber = int(Math.random()*10);
Другие математические функции будут рассмотрены по мере их появления в примерах. Функции могут применяться и к строкам. Например, для объединения двух строк может использоваться символ +:
a = "Hello";
b = "World";
c = a + b;
В итоге переменная с превратится в строку "HelloWorld". Обратите внимание на то, что между двумя этими словами нет пробела. Вам следует дать Flash команду ввести пробел. В результате следующий код создаст "Hello World":
a = "Hello";
b = "World";
c = a + " " +b;
Более простым способом объединения двух строк является использование синтаксических элементов +=:
a = "Hello"; b += "World";
Теперь, когда вы узнали больше о переменных и их использовании, рассмотрим, как с помощью ActionScript организовать выполнение кода по условию.
Урок 10. Условные выражения
Из урока 5 "Создание кнопок для пользователя" вы узнали, как пользователь может использовать кнопки для перехода от одного кадра к другому. Пользователь решает, какую часть ролика он хочет увидеть следующей, щелкает по кнопке, и сценарий, приписанный данной кнопке, отправляет ролик в соответствующий кадр.
ActionScript также может принимать решения. Эти решения основываются на сравнении значений, которое осуществляется при помощи оператора if. Например, могут сравниваться два значения. Если они равны, программа отреагирует на это определенным образом.
Приведем пример программы, которая сравнивает переменную со значением. Если значение удовлетворяет условию, код внутри фигурных скобок выполняется. В противном случае программа пропускает его.
if (a == 7) {
GotoAndPlay("special frame");
}
Символ == используется для установления тождественности двух значений. Если значения равны, условие верно. Если нет, условие ложно. Задача оператора if состоит в проверке верности условия. Если это условие верно, код в фигурных скобках выполняется. Вы можете продлить выражение if и задать, что при невыполнении данного условия должно совершаться определенное действие. Используя оператор else после оператора if, вы можете включить еще один набор фигурных скобок, в которых будет задано какое-либо действие при невыполнении условия:
if (a == 7) {
gotoAndPlay("special frame");
} else {
gotoAndPlay("another frame");
}
Выражение if может быть длинным и включать несколько проверок условий. Выполняется код, следующий за первым верным условием. Если ни одно условие не является верным, выполняется код, следующий за оператором else.
if {a == 7) {
gotoAndPlay("special frame");
} else if (a == 12) {
gotoAndPlay("very special frame");
} else if (a == 15) {
gotoAndPlay(" extremely special frame");
} else {
gotoAndPlay("a not so special frame");
}
Символ == может также использоваться для сравнения двух строк. Например, для того чтобы определить, содержит ли переменная username строку "Gary", вы можете использовать следующий код:
if (username == "Gary") {
Кроме символа ==, определить, будет ли одно число соответственно меньше или больше другого, помогут символы < и >, а символы <= и >= указывают, будет ли число меньше или равно или больше или равно другому числу. Данные символы могут использоваться и при сравнении строк, в этом случае они производят сравнение исходя из алфавитного порядка. У вас есть возможность одновременно выполнять несколько сравнений. Например, вы можете проверить, равно ли значение а определенному числу, а username определенной строке:
if ((a == 7) and (username == "Gary")) {
Предыдущая строка верна только при выполнении обоих условий. Выполнение одного из условий можно проверить при помощи оператора or:
if ((a == 7) or (username == "Gary")) {
Выражения if являются основными элементами всех программ. Они могут использоваться для изменения переменных, перехода к другим кадрам, а также для того, чтобы определить выигрыш или проигрыш игрока. Другим важным элементом программы являются циклы, которые рассматриваются в следующем разделе.
Урок 11. Циклы
Условные выражения являются необходимым элементом программирования; не менее важный элемент – циклы.
Компьютеры превосходно выполняют повторяющиеся задания. Во Flash этими заданиями являются циклы. Наиболее распространенная их разновидность – цикл for. Он позволяет выполнять задание определенное количество раз. Приведем пример цикла for:
for(i=0;i<10;i++)
trace(i);
}
...
Примечание
Традиционным для программирования является использование переменной i в качестве счетчика циклов программы. В данном случае i обозначает increment (приращение). Это неплохая идея – всегда давать переменной имя, обозначающее выполняемую ей функцию. В циклах for, как правило, используется именно переменная i.
На первый взгляд цикл for кажется довольно сложным. Он состоит из трех частей, разделенных точкой с запятой. Первая часть позволяет задавать определенное значение переменной. В данном случае переменной i присвоено значение 0.
Вторая часть синтаксической структуры for проверяет выполнение условия, аналогично тому, как это делалось в конструкци if. В нашем случае условие ложно, если i меньше 10.
Третья часть синтаксиса for показывает, как должна изменяться переменная в каждом новом цикле. В данном случае i каждый раз увеличивается на 1.
Результатом является следующий цикл: в начале переменная i имеет значение 0, в каждом цикле это значение увеличивается на 1, цикл заканчивается, когда переменная достигает значения 10. Таким образом, значение переменной i изменяется с 0 до 9 за 10 шагов. Если запустить вышеописанный код, вы увидите в окне Output цифры от 0 до 9.
...
Совет
Циклы for применяются для обработки данных внутри программ, а не для анимации объектов на экране. Пока выполняется цикл, на экране ничего не происходит. Короткие циклы, наподобие предыдущего примера, выполняются настолько быстро, что не оказывают никакого влияния на ролик. Однако длинные циклы могут задерживать воспроизведение ролика на несколько секунд и больше.
Приведем более распространенный пример цикла for. Предположим, у вас есть 10 клипов с именами "fox1" – "fox10", и вы хотите передвинуть их на 1 пиксел влево. Это действие будет выполнено при помощи следующего цикла:
for(i=0;i<10;i++) {
_root["fox"+i]._x++;
}
Цикл меняет значение переменной i от 1 до 10. В нем применяется объект _root, с которым вы познакомились в уроке 7 "Возможность контроля клипов пользователем". Вы можете обратиться к любому клипу главной временной шкалы при помощи объекта _root[] с именем клипа внутри скобок. В данном случае код представляет собой строку, состоящую из слова "fox" и числа i. Есть еще два способа создания циклов в ActionScript. Первый – это цикл while. В отличие от счетчика приращения (например, i ), цикл while продолжает выполняться до тех пор, пока условие в начале выражения while верно. В цикле do, наоборот, условие находится в конце цикла. Разница в том, что если применяется вариант while, цикл может ни разу не выполниться, а в случае do он всегда выполняется один раз. Начинающие программисты на ActionScript нечасто используют подобные циклы, однако их необходимо знать.
Урок 12. Текст и строки
Использовать числа в ActionScript несложно. Вы можете прибавлять, вычитать и выполнять другие операции с числами. Со строками также можно выполнить множество операций. Операции со строками являются важным шагом в изучении программирования.
Одна из простейших операций над строками – их объединение. Мы рассмотрели ее в уроке 9 "Выполнение операций". В уроке 10 "Условные выражения" вы сравнивали строки для того, чтобы определить их тождественность и порядок следования.
Теперь давайте рассмотрим еще несколько строковых функций. Предположим, вы хотите узнать, включает ли одна строка другую. Для этого существует команда indexOf, определяющая положение первого символа второй строки внутри первой. Если вторая строка не найдена, результатом выполнения команды будет значение -1. Например, следующий код находит строку "World" в строке "Hello World" на шестой позиции, то есть там, где находится буква "W" (считая от 0). Если же вы зададите поиск "Earth", вы получите значение -1, так как этого слова в сочетании "Hello World" нет.
myString = "Hello World."; myPosition = myString.indexOf("World");
...
Совет
При ссылке на положение символа ActionScript начинает отсчет с 0. Строка "Hello" будет находиться в положении 0 строки "Hello World"
При помощи команды length вы можете узнать количество символов в строке:
myString = "Hello World."; myStringLength = myString.length;
Иногда необходимо получить определенную часть строки. Для этого существуют две команды. Команда substring задает часть строки от одного положения символа до другого. В данном примере результатом выполнения команды является текст "lo Wo":
myString = "Hello World."; mySubstring = myString.substring(3,8);
Эту же задачу выполняет функция substr. В отличие от предыдущей команды она задает начальную позицию отрезка и количество содержащихся в нем символов. Следующий код задает строку, которая начинается с третьего символа и состоит из пяти символов:
myString = "Hello World."; mySubstring = myString.substr(3,5);
У нас есть уже две функции, выполняющие практически одну и ту же задачу. Почему бы не ввести и третью? Функция slice полностью аналогична substring.
Созданный текст вам нужно будет показать пользователю. Это очень легко. В главе 1 "Элементы Flash для создания игр" вы познакомились с динамическим текстовым полем. Когда вы преобразуете текст в динамический в панели Properties, вы можете в поле Var присвоить ему имя.
На рис. 2.11 изображена панель Properties, в которой динамическому текстовому полю присвоено имя mySubstring. Пока переменная и текстовое окно находятся на одном уровне Flash, панель будет отображать содержимое переменной mysubstring. Если же эти элементы находятся на разных уровнях, например один из них является частью клипа, они не будут связаны.
Рисунок 2.11 . Панель Properties может использоваться для связи текстового окна с переменной ActionScript
Переменная может также быть связана с редактируемым текстом. В данном случае при изменении переменной соответственно изменяется содержимое текстового окна и наоборот. В следующем уроке мы рассмотрим функции, а также пример динамического текстового окна.
Урок 13. Создание функций
Функция – это часть кода, которая может быть использована многократно. Вы можете передавать в нее несколько значений и получать из нее новые. Примером является функция, выдающая сумму двух чисел. Вот как она будет выглядеть в ActionScript:
function sum(a, b) {
c = a + b;
return c;
}
Обычно функции помещаются в сценарии кадра главной временной шкалы. Функция задается при помощи ключевого (зарезервированного) слова function. Затем указывается имя функции, за которым следуют круглые скобки и открытая фигурная скобка {. Круглые скобки могут быть пустыми или содержать список переменных, задаваемых при вызове функции. Эти переменные называются параметрами функции (или аргументами). Например, предыдущая функция может быть вызвана следующим образом:
trace (sum(7, 12));
Результатом обращения к функции будет число 19, помещаемое командой trace в окно Output. При обращении к функции sum значение 7 передается в функцию как переменная а, а значение 12 – как переменная b. После выполнения функции команда return посылает значение c обратно к sum. Таким образом, для выполнения своей функции команда trace использует результат sum(7, 12) – число 19.
Функции используются по двум причинам. Первая – это возможность разделить программу на более мелкие части. Программу, состоящую из 30 строк и выполняющую три различные задачи, можно заменить на три функции, состоящие из 10 строк, каждая из которых выполняет свою задачу. Это значительно облегчает работу с кодом.
Другой причиной является возможность их повторного и неограниченного использования. Таким образом, если определенная часть кода используется несколько раз, вы можете поместить ее в функцию, которую затем будете постоянно вызывать, изменяя ее входные параметры.
Исходный файл: Framelabeler.fla Приведем пример функции, использующей в качестве входного параметра имя метки кадра. Она выполняет две задачи. Во-первых, помещает имя в текстовую переменную textFrameLabel. Это текстовое окно видно пользователю при воспроизведении ролика, оно информирует пользователя о том, в каком кадре он находится в данный момент. Второй задачей функции является выполнение команды gotoAndStop – переход к определенному кадру и остановка воспроизведения.
function gotoFrame(frameLabel) {
frameLabelText = frameLabel;
gotoAndStop(frameLabel);
}
Функция помещается в первый кадр главной временной шкалы вместе с командой, задающей переход ролика к начальному кадру. Так как ролик уже находится в первом кадре, команда gotoAndStop просто останавливает ролик.
gotoFrame("introduction");
В примере Framelabeler.fla функция содержится в первом ключевом кадре. К каждому из пяти кадров пользователь может перейти при помощи кнопок, расположенных в нижней части экрана. Вместо команды gotoAndStop все кнопки обращаются к команде gotoFrame.
На рис. 2.12 показан пример ролика. В верхнем левом углу рабочего поля находится область динамического текста. Временно он содержит слова "frame label". При первом обращении к функции gotoFrame они будут заменены на "introduction".
Рисунок 2.12. Ролик состоит из пяти кадров и пяти кнопок для перехода к каждому кадру. Текстовое окно отображает имя текущей метки кадра
Преимущество использования одной функции для контроля всей навигации заключается не только в меньшем количестве нажатий на клавиши при программировании. Предположим, что к моменту завершения программы вы 100 раз обратились к функции gotoFrame. Затем вы решили удалить окно textFrameLabel или немного изменить его. Если бы вы не использовали функцию, то вам пришлось бы удалять или изменять код в 100 местах. Но так как все ваши навигационные кнопки используют функцию gotoFrame, то для изменения их поведения достаточно изменить только ее.