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

Маятник

Смоделируем движение маятника на следующем примере. При наведении мыши маятник начинает колебаться, и часы тикают ровно 1 раз в секунду. Мышкой можно «схватить» маятник за диск и перетащить, задав новое начальное отклонение.

Сложность заключается в том, чтобы добиться анимации, похожей на работу реального маятника:

  • угловая скорость (скорость изменения угла поворота) маятника — величина переменная;

  • в нижней точке скорость маятника наибольшая;

  • в крайних точках угловая скорость равна нулю;

  • амплитуда (размах колебаний) маятника остается постоянной;

  • маятник проходит от одной крайней точки до другой ровно за 1 секунду.

Вообще говоря, реальный маятник — достаточно сложная физическая система. Однако если нам просто надо сделать «похоже», можно считать, что угол поворота маятника изменяется по закону синуса (или, точнее, косинуса):

Функция α = cos(t), где t — время, описывает бесконечную волну с амплитудой 1 и периодом 2π. Это значит, что за время 2π единиц маятник возвращается обратно в ту же точку, а за время π делает половину цикла, то есть переходит из одного крайнего положения в другое.

Нам нужно изменить амплитуду и период так, чтобы амплитуда была равна некоторому заданному значению A, а полупериод равен 1 секунде или, если измерять время в кадрах, 25 кадров. Можно показать, что при частоте 25 кадров в секунду этим условиям удовлетворяет функция

α = A·cos (π·t / 25),

где α — угол поворота, а t — время в кадрах.

Для вычисления функции cos будем использовать метод Math.cos, а вместо числа π=3,1415926... — константу Math.PI из того же модуля Math

  1. Скопируйте файл pend.fla, выделите на сцене маятник (клип pend) и добавьте обработчики событий

onClipEvent (load) {

max = 20;

_rotation = max;

t = 0;

}

onClipEvent (enterFrame) {

_rotation = max*Math.cos(t*Math.PI/25);

t ++;

}

  1. Проверьте ролик.

При создании клипа устанавливается размах колебаний (20 градусов), маятник выводится в крайнее положение и обнуляется счетчик кадров t («время»).

Теперь добавим звук («тиканье»), который должен проигрываться каждую секунду, то есть при значениях t, равных 25, 50 и т.д. Заметим, что все эти числа делятся нацело (без остатка) на 25, поэтому получаем

if ( t % 25 == 0 ) проиграть звук;

Напомним, что оператор % вычисляет остаток от деления первого числа на второе.

  1. Присвойте звуку tick.wav из библиотеки имя tick (правая кнопка мыши, Linkage). Добавьте в конец обработчика enterFrame код

if (t % 25 == 0) {

snd = new Sound();

snd.attachSound("tick");

snd.start(0,1);

}

Добавим еще одну возможность — маятник можно будет «схватить» мышкой и перетащить в новое крайнее положение.

Введем логическую переменную track, которая будет равна true («да»), если идет перетаскивание маятника. При создании клипа она должна быть равна false, при нажатии кнопки мыши на маятнике — true, а при отпускании мыши — снова false.

Обратите внимание, что при отпускании мыши (все равно, на маятнике или вне его), в переменной max запоминается новый максимальный угол поворота, а счетчик времени сбрасывается в ноль.

Остается самое сложное — сделать слежение маятника за мышкой в режиме перетаскивания. Для определения угла будем использовать координаты клипа _x и _y (точка регистрации совпадает с центром вращения) и текущие координаты мыши _xmouse и _ymouse на главном монтажном столе _root.

Желаемый угол поворота α определяется значениями dx и dy, их отношение dx/dy определяет тангенс угла α. Для вычисления самого угла будем использовать функцию Math.atan2.

  1. В самое начало обработчика enterFrame добавьте код

if (track) {

dx = _x - _root._xmouse;

dy = _root._ymouse - _y;

alpha = Math.atan2(dx, dy);

_rotation = alpha*180/Math.PI;

return;

}

  1. Проверьте работу клипа и сохраниnе его с именем ЛР5_2.fla

Этот блок срабатывает только тогда, когда идет перетаскивание (значение track равно true). Величины dx и dy вычисляются так, как на рисунке. Функция Math.atan2 возвращает значение угла в радианах, для записи в свойство _rotation клипа угол переводится в градусы. В последней строчке происходит выход из функции по команде return (возврат), так как при перетаскивании остальной код обработчика (перемещение маятника) выполнять не нужно.

  • Индивидуальное задание

Для фильма, созданного вами ранее, добавьте новую сцену и обеспечьте программную реализацию управления движением объектов вашего фильма по наклонной плоскости, отскока объекта от плоскости.

