Опубликован: 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 и введите следующий скрипт:

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