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

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

Покадровое движение

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


Расстояние, на которое перемещается объект, одинаково во всех кадрах. Пройденное расстояние равно всему расстоянию, деленному на число кадров, в данном случае, 200 пикселей делится на 5 кадров и получается 40 пикселей на каждый кадр.

Постоянная скорость

Вы увидите, что в каждом кадре преодолевается одно и то же расстояние. Для начала движения необходимо знать, насколько должен переместиться фильм, и в течение скольких кадров это должно произойти. Вычисление расстояния на кадр включает в себя лишь деление расстояния на общее число кадров.

  1. Проделайте те же шаги, что и в предыдущем примере, чтобы приготовиться к добавлению ActionScript в панель Actions.
  2. Итак, перейдем к программе. Нам нужно присвоить действие нашему фильму, с помощью которого в каждом кадре будет выявляться местоположение указателя мыши, после чего фильм будет перемещаться в эту точку. Во Flash 5 это можно было бы легко сделать с помощью выделения фильма и присвоения ему onClipEvent (enterFrame).
  3. Прежде всего, мы введем переменную для хранения числа кадров движения. Затем мы установим функцию onMouseDown для ball_mc. Эта функция будет вычислять общее расстояние по осям x и y и затем делить это число на значение переменной кадров для выяснения расстояния, на которое будет перемещаться фильм в каждом кадре.
  4. Мы также введем переменную-счетчик frameNum, которая будет использоваться для определения того, на какое расстояние переместился фильм - мы будем прибавлять к ее значению единицу в каждом кадре фильма, и когда она будет равна значению переменной кадров, движение будет прекращаться.
    this.frames = 30;
    
    ball_mc.onMouseDown = function() {
      this.frameNum = 0;
      // calculate how far to move each frame on the x and у axes
      this.xStep = (this._parent._xmouse-this._x) /this._parent.frames ;
      this.yStep = (this._parent._ymouse-this._y) /this._parent.frames;
      this.onEnterFrame = this._moveToMouse;
    };
  5. Далее нам нужно будет написать функцию moveToMouse, которая будет сначала добавлять значения xStep и yStep, добавлять дубликат и затем проверять, достиг ли он своей конечной точки:
    moveToMouse = function () {
      // add the step value each frame
      this._x += this.xStep;
      this._y += this.yStep;
      this.duplicate();
      this.checkTime();
    };
  6. Функции дубликата и уменьшения идентичны тем, которые мы только что использовали.
  7. Последним добавлением в наш код будет функция checkTime, прибавляющая единицу к значению переменной frameNum и затем прекращающая движение по достижении конечной точки, т.е. числа кадров, указанного нами в начале:
    ball_mc.checkTime = function() {
      this.frameNum++;
      if (this.frameNum == this._parent.frames) {
        delete this.onEnterFrame;
      }
    };
  8. Сохраните фильм в файле frame based motion.fla и запустите его. При выполнении этого кода вы увидите, что дубликаты создаются непрерывно, и фильм непосредственно достигает конечной точки.

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

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

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

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

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

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

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