Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ActionScript 2.0 ЛР.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Одномерное движение

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

  1. Скопируйте файл pool.fla. Найдите элемент Невидимая кнопка в библиотеке и двойным щелчком мыши откройте его.

В первых трех кадрах, которые показывают состояния кнопки, пусто, и только в кадре Hit, где обозначается активная область кнопки, нарисован прямоугольник. На сцене в режиме разработки кнопка изображается голубым прямоугольником, а при проигрывании фильма ее не видно. Кнопка необходима затем, чтобы можно было за нее схватить мышкой и потянуть кий вправо.

  1. Щелкните дважды по кию на сцене, чтобы открыть клип.

В этом клипе кадры  1 и 10 имеют имена init (начальное положение) и move (движение). В первом кадре слоя Программа стоит команда stop(), это значит, что клип в самом начале останавливается на 1 кадре.

Когда нужно будет оттянуть кий вправо, мы направим клип на метку move, где начинается анимация слоя Рисунок. После анимации клип снова останавливается: в кадре 30 стоит команда stop().

  1. Выделите невидимую кнопку и добавьте обработчики событий:

on (press) {

ball._x = 360;

ball._y = 180;

power.text = "0";

x0 = _root._xmouse;

track = true;

}

on (dragOut) {

stick.gotoAndPlay ("move");

}

on (release, releaseOutside) {

stick.gotoAndStop ("init");

track = false;

}

При нажатии кнопки (событие press) координаты шарика (клипа с именем ball) устанавливаются в начальное положение, в текстовое поле power выводится нулевая сила, в переменной x0 запоминается x-координата щелчка мыши. Логическая переменная track показывает, идет ли перетаскивание — при нажатии кнопки она принимает значение true («да»).

Когда мышь выходит из активной области при нажатой кнопке мыши (событие dragOut) кий (клип stick) переходит к кадру move и начинается анимация.

Когда кнопка мышь отпущена (события release и releaseOutside) кий резко возвращается в исходное положение (на метку init). Переменной track присваивается значение false (перетаскивания больше нет).

  1. Выделите шарик и добавьте к нему обработчик события:

onClipEvent (mouseMove) {

if ( _root.track ) {

P = _root._xmouse - _root.x0;

_root.power.text = P;

}

}

Клип получает событие mouseMove даже тогда, когда мышь находится вне клипа. Если идет перетаскивание (переменная track монтажного стола _root равна true), запоминаем разницу между текущей x-координатой мыши и начальной координатой x0 (силу удара) в переменной P и выводит это значение в текстовое поле power.

Обратите внимание, что при обращении к переменным track и x0 надо указывать их адрес _root, тогда как в коде невидимой кнопки мы этого не делали. Дело в том, что кнопка является частью монтажного стола и работает с его переменными напрямую, а клип имеет свой монтажный стол и свои переменные (например, переменная P относится к клипу).

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

  1. Добавьте к шарику еще один обработчик события:

onClipEvent (enterFrame) {

if ( ! _root.track && P > 2 ) {

_x -= 5;

P -= 2;

}

}

Движение происходит только тогда, когда нет перетаскивания (переменная-флаг track равна false) и оставшаяся сила P больше 2. Два знака & рядом означают логическую операцию «И» (одновременное выполнение двух условий).

На каждом шаге x-координата клипа уменьшается на 5 пикселей, а сила — на 2 единицы.

Проверив клип, мы видим, что шарик движется неестественно: его скорость постоянна и он резко останавливается.

Чтобы улучшить анимацию, используем следующие идеи:

  • на каждом шаге шарик смещается на расстояние, пропорциональное оставшейся силе;

  • сила уменьшается неравномерно, на каждом шаге теряется 10 процентов, то есть P умножается на 0.9.

  1. Измените обработчик события enterFrame:

onClipEvent (enterFrame) {

if ( ! _root.track && P > 2 ) {

_x -= 0.5*P;

P = 0.9*P;

}

}

  1. Проверьте ролик и сохраните файл c именем ЛР4_1.fla

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]