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

Организация отскока объектов Одномерное движение

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

Когда мяч летит вниз (рисунок слева), сила тяжести G давит его вниз, а сила сопротивления воздуха Fc — подталкивает вверх, так как действует противоположно скорости v. При движении вверх (рисунок справа) обе силы действуют в одном направлении.

Будем считать скорость положительной, когда мяч летит вниз (его y-координата увеличивается). Тогда сила тяжести дает положительное ускорение (увеличение скорости), а сила сопротивления — отрицательное при полете вниз (когда v>0) и положительное при полете вверх (когда v<0).

Изменение скорости в программе на каждом небольшом интервале можно записать так:

v += g - mu * v * v / Math.abs(v);

Здесь g и mu — характеризуют ускорение свободного падения и сопротивление воздуха (строго говоря, mu зависит от скорости и формы объекта, но мы упрощаем дело, здесь эти тонкости не очень нужны).

Величина Math.abs(v) — это модуль скорости, поэтому отношение v/Math.abs(v) равно 1, если скорость положительна (вниз), и -1, если отрицательная. Такой прием позволяет учитывать движение в обоих направлениях.

Из-за сопротивления скорость изменяется на mu*v, то есть сила сопротивления линейно зависит от скорости.

На больших скоростях эта зависимость становится более сложной — квадратичной и даже кубичной (от квадрата или от куба скорости).

Единственная проблема — избежать деления на нуль при нулевой скорости (в самой высокой точке). Для этого применим условный оператор:

v += g;

if ( v != 0 ) v -= mu * v * v / Math.abs(v);

В момент отскока (когда мяч достигает предельного нижнего положения) направление вектора скорости скачком меняется на противоположное, при этом теряется часть энергии, т.е. скорость уменьшается по модулю. Отскок с потерей 5% скорости в программе можно записать так:

v = - 0.95*v;

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

onClipEvent (load) {

v = 0;

g = 9.81;

mu = 0.02;

function bounce() {

v += g;

if (v != 0) v -= mu * v * v / Math.abs(v);

if (_y + v > 350) {

_y = 350;

v = -0.95 * v;

}

else _y += v;

}

}

onClipEvent (enterFrame) {

bounce();

}

При загрузке клипа (событие load) задается начальная скорость v, ускорение свободного падения g и коэффициент сопротивления mu. Кроме того, описывается функция bounce, в которой изменяется скорость и координата мяча. Предельная y-координата равна 350, при достижении этого уровня происходит отскок.

Функция bounce вызывается в обработчике события enterFrame, то есть (в нашем случае) 12 раз в секунду.

Если нужно перерисовывать мяч реже или чаще (вызывать функцию с другим интервалом), можно использовать таймер и функцию setInterval. Например, если добавить в конец обработчика load строчку

setInterval ( bounce, 100 );

функция bounce будет вызываться с интервалом 100 мс.

Если интервал меньше, чем интервал смены кадров, могут быть проблемы с перерисовкой объекта. Чтобы улучшить анимацию, надо добавить вызов

updateAfterEvent();

(перерисовать после события) в конец функции bounce.

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

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

  2. Сохраните файл с именем ЛР4_4.fla.

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