Опубликован: 04.11.2006 | Уровень: специалист | Доступ: платный
Урок 8:

Манипулирование данными

< Урок 7 || Урок 8: 1234 || Урок 9 >

Манипуляция с числовыми данными с помощью объекта 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, напишем несложный алгоритм преобразования значений температуры по шкале Фаренгейта в значения по шкале Цельсия. Заодно запрограммируем изображение термометра с соответствующим уровнем ртути.

  1. Откройте файл tempConverter1.fla из папки Lesson08/Assets.

Все символы и текстовые поля уже созданы и размещены на сцене, нам остается сосредоточиться на ActionScript. Основной монтажный стол состоит из четырех слоев: Actions, Thermometer, Temperature Input и Background.

Слой Background содержит основное фоновое изображение. В слое Temperature Input находится текстовое поле для ввода, его имя – temperature. Сюда будут вводиться значения температур для преобразования. Кроме этого поля, в данном слое имеется еще два: fahrenheit и celsius – в них будут отображаться соответствующие значения температур. В этом же слое находится кнопка с надписью "Convert". Слой Thermometer содержит экземпляр фильма-символа с именем mercury, он будет иллюстрировать уровень ртути в термометре. Мы же сейчас займемся слоем Actions.

  1. Откройте панель Действия, выделите кадр 1 слоя Actions и введите следующий скрипт:
function changeTemp() {
}

Это – начало описания функции. Функция эта будет вызываться при нажатии кнопки Convert, и выполнять она должна будет следующие задачи:

  • Перевести значение по Фаренгейту в шкалу Цельсия.
  • Убедиться, что введенное значение (по Фаренгейту) укладывается в диапазон термометра.
  • Установить "уровень ртути" в термометре на нужную высоту.
  1. Внутри описания функции создайте две переменные:
boilingPoint = 212;
absoluteZero = -460;

Наш термометр работает в большом диапазоне температур – от абсолютного нуля (примерно -460 градусов Фаренгейта) до точки кипения воды (212 градусов Фаренгейта), это будут максимально и минимально возможные значения для нашего конвертера.

  1. После строки 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.

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

  1. После строк, добавленных на предыдущем шаге, вставьте следующее выражение, переводящее значения по Фаренгейту в шкалу Цельсия:
celsius.text = Math.round((5 / 9) * fahrenheit.text - 17.777);

Выражение справа от знака равенства переводит значение температуры из одной шкалы в другую. Результат выражения присваивается свойству text текстового поля celsius ; таким образом, данная строка отображает преобразованное значение в текстовом поле.

Обратите внимание на использование скобок в этом выражении. Выполняя эту строку кода, Flash начнет производить вычисления с самой внутренней пары скобок – в данном случае (5 / 9). Затем будет выполнено умножение, затем – вычитание. Метод Math.round() будет вызван только после того, как будет окончательно вычислено числовое значение аргумента. Это значение метод округлит до ближайшего целого числа.


  1. После предыдущей строки добавьте следующие:
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 процентов).

  1. Выделите кнопку Convert и введите в панели Действия следующий скрпит:
on (release, keyPress "<Enter>") {
  changeTemp();
}

При нажатии этой кнопки или клавиши Enter будет вызвана функция changeTemp(), которую мы только что создали.

  1. Выполните команду Управление > Проверить фильм (Control > Test Movie). Введите значение температуры и нажмите кнопку.

После нажатия кнопки вы увидите, что высота фильма-символа mercury соответствующим образом уменьшилась. Текстовые поля celsius и fahrenheit заполнились данными. Если вы попытаетесь ввести температуру, выходящую за установленные нами пределы, то сработает фильтр – оператор if/else if, и значение будет "обрезано" по верхней или нижней границе.

  1. Закройте тестовый фильм и сохраните свою работу как tempConvert2.fla.

Итак, мы разобрались с арифметическими операторами и научились пользоваться методами объекта Math.

< Урок 7 || Урок 8: 1234 || Урок 9 >
Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт:

Галина Кузнецова
Галина Кузнецова

Добрый день.

Можно ли получить среду Flash для обучения бесплатно?

Евгения Дегтяренко
Евгения Дегтяренко
Украина, Запорожье
Анна Елисеева
Анна Елисеева
Россия, Великий Новгород, Ногородский государственный университет имени Ярослава Мудрого, 2003