Опубликован: 04.11.2006 | Доступ: свободный | Студентов: 4621 / 581 | Оценка: 4.46 / 3.96 | Длительность: 39:17:00
Урок 6:

Создание и модификация объектов

Усовершенствование методов существующих объектов

Встроенные во Flash классы объектов (MovieClip, TextField, XML и тому подобные) располагают множеством готовых методов, ими можно обойтись почти в любой ситуации. Тем не менее, может статься и так, что вам понадобится что-то большее. Что ж, с помощью знаний, полученных из этого урока, вам будет несложно улучшить и расширить эти методы, получив дополнительные возможности – практически любые, какие только можно вообразить.

Усовершенствовать существующие методы можно двумя способами – в зависимости от типа объекта. Для некоторых объектов нельзя создать экземпляры – они единственны и универсальны для каждого проекта: это объекты Mouse, Key, Selection и Math. К примеру, вы не можете создать экземпляр объекта Mouse мышь у компьютера только одна, и на экране только один указатель мыши; вы можете лишь использовать методы объекта Mouse для управления этим указателем. А для других классов объектов вы можете создавать экземпляры ( MovieClip, TextField и т.п.). Итак, если экземпляр объекта создать нельзя, то для усовершенствования метода этого объекта используется такой способ:

MathPlus = new Object();
MathPlus._proto_ = Math;
MathPlus.oldMax = Math.max;
MathPlus.max = function(x, y, z){
  firstComparison = MathPlus.oldMax(x, y);
  secondComparison = MathPlus.oldMax(firstComparison, z);
  return secondComparison;
}
Object.prototype.Math = MathPlus;
trace(Math.max(23, 56, 4));

Данный скрипт усовершенствует метод max() объекта Math, который в нормальном своем виде находит большее из двух чисел. Например, в этом примере myVariable получит значение 456:

myVariable = Math.max(456, 23);

Приведенный выше скрипт изменяет этот метод так, чтобы он находил большее из трех чисел. Вот как это делается: в первой строке создается родовой объект с именем MathPlus. В следующей строке используется свойство _proto_, чтобы экземпляр этого нового объекта унаследовал все функциональные возможности объекта Math.

Примечание Здесь мы не можем обеспечить наследование, используя выражение MathPlus = new Math() ; (как мы делали прежде с экземплярами Doctor и Person ), поскольку экземпляр объекта Math создать нельзя – выражение new Math() не имеет смысла. Поэтому, чтобы объект MathPlus унаследовал возможности объекта Math, мы должны использовать свойство _proto_, как и показано в скрипте – результат, в принципе, тот же самый, только достигается иным путем (об этом свойстве мы рассказывали в этом уроке, в разделе "Создание подклассов").

Теперь MathPlus "умеет" делать все, на что способен объект Math. Например, Math.round(34.7) ; и MathPlus.round(34.7) ; дадут один и тот же результат. Почему мы решили пойти таким путем? Дело в том, что напрямую манипулировать методами объекта Math (как и других объектов, не позволяющих создавать экземпляры) нельзя. Поэтому мы создаем объект-посредник ( MathPlus ), который наследует возможности объекта Math, изменяем функции этого посредника, а затем (такое вот извращение) велим ActionScript считать объект-посредник ( MathPlus ) объектом Math.

Итак, в двух следующих строках скрипта описываются два новых метода объекта MathPlus: oldMax, который копирует оригинальный метод Math.max(), и max, который станет новым, усовершенствованным методом max(). Метод oldMax создать необходимо, поскольку функции оригинального метода max() все же понадобятся новому методу max(). Однако мы должны дать оригинальному методу новое имя, так как имя max будет теперь принадлежать новому, измененному методу. Функция, описывающая новый метод max(), принимает три параметра ( x, y, z ). Значения этих трех параметров функция использует для нахождения наибольшего значения из трех. Строка, следующая за описанием функции, назначает новый объект MathPlus методом Math прототипа класса Object (это значит, что объект MathPlus заместит прежний объект Math ).

Можем заодно усовершенствовать метод random() объекта Math, чтобы он генерировал случайное число из заданного диапазона. Это можно сделать с помощью таких строк (предполагается, что MathPlus уже создан и "получил наследство", как показано в первых двух строках предыдущего примера):

MathPlus.oldRand = Math.random;
MathPlus.random = function(min, max){
  return MathPlus.floor(MathPlus.oldRand() * ((max - min) + 1)) + min;
}

