Macromedia Flash MX и программирование на ActionScript

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

Показывать лекцию целиком

В этом уроке мы с вами будем манипулировать числовыми и текстовыми данными, составляя выражения.

Внимание! Для работы с этим уроком необходимы учебные файлы, которые Вы можете загрузить здесь.

Что будет изучаться

В этом уроке:

  • Построение выражений
  • Приоритет операторов
  • Манипулирование числами с помощью объекта Math
  • Применение методов объекта String
  • Этот интерактивный "преобразователь температур" будет манипулировать данными, переводя значения температуры по шкале Фаренгейта в значения по Цельсию.

    Время выполнения

    На выполнение этого урока требуется примерно 30 минут.

    Файлы урока

    Файлы-носители:

    Нет

    Стартовые файлы:

    Lesson08/Assets/tempConverter1.fla
    Lesson08/Assets/madlibs1.fla

    Законченные проекты:

    tempConverter2.fla
    madlibs2.fla

    Типы данных

    Если вы выполнили все предыдущие уроки, то уже знакомы со всеми типами данных. Однако мы ни разу не рассматривали их все сразу, а потому давайте сделаем краткий обзор.

  • Строка. Этот тип данных служит для представления текста, символьных значений; в скриптах строковые значения заключаются в кавычки (например, "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 мы сейчас поработаем.

    Пять текстовых полей для ввода называются (сверху вниз) 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.text = "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, ведь играет важную роль во многих проектах, и вам совершенно необходимо уметь им манипулировать. В этом разделе вы познакомились лишь с основами, но в ходе этого учебного курса вам встретится еще немало примеров управления текстовой информацией в проектах.

    Вернуться к учебному плану