В этом уроке
мы с вами будем манипулировать числовыми и
текстовыми данными, составляя выражения.
Внимание!
Для работы с этим уроком необходимы учебные
файлы, которые Вы можете загрузить
здесь.
Этот
интерактивный "преобразователь температур"
будет манипулировать данными, переводя
значения температуры по шкале Фаренгейта в
значения по Цельсию.
Типы данных
Если вы
выполнили все предыдущие уроки, то уже знакомы
со всеми типами данных. Однако мы ни разу не
рассматривали их все сразу, а потому давайте
сделаем краткий обзор.
- Строка.
Этот тип данных служит для представления
текста, символьных значений; в скриптах
строковые значения заключаются в кавычки (например,
"hello", "собака").
- Число.
Числа – это числа, в скриптах они
указываются без кавычек. Например,
6 означает
число шесть, а "6"
(в кавычках) – текст, это строковое значение.
Очень важно понимать разницу между этими
двумя типами данных. особенно при
использовании их в выражениях. Например, в
выражении с оператором сложения (+,
подробнее см. в разделе "Операторы")
"6"+"2" даст
строку "62", а
6+2 (без
кавычек) даст число 8.
- Булевы,
или логические значения. Булево значение
может принимать одно из двух состояний:
true (истинно)
или false (ложно).
Внутри ActionScript
true и false
представлены как 1 и 0.
- Объект.
Объекты служат "устройствами" для хранения
данных любых типов, в том числе других
объектов. Также объекты имеют свойства и
методы, позволяющие управлять ими и
использовать их для выполнения различных
задач. Обзор типов объектов и способов их
использования вы найдете в Уроке 4 – Объекты
и их использование.
В этом уроке
мы сосредоточимся на манипулировании данными
строкового и числового типов.
Построение
выражений
Выражение –
это определенный набор переменных, значений и
операторов для вычисления некоторого итогового
значения. Рассмотрим пример выражения:
oneDozen = 6
* 2;
Справа от
знака равенства мы видим
6 * 2 – это и есть выражение. При
выполнении этой строки ActionScript заменит
выражение результатом умножения 6 на 2, и
oneDozen получит значение 12. Выражения могут
также содержать переменные, массивы, вызовы
функций – все это служит для вычисления
итогового результата. Например:
total =
subTotal + tax;
Здесь
значением total станет результат сложения
переменных subTotal
и tax;
subTotal + tax – это выражение.
discount =
totalPrice * employeeDiscount[2];
Здесь значение
discount
получается как результат умножения переменной
totalPrice на
значение третьего элемента массива
employeeDiscount;
totalPrice *
employeeDiscount[2] есть выражение.
usDollars =
10;
japaneseYen = convertToYen(usDollars);
Здесь
japaneseYen
получает значение, возвращенное функцией
convertToYen() –
вызов функции сам по себе является выражением.
Примечание
Подробнее о функциях смотри Урок 5 – Применение
функций.
Где
применяются выражения:
-
Присвоение значений переменным
-
Присвоение значений элементам массивов
-
Установление условий (с помощью операторов
сравнения)
-
Динамическое указание имен фильмов-символов,
переменных и объектов
-
Динамический вызов функций
- Прочее
Использование
выражений позволяет избежать жестко
закодированных значений, которые, будучи раз
установлены, не изменяются ни при каких
обстоятельствах. Манипулирование данными
посредством выражений позволяет добавить
скриптам динамичности, а проектам –
интерактивных возможностей. Вероятно, вы уже
поняли, что большинство скриптов построено на
использовании выражений.
Операторы
Операторы –
это "знаки" внутри выражений, именно они
управляют вычислениями, указывают, что следует
делать с входящими в состав выражения значениями.
Операторы бывают различных типов; какие
использовать – зависит от того, как именно вы
хотите манипулировать данными.
Примечание
В этом разделе рассматриваются арифметические
операторы. Информацию об операторах сравнения и
логических операторах вы найдете в Уроке 9 –
Использование логических условий.
Арифметические
операторы
Большинство
арифметических операторов вам знакомо – даже
если вы никогда не сталкивались ни с
ActionScript, ни с программированием вообще. В
выражениях эти операторы служат для манипуляций
с числовыми значениями.
-
Оператор сложения (+). Служит для
сложения двух чисел. Пример:
totalCost =
productPrice + tax; – результат
получается сложением значений двух
переменных.
-
Оператор инкремента (++). Прибавляет к
значению единицу. Пример:
++myAge; –
значение переменной
myAge увеличивается на 1 (эквивалент
выражения myAge =
myAge + 1;).
-
Оператор вычитания (-). Служит для
вычитания одного значения из другого.
Пример:
moneyInWallet = paycheck – moneySpent;
– результат получается вычитанием
moneySpent из
paycheck.
-
Оператор декремента (--). Уменьшает
значение на единицу. Пример:
--bottlesOfBeer;
– бутылок пива станет на одну меньше.
-
Оператор умножения (*). Умножает одно
числовое значение на другое. Пример:
hoursPer-Week = 24 *
7; – количество часов в неделе
получается в результате умножения 24 на 7.
-
Оператор деления (/). Делит одно число
на другое. Пример:
hourlyRate = paycheck
/ hoursBilled; – итог получается
делением значения
paycheck на значение
hoursBilled.
-
Оператор нахождения остатка от деления (%).
Выдает остаток от деления одного целого
числа на другое. Пример:
4 % 2; – результатом будет 0,
поскольку 4 делится на 2 без остатка.
Пример: 7 % 3; – даст результат 1, так
при делении 7 на 3 получается 2 и остаток 1.
Строковые
операторы
Для операций
со строками имеется лишь один оператор –
оператор конкатенации (впрочем, манипулировать
строковыми значениями можно еще и с помощью
различных методов объекта String). Другие
операторы (присвоения и сравнения) хотя и могут
работать со строковыми значениями, но не
манипулируют непосредственно самой строкой (подробнее
об операторах сравнения – в Уроке 9,
Использование логических условий.
-
Оператор конкатенации (+). Конкатенацией
называется соединение, "склеивание" двух
строк. Оператор конкатенации, который
обозначается знаком +, как и оператор
сложения чисел, объединяет два строковых
значения в одну строку. Пример:
burthDayMessage = "Мне
исполнилось " + age + " лет.";. Здесь
операторы конкатенации соединят три части
сообщения вместе; если
age имеет
значение 26, то в результате получится
строка "Мне
исполнилось 26 лет.".
Совет В
отличие от некоторых других языков
программирования, в ActionScript не требуется
при создании переменной объявлять, значение
какого типа она будет содержать. В зависимости
от контекста срока может рассматриваться как
число и наоборот. В этом есть свои преимущества,
но из-за этого же могут возникнуть и проблемы.
Дело вот в чем. Поскольку знак "плюс" (+) служит
для обозначения сразу двух операторов – сложения
чисел и конкатенации строк, Flash должен знать,
с какими значениями он имеет дело – со строками
или числами. При этом могут возникать
недоразумения, особенно если данные загружаются
из внешних источников. Например, Flash в
выражении вроде PayCheck1
+ PayCheck2 может посчитать два числа
строками, и, вместо того, чтобы складывать, "склеит"
их (45+65 даст результат "4565" вместо 110). При
получении данных из внешних источников или полей,
в которые информацию вводит пользователь вы
можете, во избежание ошибок, использовать
функцию Number() – например,
Number(PayCheck1) +
Number(PayCheck2) – в этом случае вы
можете быть уверены, что значения будут
рассматриваться именно как числовые.
Приоритет
Нередко
выражения содержат не один оператор, а сразу
несколько. В этом случае важно точно
представлять себе порядок их выполнения, который
определяется приоритетом операторов. Вы
прекрасно знаете, что математические действия
над числами выполняются поочередно (например,
возьмем выражение
myNumber = 20 * 5 - 3: понятно, что
нельзя произвести оба действия – умножение и
вычитание – одновременно). Порядок вычислений в
выражениях ActionScript определяется следующими
правилами приоритета:
- Все
вычисления в скобках выполняются раньше, чем
вычисления вне скобок. Если вы хотите точно
контролировать порядок вычислений в своих
выражениях, используйте скобки.
- Действия
умножения и деления выполняются раньше, чем
сложение и вычитание. Между собой умножение
и деление имеют равный приоритет, и потому,
если в выражении имеется несколько таких
операторов, они выполняются (при отсутствии
скобок) по порядку следования слева направо.
- Сложение
и вычитание выполняются в последнюю очередь.
Эти действия имеют равный приоритет, они
выполняются (при отсутствии скобок) по
порядку следования слева направо.
Давайте
рассмотрим несколько примеров.
myVariable =
5 + 7 - 3;
Поскольку
сложение и вычитание имеют равный приоритет, в
этом выражении операторы выполняются просто
слева направо, переменной
myVariable в результате будет присвоено
значение 9.
myVariable =
5 + 7 * 3;
Поскольку
умножение имеет приоритет перед сложением,
сначала 7 умножается на 3, а затем к результату
прибавляется 5. В итоге переменная
myVariable
получает значение 26.
myVariable =
(5 + 7) * 3;
Поскольку
вычисления в скобках имеют приоритет, сначала 5
прибавляется к 7, затем результат умножается на
3. В итоге переменная
myVariable получает значение 36.
myVariable =
((2 + 8) * (4 – 2)) / 5;
Снова
приоритет скобок: сначала складываются числа 2 и
8, затем из 4 вычитается 2. Эти два результата
перемножаются, итог делится на 5. Переменной
myVariable
присваивается значение 4.
Манипуляция с
числовыми данными с помощью объекта Math
Математические
операторы, С которыми мы познакомили вас в этом
уроке, позволяют строить выражения с
использованием простых арифметических действий.
Для более сложных манипуляций с числами во Flash
имеется объект Math
с его методами. Здесь мы познакомим вас лишь с
некоторыми, наиболее часто используемыми
методами объекта Math;
в других уроках этой книги вам встретятся и
многие другие методы.
Наиболее
часто применяемые методы объекта Math:
-
Math.abs() Метод возвращает абсолютное
значение (модуль) числа. Пример:
distance =
Math.abs(here – there); – если
результатом вычитания
there из here
будет отрицательное число (например, -375),
метод Math.abs
преобразует его в абсолютное значение –
положительное (375).
-
Math.round() Этот метод округляет число
до целого. Если после десятичной запятой
стоит число 5 или более, то округление
происходит в большую сторону, если меньше 5
– в меньшую. Пример:
cupsOfCoffee =
Math.round(3.7); – поскольку после
запятой стоит 7 (больше 5), число
округляется в большую сторону, результатом
будет 4.
-
Math.floor() Метод действует подобно
Math.round(),
но в этом случае округление всегда
производится в меньшую сторону.
-
Math.ceil() Метод тоже действует подобно
Math.round(),
но округление всегда производится в большую
сторону.
-
Math.sqrt() Метод извлекает из числа
квадратный корень. Пример:
answer =
Math.sqrt(9); – здесь
answer получит
значение 3.
В этом
упражнении мы, используя операторы, выражения и
методы объекта Math,
напишем несложный алгоритм преобразования
значений температуры по шкале Фаренгейта в
значения по шкале Цельсия. Заодно
запрограммируем изображение термометра с
соответствующим уровнем ртути.
-
Откройте файл tempConverter1.fla из папки
Lesson08/Assets.
Все символы и
текстовые поля уже созданы и размещены на сцене,
нам остается сосредоточиться на ActionScript.
Основной монтажный стол состоит из четырех
слоев: Actions, Thermometer, Temperature Input и
Background.
Слой
Background содержит основное фоновое
изображение. В слое Temperature Input находится
текстовое поле для ввода, его имя –
temperature. Сюда
будут вводиться значения температур для
преобразования. Кроме этого поля, в данном слое
имеется еще два:
fahrenheit и
celsius – в них будут отображаться
соответствующие значения температур. В этом же
слое находится кнопка с надписью "Convert". Слой
Thermometer содержит экземпляр фильма-символа с
именем mercury, он
будет иллюстрировать уровень ртути в термометре.
Мы же сейчас займемся слоем Actions.
-
Откройте панель Действия, выделите кадр 1
слоя Actions и введите следующий скрипт:
function
changeTemp() {
}
Это – начало
описания функции. Функция эта будет вызываться
при нажатии кнопки Convert, и выполнять она
должна будет следующие задачи:
- Перевести
значение по Фаренгейту в шкалу Цельсия.
-
Убедиться, что введенное значение (по
Фаренгейту) укладывается в диапазон
термометра.
-
Установить "уровень ртути" в термометре на
нужную высоту.
- Внутри
описания функции создайте две переменные:
boilingPoint
= 212;
absoluteZero = -460;
Наш термометр
работает в большом диапазоне температур – от
абсолютного нуля (примерно -460 градусов
Фаренгейта) до точки кипения воды (212 градусов
Фаренгейта), это будут максимально и минимально
возможные значения для нашего конвертера.
- После
строки absoluteZero = -460; поместите блок,
проверяющий, укладывается ли введенное
значение в установленные пределы:
if
(temperature.text > boilingPoint) {
temperature.text = boilingPoint;
} else if (temperature.text < absoluteZero)
{
temperature.text = absoluteZero;
}
fahrenheit.text = temperature.text;
Эта часть
функции – оператор
if/else if – будет работать "фильтром"
данных. Если значение, введенное пользователем (temperature.text),
больше, чем значение
boilingPoint (которое равно 212), то
вместо введенного пользователем будет
автоматически установлено значение
boilingPoint. В
противном случае, если пользователь ввел
значение, меньшее, чем
absoluteZero (-460), вместо него
автоматически устанавливается значение
absoluteZero.
После фильтрации значение
temperature.text отображается в
экземпляре текстового поля
fahrenheit.
Подобные
фильтры часто используются в программировании –
ведь далеко не всякая функция может принимать
абсолютно любые значения параметров.
- После
строк, добавленных на предыдущем шаге,
вставьте следующее выражение, переводящее
значения по Фаренгейту в шкалу Цельсия:
celsius.text
= Math.round((5 / 9) * fahrenheit.text -
17.777);
Выражение
справа от знака равенства переводит значение
температуры из одной шкалы в другую. Результат
выражения присваивается свойству
text текстового
поля celsius;
таким образом, данная строка отображает
преобразованное значение в текстовом поле.
Обратите
внимание на использование скобок в этом
выражении. Выполняя эту строку кода, Flash
начнет производить вычисления с самой внутренней
пары скобок – в данном случае (5 / 9). Затем
будет выполнено умножение, затем – вычитание.
Метод Math.round()
будет вызван только после того, как будет
окончательно вычислено числовое значение
аргумента. Это значение метод округлит до
ближайшего целого числа.
- После
предыдущей строки добавьте следующие:
scalePercent
= (Math.abs(absoluteZero - fahrenheit.text)
/
Math.abs(absoluteZero - boilingPoint)) * 100;
mercury._yScale = scalePercent;
В этих двух
строках создается переменная, содержащая
процентное значение для масштабирования
экземпляра фильма-символа
mercury, затем устанавливается такой
масштаб.
Значение
scalePercent
вычисляется на основе отношения двух значений:
превышения введенной температуры над абсолютным
нулем и полного температурного диапазона. Чтобы
вы лучше это поняли, давайте предположим, что
пользователь ввел в текстовое поле
fahrenheit
значение 56. Мы знаем, что
absoluteZero
равняется -460,
boilingPoint равняется 212. Вычисления
будут происходить следующим образом:
(Math.abs(-460 - 56) / Math.abs(-460 - 212))
* 100;
далее
(Math.abs(-516) / Math.abs(-672)) * 100;
далее
((516) /
(-672)) * 100;
далее
(.767) * 100;
далее
76.7
Примененный
здесь метод объекта Math,
вычисляющий абсолютное значение дает нам
уверенность в том, что мы получим в итоге
положительное процентное значение (отрицательное
значение в контексте нашего скрипта не имело бы
смысла).
Вторая строка
скрипта устанавливает масштаб по вертикали для
экземпляра фильма-символа
mercury равным значению
scalePercent. Так,
если оно равно 76,7, то экземпляр
mercury уменьшится
до 76,7 процента от своего нормального размера
(100 процентов).
-
Выделите кнопку Convert и введите в панели
Действия следующий скрпит:
on (release,
keyPress "<Enter>") {
changeTemp();
}
При нажатии
этой кнопки или клавиши Enter будет вызвана
функция changeTemp(),
которую мы только что создали.
-
Выполните команду Управление > Проверить
фильм (Control > Test Movie). Введите
значение температуры и нажмите кнопку.
После нажатия
кнопки вы увидите, что высота фильма-символа
mercury
соответствующим образом уменьшилась. Текстовые
поля celsius и
fahrenheit
заполнились данными. Если вы попытаетесь ввести
температуру, выходящую за установленные нами
пределы, то сработает фильтр – оператор
if/else if, и
значение будет "обрезано" по верхней или нижней
границе.
-
Закройте тестовый фильм и сохраните свою
работу как tempConvert2.fla.
Итак, мы
разобрались с арифметическими операторами и
научились пользоваться методами объекта Math.
Манипуляции со
строками
До сих пор в
этом уроке мы имели дело главным образом с
числами. Теперь пришло время получше узнать
методы объекта String, с которым вы
познакомились в Уроке 4. При помощи этих методов
можно найти в строке определенный символ,
изменить регистр символов, "перевернуть" строку
задом наперед и много чего еще.
Вот
несколько наиболее часто используемых методов
объекта String:
- length
Свойство объекта String, содержащее значение
количества символов в строке. Пример:
numCharacters =
userName.length; – здесь значением
numCharacters
станет число символов в строковой переменной
userName. Если
userName имеет
значение "Jobe", результат будет 4.
-
substr(start, length) Метод возвращает
часть строки, основываясь на двух параметрах:
стартовом индексе и длине (число символов,
включая стартовый). Если параметр
length не
указан, то возвращается подстрока от
стартового символа до конца строки.
Пример:
name.substr(1, 2); – если
name имеет
значение "Kelly", метод даст результат "el".
Буква e имеет индекс 1, число 2 указывает,
что подстрока должна включать два символа.
-
toLowerCase() Этот метод переводит все
символы строки в нижний регистр. Пример:
message.toLowerCase();
– если message
имеет значение "Hello", то результатом будет
"hello".
-
toUpperCase() Этот метод переводит все
символы строки в верхний регистр. Пример:
message.toUpperCase();
– если message
имеет значение "Hello", то результатом будет
"HELLO".
Примечание
Как упоминалось в Уроке 4, свойство
text экземпляров
текстовых полей тоже рассматривается как
экземпляр объекта String, а значит, к нему
применимы и все методы этого объекта. Например,
myTextField.text.toUpperCase(); переведет
текст в текстовом поле
myTextField в верхний регистр.
В следующем
упражнении мы создадим приложение,
представляющее собой нечто вроде игры в слова. В
нем нужно будет заполнить форму словами, из
которых будет сформировано предложение.
-
Откройте madlibs1.fla из папки
Lesson08/Assets.
В этом файле
три слоя: Background, Text Fields и Actions.
Слой Background содержит основное графическое
оформление. В слое Text Fields находится пять
текстовых полей для ввода, одно динамическое
текстовое поле и кнопка Submit. А со слоем
Actions v сейчас поработаем.
Пять текстовых
полей для ввода называются (сверху вниз)
verb1, properNoun, verb2,
adjective и noun.
В них пользователь должен будет вводить слова (соответственно:
первый глагол, имя собственное, второй глагол,
прилагательное и существительное), из которых
будет генерироваться предложение. Текстовое поле
большего размера, расположенное в правой нижней
части сцены, называется
paragraph; в нем и будет отображаться
составленное предложение.
-
Откройте панель Действия, выделите кадр 1
слоя Actions и введите следующий скрипт:
function
generate() {
}
Это – начало
описания функции. Функция будет вызываться при
нажатии кнопки Submit. В окончательном виде
функция должна будет взять все введенные
пользователем слова, изменить их при
необходимости и составить с этими словами
предложение.
- В
описание функции generate() вставьте
следующие четыре строки:
verb1.text =
verb1.text.toLowerCase();
verb2.text = verb2.text.toLowerCase();
adjective.text =
adjective.text.toLowerCase();
noun.text=noun.text.toLowerCase();
Эти четыре
действия переводят текст, введенный в четыре
текстовых поля, в нижний регистр – главным
образом по соображениям грамматики (ни одно из
этих полей не будет содержать ни собственных
имен, ни слов, стоящих в предложении на первом
месте).
- После
строки noun.text=noun.text.toLowerCase();
вставьте следующий скрипт:
properNoun.text =
properNoun.text.substr(0,1).toUpperCase() +
properNoun.text.substr(1).toLowerCase();
В этом скрипте
properNoun.text
есть ссылка на текст в поле
properNoun; это
поле должно содержать чье-то имя. Поэтому в этой
строке первая буква (символ с индексом 0) должна
быть заглавной, а остальные – строчными. Чтобы
обеспечить это наверняка, мы применяем метод
substr(). Как
видите, он используется в нашем выражении
дважды. Сначала
properNoun.text.substr(0,1) возвращает
строку, состоящую из одной первой буквы значения
properNoun.text, которая переводится в
верхний регистр методом
toUpperCase(). Во второй половине
выражения также использован метод
substr(), но на
сей раз подстрока берется, начиная со второй
буквы (символ с индексом 1). Поскольку длина
(второй параметр метода
substr()) не указана, в подстроку войдут
все символы до конца строки. Полученное в
результате строковое значение переводится в
нижний регистр методом
toLowerCase(). Наконец, обе полученные
строки объединяются оператором конкатенации.
Таким образом, если пользователь может ввести
хоть "kelly", хоть "kElLy" – в результате
выполнения нашего выражения все равно получится
"Kelly".
-
Добавьте в функцию generate() последнюю
строку:
paragraph.tex
= "You " + verb1.text + " into love with " +
properNoun.text +
" when you " + verb2.text + " "+ properNoun.text + " eating a " +
adjective.text + " " + noun.text + ".";
В этой строке
несколько раз использован оператор конкатенации,
соединяющий в одну строку несколько значений
переменных и несколько жестко программируемых
строковых значений – в результате получается
единое предложение.
Совет
Объединяя несколько строковых значений, будьте
внимательны, не забывайте заключать каждое
значение в кавычки. Стоит пропустить кавычки
хотя бы в одном месте, и результат будет
ошибочный. Явные ошибки панель Действия сможет
обнаружить и показать вам строку, в которой
присутствует синтаксическая ошибка.
-
Выделите кнопку Submit и присоедините к ней
следующий скрипт:
on (release,
keyPress "<Enter>") {
generate();
}
При нажатии
этой кнопки или клавиши Enter будет вызвана
написанная нами функция
generate().
-
Выполните команду Управление > Проверить
фильм (Control > Test Movie).
Введите текст
в каждое из полей для ввода, затем нажмите
кнопку Submit, и посмотрите, что за предложение
получилось. Попробуйте сделать это еще раз, при
вводе перемешивая заглавные и строчные буквы.
Как видите, манипулировать строками в
ActionScript совсем не трудно.
-
Закройте тестовый фильм и сохраните свою
работу в файл madlibs2.fla.
Вы кое-что
узнали о применении методов объекта String, а
это важный аспект ActionScript, ведь играет
важную роль во многих проектах, и вам совершенно
необходимо уметь им манипулировать. В этом
разделе вы познакомились лишь с основами, но в
ходе этого учебного курса вам встретится еще
немало примеров управления текстовой информацией
в проектах. |