Работа с объектами

ActionScript известен как язык программирования, ориентированный на объекты. Объектно-ориентированное программирование является подходом к программированию. Это не более чем способ организации кода в программе с использованием объектов.

Ранее термин «компьютерная программа» обозначал последовательность действий или команд, выполняемых компьютером. Теоретически можно представить компьютерную программу как один длинный список команд. Однако в объектно-ориентированном программировании программные команды распределены между различными объектами. Код группируется в наборы функций, поэтому связанные типы функций и связанные части данных группируются в один контейнер.

Adobe Flash Professional

Те, кому приходилось работать с символами в приложении Flash Professional, фактически уже знают, как работать с объектами. Представим, что вы определили символ фрагмента ролика, например рисунок прямоугольника, и поместили копию в рабочую область. Этот символ фрагмента ролика является также (буквально) объектом ActionScript или экземпляром класса MovieClip.

Существует несколько характеристик фрагмента ролика, которые можно изменить. Если объект выбран, в Инспекторе свойств можно изменять значения, такие как значение координаты x или ширины объекта. Кроме того, можно выполнять различные виды коррекции цветов, например изменение значения альфа (прозрачности) или применение фильтра тени. Другие инструменты Flash Professional позволяют осуществлять дополнительные изменения; например, инструмент «Свободное преобразование» выполняет поворот прямоугольника. Все эти способы изменения символа фрагмента ролика во Flash Professional также доступны в среде ActionScript. В среде ActionScript фрагмент ролика можно изменить путем добавления частей данных, формирующих один набор, называемый объектом MovieClip.

В ориентированном на объекты языке программирования ActionScript существует три типа характеристик, которые могут входить в любой класс:

  • Свойства

  • Методы

  • События

Эти элементы используются для управления частями данных, которые задействованы в программе, и для принятия решения о том, какие действия должны быть выполнены и в каком порядке.

Свойства

Свойство представляет собой одну из порций данных, упакованную в объект. Если рассмотреть в качестве примера музыкальную композицию, ее свойствами могут быть artist (имя исполнителя) и title (название). Класс MovieClip имеет такие свойства, как rotation (поворот), x , width (ширина) и alpha (прозрачность). Работа со свойствами аналогична работе с отдельными переменными. Фактически свойства можно рассматривать как «дочерние» переменные, содержащиеся в объекте.

Ниже приведены примеры кодов ActionScript, в которых используются свойства. Эта строка кода перемещает MovieClip с именем square (квадрат) по оси X на 100 пикселов.

square.x = 100;

Этот код использует свойство rotation для поворота MovieClip square в соответствии с поворотом MovieClip triangle (треугольник):

square.rotation = triangle.rotation;

Этот код изменяет горизонтальный масштаб объекта MovieClip square таким образом, что его ширина увеличивается в полтора раза:

square.scaleX = 1.5;

Обратите внимание на общую структуру: используется переменная ( square , triangle ) в качестве имени объекта, после нее указывается точка ( . ), а затем имя свойства ( x , rotation , scaleX ). Точка, известная как оператор точки , используется для указания на доступ к одному из дочерних элементов объекта. Полная структура: «имя переменной — точка — имя свойства» используется в качестве одной переменной, как имя единичного значения в памяти компьютера.

Методы

Метод — это действие, которое может выполнять объект. Например, предположим, что создан символ фрагмента ролика Flash Professional с несколькими ключевыми кадрами и анимацией на временной шкале. Можно создать команды воспроизведения или остановки этого фрагмента ролика, а также перемещения к определенному кадру.

Этот код дает команду фрагменту ролика с именем shortFilm начать воспроизведение:

shortFilm.play();

Эта строка останавливает воспроизведение фрагмента ролика с именем shortFilm (воспроизводящая головка останавливается, аналогично режиму паузы при воспроизведении видеофильма):

shortFilm.stop();

Этот код дает команду для фрагмента ролика с именем shortFilm переместить воспроизводящую головку на кадр 1 и остановить воспроизведение (аналогично обратной перемотке видеофильма):

shortFilm.gotoAndStop(1);

Доступ к методам, так же как и к свойствам, осуществляется путем записи имени объекта (переменной), за которым следуют точка, имя метода и скобки. Скобки указывают на вызов метода, то есть дают команду объекту для выполнения действия. Иногда в скобках располагаются значения (или переменные) для передачи дополнительной информации, которая необходима для выполнения действия. Эти значения называются параметрами метода. Например, для метода gotoAndStop() требуется информация о том, к какому кадру следует перейти, поэтому в скобках необходимо указать один параметр. Другие методы, такие как play() и stop() , являются очевидными и не требуют дополнительной информации. Тем не менее, они также пишутся со скобками.

В отличие от свойств (и переменных), методы не используются в качестве местозаполнителя значения. Тем не менее, некоторые методы могут выполнять вычисления и возвращать результат, который можно использовать в качестве переменной. Например, метод числового класса toString() конвертирует числовое значение в его текстовое представление:

var numericData:Number = 9; 
var textData:String = numericData.toString();

