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

Математика и физика Flash

Вы смотрите на меня?

Это небольшое упражнение даст очень простой, но полезный результат: фильм будет всегда указывать на курсор мыши, динамически поворачиваясь вслед за ним. Мы также "привяжем" фильм к мыши. Запустите ship.swf, чтобы увидеть результат в действии.

  1. Откройте новый основной фильм. Прежде всего в нем нужно создать клип, который будет играть роль указателя. Наш круглый футбольный мяч для этого не годится, поэтому создайте такой рисунок, который будет указывать определенное направление, например, космический корабль. В системе координат Flash, угол 0 градусов направлен вправо, а величина угла возрастает в направлении часовой стрелки, поэтому независимо от того, что вы нарисовали, сделайте так, чтобы рисунок с самого начала указывал в правую сторону. Как обычно, назовите инстанс именем movieClip1_mc:

  2. Теперь нужно решить, на что будет указывать наш рисунок. Так как мы создаем этот файл с нуля, единственный объект, двигающийся по экрану - это указатель мыши. Его мы и будем использовать в качестве цели, на которую будет указывать наш фильм. Расстоянием xdistance будет расстояние от позиции _x фильма до this._xmouse, а расстоянием ydistance будет расстояние между movieClip1_mc._y и this._ymouse. Добавьте новый слой Actions, и настройте его так же, как и в последний раз в функции onEnterFrame.
    this.onEnterFrame = function() {
        var dx = this._xmouse-movieClip1_mc._x;
        var dy = this._ymouse-movieClip1_mc._y;
      };
  3. Затем мы будем вычислять угол между movieClip1 и мышью с помощью математической функции atan2.
    this.onEnterFrame = function() {
        var dx = this._xmouse-movieClip1_rnc._x;
        var dy = this._ymouse-movieClip1_mc._y;
        var angle = Math.atan2(dy, dx);
      };
  4. Теперь мы можем использовать этот угол для поворота movieClip1. Однако нужно помнить, что параметр _rotation фильма выражается в градусах, а не в радианах. Поэтому нам нужно добавить преобразование из градусов в радианы, рассмотренное ранее.
    this.onEnterFrame = function() {
        var dx = this._xmouse-movieClip1_mc._x;
        var dy = this._ymouse-movieClip1_mc._y;
        var angle = Math.atan2(dy, dx);
        movieClip1_mc._rotation = angle*180/Math.PI;
      };
  5. Запустите фильм. Ваш рисунок будет постоянно поворачиваться за указателем мыши.

  6. Закройте пробный фильм. Давайте подумаем, как сделать это все динамически. Так как расстояния X и Y ( dx и dy ) постоянно вычисляются, мы можем не только заставить рисунок постоянно "смотреть" на указатель мыши, но еще сделать так, что рисунок будет все время двигаться за указателем мыши. Вставьте небольшой отрывок кода, который сейчас уже должен быть вам понятен.
    this.onEnterFrame = function() {
        var dx = this._xmouse-movieClip1_mc._x;
        var dy = this._ymouse-movieClip1_mc._y;
        var angle = Math.atan2(dy, dx);
        movieClip1_mc._rotation = angle*180/Math.PI;
        movieClip1_mc._x += (_root._xmouse-movieClip1_mc._x)/10;
        movieClip1_mc._y += (_root._ymouse-movieClip1_mc._y)/10;
      };
  7. Запустите фильм еще раз. Вы увидите, что фильм будет следовать за указателем мыши как потерявшийся щенок. Если вы не представляете себе, как можно реализовать игру на основе этого эффекта:что ж, продолжим.
  8. Сохраните фильм с осмысленным именем. Позже в этой лекции он нам еще понадобится.
Игорь Хан
Игорь Хан

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

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

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

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

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