Сохраните фильм с именем Фамилия_ИДЗ_5.fla

Лабораторная работа № 6

«Организация столкновения объектов»

Два круга

Проще всего определить факт столкновения между двумя кругами:

Пусть центры кругов находятся в точках (x1,y1) и (x2,y2), а их радиусы равны r1 и r2. Круги пересекаются, если расстояние между их центрами

меньше, чем сумма радиусов r1+r2.

Два прямоугольника

Метод hitTest

В среде Flash есть стандартное средство для проверки пересечения прямоугольников, ограничивающих два клипа (символа типа Movie Clip). Это метод hitTest, который можно вызывать для любых объектов-клипов. Вот пример использования этой функции

if ( clip1.hitTest(clip2) )

trace ("Клипы пересекаются!");

Здесь clip1 и clip2 — имена двух клипов, которые задаются на панели Properties. Метод hitTest возвращает true («да») в том случае, когда прямоугольники, ограничивающие клип, пересекаются. То же самое можно было записать иначе, поменяв местами имена клипов:

if ( clip2.hitTest(clip1) )

trace ("Клипы пересекаются!");

Изучим эту функцию на простом примере парковки автомашины. Желтая машина управляется клавишами-стрелками, задача — припарковаться между машин в левой или в правой части стоянки.

  1. Скопируйте файл parking.fla, выделите желтую машину и добавьте к ней код двух обработчиков, обеспечивающих движение при нажатии клавиш-стрелок:

onClipEvent (load) {

v = 5;

function move(d) {

r = _rotation * Math.PI / 180;

_x += d * Math.sin(r);

_y -= d * Math.cos(r);

}

}

onClipEvent (enterFrame) {

if (Key.isDown(Key.UP)) move(v);

else

if (Key.isDown(Key.DOWN)) move(-v);

if (Key.isDown(Key.LEFT)) _rotation -= 5;

else

if (Key.isDown(Key.RIGHT)) _rotation += 5;

}

При столкновении с уже стоящей машиной надо выдать звуковой сигнал. Кроме того, желтая машина не должна «наезжать» на другие, поэтому после столкновения необходимо вернуть ее обратно в то положение, где она была до аварии. Для того, чтобы хранить предыдущие координаты и угол поворота машины, введем переменные _xOld, _yOld и _rotOld. Их начальные значение устанавливаются при загрузке клипа (событие load).

  1. Добавьте в обработчик события load строчки

_xOld = _x;

_yOld = _y;

_rotOld = _rotation;

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

Осталось написать функцию check. С помощью панели Properties дайте остальным машинам-клипам имена car1, car2, car3 и car4. Такая система имен позволит нам организовать цикл проверки по всем машинам

  1. Добавьте в конец обработчика load код функции check:

function check() {

for (i = 1; i <= 4; i++)

if (this.hitTest(_root["car" + i])) {

_x = _xOld;

_y = _yOld;

_rotation = _rotOld;

break;

}

}

Здесь в цикле проверяется пересечение клипа this (желтой машины, к которой присоединен этот код) с клипами car1, car2, car3 и car4. Если обнаружено пересечение, машина возвращается на предыдущее место и происходит выход из цикла по оператору break (столкновение с остальными машинами проверять не нужно).

Добавим проигрывание звука при столкновении.

  1. Дайте звуку crash.wav из библиотеки имя crash и добавьте в нужное место функции check код

snd = new Sound();

snd.attachSound("crash");

snd.start(0, 1);

  1. Проверьте работу клипа и сохрание его с именем ЛР6_1.fla

Посмотрев на исходное расположение машин, можно ожидать, что определение пересечения по границам прямоугольников будет довольно точным, поскольку все машины достаточно плотно заполняют отведенное им место. Однако при проверке клипа вы обнаружите, что столкновение происходит даже тогда, когда машины довольно далеко друг от друга.

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

  1. Создайте новый символ типа Movie Clip с именем Прямоугольник, нарисуйте красный прямоугольник без заливки так, чтобы его левый верхний угол находился в точке регистрации (где стоит крестик при редактировании символа). Выделите контур двойным щелчком и установите на панели Properties толщину линии 1 пиксель.

Для контуров можно также задать режим масштабирования (список Scale), то есть определить, как будет изменяться толщина линии при изменении размеров клипа. В списке Scale можно выбрать один из четырех вариантов:

  • Normal — меняется при любом изменении размеров;

  • Horizontal — только при изменении ширины;

  • Vertical — только при изменении высоты;

  • None — толщина линии не меняется.

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