Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3398 / 338 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 14:

Видеоданные

Библиотека Library

Здесь нет ничего необычного: просто располагаются символы рисунков кнопок проигрывания и паузы, фильм play-pause и импортированное видео.


Действия

Код для инстанса playMov (кнопка play/pause) находится в кадре 1 слоя actions главной временной шкалы. Ниже приведен код целиком, далее мы будем рассматривать его детально.

Stop();
  playMov.onRelease = function() {
  if (state == "paused") {
  state = "playing";
  play ();
  playMov.gotoAndStop(2);
  } else if (state == "playing") {
  state = "paused";
  stop();
  playMov.gotoAndStop(1);
  }
  };
  playMov.gotoAndStop(1);
  state = "paused";

Разберем этот код. Здесь все относительно несложно, поэтому я не буду описывать каждую задачу. После действия stop расположен фрагмент кода для инстанса кнопки playMov. Во второй строке playMov устанавливается на обработку щелчка мыши, за которым, в случае возникновения данного события, выполняется функция. Первым делом проверяется флаговая переменная state для выяснения, воспроизводится ли в данный момент фильм или находится в состоянии паузы. В различных случаях происходит следующее.

  • Значение state изменяется на противоположное.
  • Временная шкала останавливается или запускается.
  • Изменяется визуальное представление рисунка кнопки.

Итак, когда фильм поставлен на паузу ( state == "paused" ), переменная state меняет значение на "playing", фильм начинает воспроизводиться, и временная шкала playMov передается для отображения рисунка паузы в кадре 2.

Имейте в виду, что в вышеуказанном коде я не использовал элемент управления _root по одной очень важной причине. _root, как правило, можно использовать для управления главной временной шкалой в файле Flash, однако, в данном случае, мы готовим SWF-файл, который будет загружаться с главной страницы Flatpack Records. Например, если сайт загрузил banthabroadband.swf, содержавший элементы управления _root, влияние оказывалось бы на главную страницу, а не на banthabroadband.swf.

Последний фрагмент вышеуказанного кода просто завершает функцию и инициализирует фильм в режиме паузы.

Мы рассмотрели почти весь код. Остался последний фрагмент, который необходимо рассмотреть - gotoAndPlay (2);. Этот код обеспечивает беспрерывное повторение до тех пор, пока пользователь не прервет воспроизведение. Вы могли бы также останавливать воспроизведение на последнем кадре с отображением кнопки "Воспроизвести еще раз?" перед переходом к началу видеоряда.

Теперь, когда вы знаете, как все это работает, запустите фильм. Все оказалось совсем не сложно!

Существуют и другие элементы управления, такие как кнопки перемотки назад и вперед, они рассмотрены в следующем параграфе.

Создание кнопок перемотки вперед и назад

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

  • При нажатии пользователем кнопки начать прямую или обратную перемотку.
  • Когда пользователь отпустил кнопку, вернуться к нормальному воспроизведению.

Если вы откроете законченный файл banthacontroller2.fla (на компакт-диске), вы увидите, что на временной шкале появились два дополнительных инстанса кнопок перемотки вперед и назад. Оба они расположены на слое buttons и имеют соответствующие имена инстансов: rewindMov для кнопки перемотки назад и forwardMov для кнопки перемотки вперед (см. рис. ниже).

Помимо этих нововведений, различия между этим файлом и dummybanthacontroller.fla, рассмотренным в предыдущем упражнении, находятся в кадре 1 слоя actions. Некоторые новые функции были добавлены к каждой из двух новых кнопок.



Рассмотрим дополнительный код для данного фильма.

frameSkip = 10;
  Stop();
  // Play / pause button playMov.onRelease = function() {
    if (state == "paused") {
      state = "playing";
      play ();
      playMov.gotoAndStop(2);
    } else if (state == "playing") {
      state = "paused"; stop();
      playMov.gotoAndStop(1);
    }
  };
  // Fast forward button
  forwardMov.onPress = function() {
    forwardMov.onEnterFrame = function() {
      gotoAndPlay(_currentframe+frameSkip);
      };
  };
  forwardMov.onRelease = function() {
    forwardMov.onEnterFrame = undefined;
    state = "playing";
      playMov.gotoAndStop(2);
  };
  // Rewind button
  rewindMov.onPress = function() {
    rewindMov. onEnterFrame = function() {
      if (_currentframe>l) {
        gotoAndPlay(_currentframe-frameSkip); }
      };
    };
  rewindMov. onRelease = function() {
    rewindMov.onEnterFrame = undefined;
    if (_currentframe == 1) {
      state = "paused";
      playMov.gotoAndStop (1);
    } else {
      state = "playing";
      playMov.gotoAndStop(2);
    }
  };
  // Initialise
  playMov.gotoAndStop(1);
  state = "paused";
Пример 13.1.

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

frameSkip = 10;

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

// Fast forward button
  forwardMov.onPress = function() {
    forwardMov.onEnterFrame = function() {
      gotoAndPlay(_currentframe + frameSkip);
    };
  };

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

При нажатой кнопке forwardMov функция onEnterFrame для инстанса активируется, при этом дается команда на быстрое движение временной шкалы. Это действие устанавливает "считывающую головку" на кадр, указанный параметром _currentframe плюс значение переменной frameSkip. Итак, установив этот код на выполнение в каждом кадре при отпускании кнопки, нам нужно очищать его следующим образом.

forwardMov.onRelease = function() {
    forwardMov.onEnterFrame = undefined;
    state = "playing";
    playMov.gotoAndStop(2);
  };

Первые две строки кода очищают функцию onEnterFrame при отпускании кнопки мыши с удалением всего кода прокрутки кадров, который был добавлен ранее.

Следующие две строки кода должны быть вам знакомы из кода для кнопки воспроизведения/паузы. Когда кнопка перемотки вперед отпускается, видеофильм продолжит воспроизведение с нормальной скоростью, и данные строки кода просто обновляют state воспроизведения и рисунок для следующего нажатия. Это может показаться не достаточно важным действием, однако, на самом деле, оно предохраняет от неприятных последствий некорректных состояний кнопки и необходимости нажимать кнопку повторно для обеспечения выполнения нужного действия.

Теперь, когда мы закончили работу над кнопкой перемотки вперед, перейдем к кнопке перемотки в обратную сторону.

// Rewind button
  rewindMov.onPress = function() {
    rewindMov.onEnterFrame = function() {
      if (_currentframe>1) {
        gotoAndPlay(_currentframe-frameSkip);
      }
    };
  };

Этот код также вам знаком (он аналогичен коду для кнопки перемотки вперед). В отличие от предыдущего кода, он воспроизводится не бесконечно. Если вы помните, в предыдущем фильме, когда "головка воспроизведения" достигала последнего кадра временной шкалы, она циклически возвращалась к кадру 2. Таким образом, при перемотке вперед до конца фильма Flash просто возвращался к кадру 2 и продолжал воспроизведение, что приводило к непрерывному воспроизведению.

Однако кнопка перемотки назад не будет позволять бесконечную перемотку назад, так как фильм будет прекращать воспроизведение при возврате к кадру 1. Нам было бы легко предотвратить это и позволить фильму повторяться в обоих направлениях, однако время и пространство могут таким образом быть искажены, и вы можете запросто оказаться году в 1985: Забавно, но есть доля истины.

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

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

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

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

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