Опубликован: 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, полезно использовать информативные и не лишенные смысла названия.

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

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

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

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

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

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