Как видите, синтаксически это похоже на предыдущий пример. С помощью подобных синтаксических структур можно усовершенствовать и методы объектов Mouse, Key, Selection.

Способ изменения методов таких классов, которые позволяют создавать экземпляры (например, MovieClip, TextField и т.п.), отличается – но не намного. В этом упражнении мы усовершенствуем метод duplicateMovieClip(). Используя существующий метод, мы имеем возможность указать, какой фильм-символ следует дублировать, какое имя дать дубликату и на какую глубину следует поместить дубликат (подробнее об этом методе см. в Уроке 14 – Динамическое управление фильмами-символами). А мы усовершенствуем этот метод, добавив возможность перемещать оригинальный фильм-символ (тот, который дублируется) в указанные xy координаты по окончании процесса дублирования.

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

Мы уже работали с этим проектом в предыдущем упражнении, так что его элементы должны быть вам знакомы. В этом упражнении мы присоединим скрипты к кадру 1, а также к кнопкам (в виде сдвоенных квадратов), расположенным в левом верхнем углу сцены.

  1. Открыв панель Действия, выделите кадр 1 и введите следующий скрипт:
MovieClip.prototype.oldDuplicateMovieClip = 
  MovieClip.prototype.duplicateMovieClip;
MovieClip.prototype.duplicateMovieClip = function(name, depth, moveX, moveY){
  this.oldDuplicateMovieClip(name, depth);
  this._x = moveX;
  this._y = moveY;
}

Мы поместили этот скрипт в кадр 1, значит, как только начнется воспроизведение фильма, метод duplicateMovieClip() будет изменен, после чего, в новом виде, станет доступен всем экземплярам фильмов-символов.

Методами объекта Math мы напрямую манипулировать не могли (пришлось использовать объект-посредник), а вот методами класса MovieClip – вполне можем, поскольку эти методы находятся в объекте MovieClip.prototype, который нам ничего не стоит изменить.

Первая строка скрипта копирует оригинальный метод duplicateMovieClip() в oldDuplicateMovieClip(). Это мы делаем для того, чтобы сохранить его функциональность, она нам пригодится, когда мы будем описывать работу усовершенствованного метода. Со следующей строки начинается функция, описывающая новый, измененный метод duplicateMovieClip(). Этот метод будет принимать два дополнительных параметра: moveX и moveY (сейчас мы поясним, как они будут использованы). В первой строке функции используется метод oldDuplicateMovieClip() – он выполняет то, что раньше делал оригинальный метод duplicateMovieClip(), то есть дублирует фильм-символ, дает ему имя и назначает глубину. Примененный здесь термин this ссылается на оригинальный экземпляр фильма-символа (тот, который дублируется). Следующие две строки, используя значения параметров moveX и moveY, перемещают оригинальный экземпляр в соответствующую координатную точку. Все – наш новый метод duplicateMovieClip() готов к использованию экземпляром любого фильма-символа!

  1. Выделите меньшую из кнопок в виде двойных квадратов и присоедините к ней скрипт:
on(release){
  smallHead.duplicateMovieClip("myHead1", 10, 200, 150);
}

Когда эта кнопка будет нажата и отпущена, произойдет дублирование экземпляра smallHead. Дубликат получит имя myHead1 и глубину 10. Два других параметра – это значения, соответственно, moveX и moveY, они используются для перемещения оригинального экземпляра после дублирования. Таким образом, smallHead будет перемещен в точку с координатами 200 по x и 150 по y.

  1. Выделите большую из кнопок в виде двойных квадратов и присоедините к ней скрипт:
on(release){
  bigHead.duplicateMovieClip("myHead2", 10, 100, 200);
}

Здесь (таким же образом) будет продублирован экземпляр bigHead.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

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

В нашем примере изменение существующего метода был простым, однако такие усовершенствования могут быть весьма сложными – процесс может включать очень много действий ActionScript. Таким же способом, то есть путем изменения функций в объекте-прототипе, можно усовершенствовать методы других классов (например, TextField, Sound, Color, XML и т.д.).

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

Это упражнение завершено, но в следующем мы продолжим работу над данным проектом.

Салтанат Бектегенова
Салтанат Бектегенова

Дострочное пересдача экзамена

 

Евгений Стародубцев
Евгений Стародубцев

Вот задание:

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