Например, можно использовать метод toString() для отображения значения числовой переменной в текстовом поле на экране. Свойство text класса TextField определяется в качестве переменной String (строка), поэтому может содержать только текстовые значения. (Свойство text представляет фактическое текстовое содержимое, отображаемое на экране.) Эта строка кода преобразует числовое значение переменной numericData в текст. Затем значение отображается на экране в объекте TextField с именем calculatorDisplay :

calculatorDisplay.text = numericData.toString();

События

Компьютерная программа — это последовательность команд, которые пошагово выполняет компьютер. Некоторые простые компьютерные программы не содержат ничего, кроме нескольких шагов, после выполнения которых компьютером программа заканчивается. Тем не менее, программы ActionScript разработаны таким образом, что они продолжают работать, ожидая введения данных пользователем или каких-либо других событий. События являются механизмом, определяющим, когда и какие инструкции должен выполнять компьютер.

В сущности, события — это все то, что происходит, о чем ActionScript «знает» и на что может ответить. Многие события связаны с взаимодействием пользователя, например нажатие программной кнопки или клавиши клавиатуры. Также существуют другие виды событий. Например, если ActionScript используется для загрузки внешнего изображения, существует событие, которое позволит пользователю узнать о завершении загрузки. Запущенная программа ActionScript фактически ожидает появления событий. При появлении этих событий выполняется определенный код ActionScript, заданный для обработки этих событий.

Основные сведения об обработке событий

Методика указания определенных действий, которые выполняются при возникновении событий, называется обработкой событий . При написании кода ActionScript для обработки события необходимо определить три важных элемента.

  • Источник события: в каком объекте должно произойти событие? Например, какая кнопка была нажата или какой объект Loader загружает изображение? Источник событий также называется целью событий . Он получил такое название, поскольку представляет собой объект, в котором компьютер проверяет наличие событий (то есть место, в котором фактически происходит событие).

  • Событие: что именно должно произойти и на что именно требуется ответить? Идентификация определенных событий играет важную роль, поскольку многие объекты инициируют несколько событий.

  • Ответ: какие шаги необходимо выполнить, когда событие произойдет?

При написании кода ActionScript для обработки событий необходимы следующие три элемента. Код имеет следующую базовую структуру (элементы, выделенные жирным шрифтом, являются местозаполнителями, которые подставляются в зависимости от конкретного случая).

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

Такой код выполняет две задачи. Во-первых, определяет функцию, то есть способ задания действий, которые требуется выполнить в ответ на событие. Затем он вызывает метод addEventListener() исходного объекта. Вызов метода addEventListener() в сущности «присоединяет» функцию к указанному событию. При возникновении событий выполняются действия функции. Рассмотрим эти части более подробно.

Раздел function обеспечивает способ группировки действий под одним именем — аналогично созданию имени быстрого вызова для выполнения действий. Функция равнозначна методу — за исключением того, что ее не обязательно связывать с определенным классом. (Фактически термину «метод» можно дать следующее определение: это функция, которая связана с определенным классом.) При создании функции для обработки события необходимо выбрать для нее имя (в данном случае именем функции будет eventResponse ). Также задается один параметр (с именем eventObject в этом примере). Указание параметра функции аналогично заданию переменной, поэтому требуется указать также и тип данных параметра. (В этом примере тип данных параметра: EventType ).

Каждый тип событий, которые требуется отслеживать, имеет соответствующий класс в ActionScript. Тип данных, указанный для параметра функции, всегда связан с классом определенного события, на которое требуется ответить. Например, событие click (инициируемое, когда пользователь щелкает элемент кнопкой мыши) связано с классом MouseEvent. Для записи функции listener (прослушиватель) для события click задается параметр этой функции с типом данных MouseEvent. И, наконец, в фигурных скобках ( { ... } ) записываются команды, которые должен выполнить компьютер при возникновении события.

Функция обработки событий записана. Затем объекту-источнику событий (объект, в котором возникает событие, например кнопка) назначаются команды вызова функции при возникновении события. Функция регистрируется в объекте источника событий за счет вызова метода addEventListener() этого объекта (все объекты, в которых возникают события, также имеют метод addEventListener() ). В методе addEventListener() используются два параметра.

  • Во-первых, имя определенного события, на которое требуется ответить. Каждое событие связано с определенным классом. Каждый класс событий имеет специальное значение, которое аналогично уникальному имени, заданному для каждого из этих событий. Это значение используется для первого параметра.

  • Во-вторых, имя функции ответа на событие. Обратите внимание, что имя функции пишется без скобок, когда оно передается как параметр.

Процесс обработки событий

Ниже приводится пошаговое описание процесса, возникающего при создании прослушивателя события (event listener). Это пример создания функции listener, которая вызывается при щелчке мыши по объекту с именем myButton .

