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

Форматирование текста

Повторение указанных функций с помощью setInterval

Сейчас мы будем анимировать два фильма. Один из них будет использовать onEnterFrame, а другой - метод setInterval.

  1. Откройте новый файл Flash и установите частоту кадров на значение 20.
  2. Нарисуйте изображение и преобразуйте его в фильм - в нашем примере мы нарисовали небольшой шарик. Расположите два инстанса объекта на рабочем месте и назовите один из них obja_mc, а другой obja2_mc.

  3. Теперь добавьте слой scripts в главную временную диаграмму и введите следующий код (мы будем создавать одну функцию для работы с onEnterFrame и другую для запуска под управлением setInterval ).
    _root.onEnterFrame = function() {
      obja_mc._x++;
      trace("on enter frame");
    };
    function inter() {
      obja2_mc._x++;
      trace("interval function");
    }
    setInterval(inter, 50);

    Здесь мы использовали setInterval с двумя аргументами: вызываемой функции и интервала между вызовами. Функция inter будет вызываться каждые 50 миллисекунд. Мы выбрали значение 50 миллисекунд, так как оно будет соответствовать частоте смены кадров - в секунде 1000 миллисекунд, а наш фильм обновляется 20 раз в секунду, или один раз за 50 миллисекунд.

  4. Сохраните ваш файл под именем setInterval1.fla. Запустив его, вы заметите, что шарики двигаются примерно с одинаковой скоростью, однако расстояние между ними сильно увеличивается по мере их движения на экране.

    Два объекта должны оставаться синхронизированными, однако если обратить внимание на содержимое окна Output, то станет видно, что on enter frame и interval function изменяются, как положено, несмотря на то, что каждый второй инстанс interval function указывается дважды в строке.


    Чтобы увидеть, как изменяется инстанс, введите этот код в одной из функций; это покажет расстояние между двумя фильмами:

    trace (obja2_mc._x-obja_mc._x);

    Расстояние между ними не остается постоянным. Однако изменение интервала на 51 или 49 не имеет значения: в одном случае obja_mc движется быстрее, в то время как obja2_mc движется быстрее в другом. Функция setInterval работает и весьма полезна, однако если мы хотим, чтобы наши события были идеально синхронизированы, то для управления движением лучше использовать либо onEnterFrame, либо setInterval, но не использовать их вместе. Если точная синхронизация не критична для определенного приложения, тогда можно использовать оба подхода.

  5. Чтобы наглядно рассмотреть еще один момент, установите частоту кадров на значение 1. Теперь функция интервалов вызывается каждые 50 миллисекунд, однако рабочее место обновляется лишь один раз в 1000 миллисекунд.

    Запустив ваш фильм, вы обнаружите, что при обновлении рабочего места obja_mc каждую секунду перемещается на 1 пиксель, а obja2_mc двигается на 10 или 11 пикселей, так как функция setInterval вызывалась 10 или 11 раз между обновлениями рабочего места.

  6. Замените код в слое scripts следующим кодом и сохраните ваш файл под именем setInterval2.fla. Мы будем использовать его для принудительного обновления рабочего места с использованием updateAfterEvent().
    _root.onEnterFrame = function() {
      trace("on enter frame");
      obja_mc._x++;
      trace(obja2_mc._x);
    };
    function inter() {
      obja2_mc._x += 3;
      trace("interval function called");
      updateAfterEvent();
    }
    setInterval(inter, 30);

    updateAfterEvent является методом, вызываемым для обновления рабочего места независимо от частоты кадров. Он будет работать только как часть управляющего элемента clipEvent или внутри функции, присвоенной setInterval. Этот метод чаще всего используется для реализации более плавного перетаскивания при работе с перетаскиваемыми объектами. В нашем случае, мы используем его в управляющем элементе onMouseMove таким образом, что новое расположение перемещаемого объекта отображается немедленно, а не в начале следующего кадра. Рекомендуется быть осторожным и не использовать этот метод слишком много, так как вы можете видеть, насколько движение прерывисто при использовании его с setInterval. Для сравнения верните частоту кадров обратно на значение 30, и вы увидите, в чем заключается разница. В конечном счете, правильным решением будет не пытаться и не принуждать setInterval выполняться быстрее частоты смены кадров (несмотря на то, что это возможно). Flash позволяет использовать эту возможность, однако это не повод пользоваться ею при всяком удобном случае.

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

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

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

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

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

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