Иллюстрированный самоучитель по созданию Flash-игр

Составь лису методом "Перетащи и положи"

Весь код поместим в клип "actions", который как обычно находится вне, пределов рабочей области и содержит только надпись "Actions".

Данному клипу назначен сценарий ActionScript, управляющий перемещением всех элементов. Он должен включать несколько функций onClipEvent. Ниже приведено краткое описание событий и реакций на них, которые сценарий должен выполнять:

  • load (загрузить) – задание переменной, указывающей, что никакого перемещения еще не происходит;
  • mouseDown (кнопка мыши нажата) – определение выбранного элемента и создание переменной, сообщающей, что этот элемент перетаскивается. Определение смешения между местом, над которым нажата кнопка мыши, и центром выбранного элемента;
  • mouseUp (кнопка мыши отпущена) – установка начальных параметров переменной, указывающих, что никакой элемент в данный момент не перетаскивается;
  • enterFrame (проигрывание кадра) – изменение положения перемещаемого элемента соответственно движению курсора минус разница между координатами центра элемента и координатами точки, по которой щелкнул пользователь. Два момента из предыдущего списка могут смутить непрограммиста. Первый – это постоянно упоминаемая переменная. В коде ей будет назначено имя dragPart и исходное значение 0. Это значение соответствует состоянию, при котором не происходит никакого перемещения. Однако, как только пользователь выбирает элемент, переменной dragPart присваивается номер данного элемента, а когда значение переменной равно какому-либо числу, происходит перемещение. Когда пользователь отпускает элемент, переменная вновь принимает значение 0.

В рассматриваемом коде есть еще один сложный момент – смешение при передвижении элементов. Когда мы перетаскиваем какой-либо объект, то приравниваем значения его координат значению координат курсора. Однако, если пользователь щелкнет не в центре координат объекта, то при приравнивании положения объекта к положению курсора, произойдет "скачок"; координаты объекта мгновенно станут равны координатам курсора.

Чтобы этого не происходило, мы используем переменные offsetx и offsety для хранения величины расстояния между центром объекта и местом клика и при изменении координат объекта учитываем это смещение.

Теперь давайте рассмотрим каждую часть данного кода. Вначале выполняется функция onClipEvent (load). Она необходима для инициализации переменной dragPart.

// При загрузке ничего не перетаскиваем.
onClipEvent(load) {
    dragPart = 0;
}

Наиболее сложной частью кода является функция onClipEvent (mouse-Down). Она проверяет все 13 элементов при помощи функции hitTest и определяет, над какой из них расположен курсор. Затем задает переменную dragPart, а также переменные of f setx и of f sety.

Обратите внимание, что клипы элементов для упрощения кода имеют имена от "Part1" до "Partl3".

// Начинаем перемещение.
onClipEvent(mouseDown) {
    // Определяем текущие координаты курсора.
    x = _root._xmouse;
    y = _root._ymouse;
    // Находим часть, над которой в данный момент находится курсор.
    for (i = 1; i <= 13; i++) {
        // Имеет смысл заменить константу 13 переменной, содержащей
        // количество частей, например countOfParts. Это облегчит
        // дальнейшую модификацию ролика.
        if (_root["Part" + i].hitTest(x, y, true)) {
            // Указываем, какой элемент нужно перетаскивать,
            // и задаем смещение.
            dragPart = i;
            offsetx = _root["Part" + i]._x - x;
            offsety = _root["Part" + i]._y - y;
            break;
        }
    }
}

Когда пользователь отпускает кнопку мыши, переменная вновь принимает значение 0.

onClipEvent(mouseUp) {
    dragPart = 0;
}

Вместо параметров _xmouse и _ymouse вышеприведенный код использует _root._xmouse и _root._ymouse. Первые параметры соответствуют положению курсора относительно клипа, а не рабочего поля. Поэтому если ваш клип не будет расположен в верхнем левом углу, вы не получите нужных значений. При добавлении в код параметра _root положение курсора будет всегда задаваться относительно рабочего поля.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.