Фактический код, написанный программистом, таков:

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

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

  1. При загрузке SWF-файла компьютер регистрирует факт наличия функции с именем eventResponse() .

  2. Затем компьютер выполняет код (в частности, те строки кода, которых нет в функции). В данном случае это только одна строка кода: вызов метода addEventListener() объекта-источника события (с именем myButton ) и передача функции eventResponse как параметра.

    Объект myButton содержит список функций, перечисленных для каждого возникающего в нем события. При вызове метода addEventListener() объект myButton сохраняет функцию eventResponse() в списке прослушивателей событий.

  3. В какой-то момент пользователь, щелкая кнопкой мыши по объекту myButton , запускает его событие click (определенное в коде как MouseEvent.CLICK ).

    В этот момент происходит следующее:

    1. Создается объект, который является экземпляром класса, связанного с рассматриваемым событием (в данном случае с событием MouseEvent). Для многих событий этот объект является экземпляром класса Event. Для событий мыши это экземпляр MouseEvent. Для остальных событий это экземпляр класса, связанного с этим событием. Этот созданный объект называется event object . Он содержит специфическую информацию о происшедшем событии: тип, где оно произошло и другие данные, если они применимы.

    2. Затем компьютер обращается к списку прослушивателей событий, который хранится в объекте myButton . Он перебирает эти функции одну за другой, вызывает их и передает объект события в функцию в качестве параметра. Поскольку функция eventResponse() является одним из прослушивателей объекта myButton , в рамках этого процесса компьютер вызывает функцию eventResponse() .

    3. При вызове функции eventResponse() начинает выполняться ее код, осуществляя тем самым действия, заданные пользователем.

Примеры обработки событий

Ниже приводятся несколько конкретных примеров кода обработки событий. Эти примеры позволяют получить представление о некоторых общих элементах событий и возможных вариантах написания кода обработки событий.

  • Нажатие кнопки для запуска воспроизведения текущего фрагмента ролика. В следующем примере именем экземпляра кнопки является playButton ; this — специальное имя, означающее «текущий объект»:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • Обнаружение текста в текстовое поле. В этом примере entryText является входным текстовым полем, а outputText — динамическим текстовым полем:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • Нажатие кнопки для перехода по адресу URL: В этом случае linkButton является именем экземпляра кнопки:

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

Создание экземпляров объекта

Перед использованием объекта в ActionScript необходимо, чтобы этот объект существовал. Одним из этапов создания объекта является задание переменной, однако эта операция создает только свободную ячейку в памяти компьютера. Всегда назначайте фактическое значение переменной (то есть создавайте объект и сохраняйте его в переменной), перед тем как использовать ее или управлять ею. Процесс создания объекта называется созданием экземпляра объекта. Другими словами, создается экземпляр определенного класса.

Один простой способ создания экземпляра объекта вообще не требует использования ActionScript. Во Flash Professional поместите символ фрагмента ролика, символ кнопки или текстовое поле в рабочую область и назначьте элементу имя экземпляра. В приложении Flash Professional автоматически объявляется переменная с этим именем экземпляра, создается экземпляр объекта и этот объект сохраняется в переменной. Аналогично в приложении Flex пользователь создает компонент в MXML путем создания кода тега MXML или размещения компонента в редакторе в режиме оформления Flash Builder. При назначении идентификатора этому компоненту данный идентификатор становится именем переменной ActionScript, содержащей экземпляр компонента.

Однако не всегда существует необходимость визуального создания объектов, а создание невизуальных объектов невозможно. Существует несколько дополнительных способов создания экземпляров объектов с использованием только ActionScript.

С помощью нескольких типов данных ActionScript можно создавать экземпляры, используя литеральное выражение , которое представляет собой значение, записываемое непосредственно в код ActionScript. Примеры:

  • Литеральное числовое значение (непосредственный ввод числа):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • Литеральное строчное значение (текст, заключенный в двойные кавычки):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • Литеральное логическое значение (используются значения истинно/ложно — true или false ):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • Литеральный массив значений (список разделенных запятой значений в квадратных скобках):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • Литеральное значение XML (непосредственный ввод XML):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

В ActionScript определяются также литеральные выражения для следующих типов данных: Array, RegExp, Object и Function.

Наиболее распространенным способом создания экземпляра для любого типа данных является использование оператора new с именем класса, как показано ниже.

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

Создание объекта с помощью оператора new часто называется «вызовом конструктора класса». Конструктор — это специальный метод, который является частью процесса создания экземпляра класса. Обратите внимание, что при создании экземпляра таким способом после имени класса указываются скобки. Иногда в скобках указываются значения параметров. Эти два действия также выполняются при вызове метода.

Для тех типов данных, которые позволяют создавать экземпляры с помощью литерального выражения, все равно можно создавать экземпляр объекта, используя оператор new . Например, эти две строки кода дают одинаковый результат:

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

Очень важно приобрести опыт в создании объектов с помощью метода new ClassName () . Многие типы данных ActionScript не имеют визуального представления. Поэтому их нельзя создать, поместив элемент в рабочую область Flash Professional или режим оформления редактора MXML приложения Flash Builder. В среде ActionScript с помощью оператора new можно создать только экземпляр любого из этих типов данных.

Adobe Flash Professional

В приложении Flash Professional оператор new можно также использовать для создания экземпляра символа фрагмента ролика, который определен в библиотеке, но не помещен в рабочую область.