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

Представление сайта

Управление движением

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

Было бы гораздо лучше брать любой определенный фильм и создавать myMovieClip.slideTo(100,200), чтобы фильм мог перемещаться к этой точке и останавливаться, без надобности присваивать фильму вручную управляющий элемент clipEvent или функцию для проверки достижения конечной точки, и т.д.

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

Скольжение

  1. Откройте новый фильм и разместите на рабочем месте инстанс ball_mc.
  2. Первое, что мы сделаем на отдельном слое сценариев, это добавим вызов функции slideTo, которая будет выполняться каждый раз при щелчке мышью пользователем.
  3. Мы будем передавать функции slideTo три параметра: позицию по оси x, позицию по оси y и еще одно значение, которое будет указывать скорость скольжения:
    _root.onMouseDown = function() {
      ball_mc.slideTo(this._xmouse, this._ymouse, 4);
    };
  4. Теперь нам нужно создать непосредственно функцию slideTo, которая должна будет выполнять два отдельных действия:
    • устанавливать в фильме значения targetX и targetY ;
    • настраивать управляющий элемент enterFrame фильма для обеспечения его скольжения по направлению к конечной точке.

      Вместо того чтобы определять эту функцию для отдельного фильма, как мы делали в предыдущих функциях ball_mc.checkDistance, мы поместим ее в MovieClip.prototype. Все функции внутри MovieClip.prototype доступны в равной степени всем фильмам. Все встроенные методы фильмов, такие как goToAndPlay, также присутствуют в movieclip.prototype. При вызове функции она ведет себя так, как если бы она была внутри фильма.

      MovieClip.prototype.slideTo = function(x, y, speed) {
        // set up targets and speed variable
        this.targetX = x;
        this.targetY = y;
        this.speed = speed;
      
        // create onEnterFrame function
          this.onEnterFrame = function() {
          // take care of motion
          this._x += (this.targetX-this._x)/this.speed;
          this._y += (this.targetY-this._y)/this.speed;
      
          // check if near target
            if (Math.abs(this.targetX-this._x)<0.2 
             && Math.abs(this.targetY-this._y)< 0.2) {
            this._x = this.targetX;
            this._y = this.targetY;
            delete this.onEnterFrame;
          }
        };
      };

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

    • Сохраните ваш файл под именем issueCommand1.fla и запустите его. При щелчке мышью фильм будет скользить к месту щелчка.
    • Мы также можем попытаться применить тот же самый подход в двух фильмах - создать копию исходного фильма ball_mc и дать новому инстансу имя ball_mc2 с помощью Property Inspector.
    • Перетащите инстанс ball_mc2 на рабочее место и затем откройте панель Actions для изменения кода onMouseDown, согласно тексту кода, приведенному ниже:
      _root.onMouseDown = function() {
        ball_mc.slideTo(this._xmouse, this._ymouse, 4);
        ball_mc2.slideTo(this._xmouse+19, this._ymouse, 1);
      };
    • Сохраните фильм в файле issueCommand1b.fla и запустите его. Вы заметите, что второй фильм перемещается значительно правее указателя мыши и со значительно меньшей скоростью.

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

Другая проблема состоит в том, что мы помещаем в фильм переменные, такие как targetX, targetY и speed, которые могут уже использоваться в фильме с другими целями. Они будут просто записываться поверх старых, что соответствующим образом повлияет на функциональность фильма. Несмотря на то, что мы обычно помним имена, присваиваемые объектам в нашем ActionScript, полезно использовать информативные и не лишенные смысла названия.

Игорь Хан
Игорь Хан
След не остается
Александр Коргапольцев
Александр Коргапольцев
Вопрос по содержанию лекции №2, курс Flash MX Studio
Евгения Новоселецкая
Евгения Новоселецкая
Россия
Станислав Бакулин
Станислав Бакулин
Эстония, Нарва