Опубликован: 07.11.2006 | Уровень: специалист | Доступ: платный
Лекция 7:

Интерфейсы AсtionScript

Удаление управляющих элементов событий

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

function move() {
    if (this._x<500) {
        this._x++;
    }
}
mc1_mc .onEnter Frame = move;

Это как раз тот момент, на котором мы "зависали" во Flash 5 при работе с событиями фильма. На самом деле это не самый эффективный метод. В данном примере функция move все еще проверяет значение this._x и сравнивает его со значением 500, один раз в каждом кадре. Если мы знаем, что функция полностью завершила свою работу, мы можем просто ее удалить. Существуют два способа выполнения этого действия: либо удалить управляющий элемент, либо присвоить ему неопределенное значение или null. Принято просто удалять его. В результате получим следующее.

function move() {
  if (this._x<500) {
      this._x++;
    } else {
      delete this.onEnterFrame;
    }
  }
  mc1_mc.onEnterFrame = move;

Здесь необходимо сказать, что при удалении управляющего элемента таким способом вы на самом деле не удаляете функцию, содержащуюся в памяти. Вы просто удаляете ссылку на эту функцию, хранимую в onEnterFrame. В данном случае у вас все еще будет ссылка на функцию в переменной move. Она может быть заново присвоена в любое время.

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

Изменение управляющих элементов событий

Приведем другой пример полезного использования управляющих элементов событий. В последнем примере нам нужно было, чтобы фильм выполнялся до тех пор, пока не реализуется определенное условие. Однако точно так же мы могли бы назначить ему другое действие в другое время. Нужно просто присвоить другую функцию, посредством которой будут выполняться какие-либо другие действия. В следующем коде у нас есть две функции: moveRight и moveLeft. Когда фильм перемещается слишком далеко вправо или влево, его управляющий элемент onEnterFrame переключается на противоположную функцию. Мы также немного увеличили скорость движения, поэтому шарик не будет "ползти" по экрану.

function moveRight() {
    this._x+=5;
    if (this._x>500) {
      this.onEnterFrame = moveLeft;
    }
  }
  function moveLeft() {
    this._x-=5;
    if (this._x<50)  {
      this.onEnterFrame = moveRight;
    }
  }
  mc1_mc.onEnterFrame = moveRight;

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

Передача параметров управляющим элементам событий

Если вы когда-либо ранее использовали функции в любом языке программирования, вы, вероятно, задавали себе вопрос: "Что насчет параметров?". Обычно при определении функции можно указывать число параметров внутри скобок. Этим можно воспользоваться для отправки данных функции при ее выполнении. Функция может использовать эти данные в своих выражениях.

function saySomething(message) {
    trace (message);
  }
  saySomething("I'd like to buy an argument.");

Как это работает с управляющими элементами события? Отвечаем: никак. Сначала я расскажу об ошибке, которую допускают многие программисты, чтобы вы запомнили ее и не допускали сами. Вы определяете функцию, которая содержит один или два параметра, и затем пытаетесь присвоить эту функцию управляющему элементу события.

function showCoords(x, y) {
    trace("horiz: "+x+" vert: "+y);
  }
  mc1_mc.onEnterFrame = showCoords(this._x, this._y);

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

function showCoords(x, y) {
    trace("horiz: "+x+" vert: "+y);
  }
  mc1_mc.onEnterFrame = function() {
    showCoords(this._x, this._y);
  };

В данном примере выполняется безымянная функция, присвоенная onEnterFrame. Она запускает функцию showCoords(), передавая ей параметры.

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

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

Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009
Магомед Алисултанов
Магомед Алисултанов
Россия, Волгоград, лицей 2