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

Интерфейсы AсtionScript

Перетаскивание и бросание объектов

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

  1. Мы можем начать с ввода только что созданного кода для перетаскивания и вставки.
  2. Необходимо знать, перетаскиваем ли мы объект в данный момент. Это можно сделать с помощью переменной типа Boolean, которую мы назовем dragging. Мы будем устанавливать значение переменной dragging на "истина" при перетаскивании фильма, и на "ложь", когда кнопка мыши не нажата. Для лучшего контроля мы сделаем dragging параметром самого клипа.
    mc1_mc.onPress = function() {
        this.startDrag();
        this.dragging = true;
      };
      mc1_mc.onRelease = mc1.onReleaseOutside = function () {
        this.stopDrag();
        this.dragging = false;
      };
  3. Нам нужен некоторый код для перемещения объекта в то время, когда он не перетаскивается. Это реализуется в функции управляющего элемента события onEnterFrame. Сначала мы просто будем проверять, является ли объект перетаскиваемым. Если это не так, объект будет перемещен.
    mc1_mc.onEnterFrame = function() {
        if (!this.dragging) {
          this._x += this.xSpeed;
          this._y += this.ySpeed;
        }
      };

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

    mc1_mc.xSpeed = 1;
      mc1_mc.ySpeed = 1;
  4. Теперь нужно определить, что происходит при перетаскивании. Это выполняется в блоке else после начального блока if. В этом случае мы можем проигнорировать имеющиеся переменные скорости и перезаписать их. Мы знаем, что xSpeed является числом пикселей, на которое фильм переместится горизонтально в одном кадре. Чтобы "бросить" объект, мы просто направляем в обратную сторону процесс перетаскивания. Определяем, насколько далеко мы перетащили объект по горизонтали с момента последнего кадра и присваиваем это значение переменной xSpeed.
    mc1_mc.onPress = function() {
        this.startDrag();
        this.dragging = true;
      };
      mc1_mc.onRelease = mc1_mc.onReleaseOutside = function () {
        this.stopDrag();
        this.dragging = false;
      };
      mc1_mc.onEnterFrame = function() {
        if (!this.dragging) {
          this._x += this.xspeed;
          this._y += this.yspeed;
        } else {
          this.xSpeed = this._x-this.oldx;
          this.ySpeed = this._y-this.oldy;
          this.oldx = this._x;
          this.oldy = this._y;
        }
      };

    Рассмотрим код в обратном порядке. В конце функции мы присваиваем текущее значение _x переменной с именем oldx. В следующий раз мы выполняем функцию через долю секунды. Мы незначительно переместили объект, поэтому его значение _x теперь несколько отличается от прежнего. Если вычесть старое значение из нового, мы узнаем расстояние, на которое переместился объект. Присваиваем это значение переменной xSpeed. Когда мы, наконец, отпускаем кнопку мыши, возобновляется выполнение кода для перемещения самого объекта с использованием значения xSpeed. Для значений _y и ySpeed строки кода будут идентичны рассмотренным.

  5. Может случиться, что объект, перемещаясь слишком быстро, выйдет за пределы экрана и вовсе исчезнет. Этот недостаток можно устранить, применяя перенос экрана и трение. Сначала используем перенос. Данный способ заключается в том, что объект, уходя за пределы экрана, будет снова появляться на противоположной стороне. Такой прием использовался при создании многих видеоигр. Что бы это сделать, нужно проверить позицию и изменить ее, если она выходит за пределы допустимого. Это будет происходить сразу после обновления позиции объекта.
    if (this._x>Stage.width) {
        this._x = 0;
      } else if (this._x<0) {
        this._x = 550;
      }
      if (this._y>Stage.height) {
        this._y = 0;
      } else if (this._y<0) {
        this._y = 400;
      }
  6. Добавление трения постепенно, с каждым кадром, уменьшает скорость объекта. Самым простым способом здесь является умножение переменных скоростей на величину вроде 0,98 в каждом кадре. Это можно применить прямо перед добавлением скорости по направлениям.
    this.xspeed *=   .98;
      this.yspeed *=   .98;

    Итак, независимо от того, с какой скоростью вы "бросили" объект, он всегда будет замедляться так, что вы снова сможете его захватить мышью. В следующей лекции мы рассмотрим дополнение к этому подходу. Окончательный код находится в файле throwcursor.fla в папке Chapter 6 на компакт-диске.

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

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

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

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

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