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

Шарик в кольце

Мы построим пример, в котором шарик будет летать внутри кольца

  1. Скопируйте файл skew.fla. Поместите клип Шар из библиотеки на сцену в любое место внутри кольца.

  2. Выделите шар, и добавьте к нему код, который «двигает» объект по экрану:

onClipEvent(load){

v = 5;

rBall = _width / 2;

angle = random(360) * Math.PI / 180;

vx = v*Math.sin(angle);

vy = -v*Math.cos(angle);

function fly() {

_x += vx;

_y += vy;

}

setInterval ( fly, 20 );

}

  1. Проверьте работу клипа.

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

Раньше мы рассматривали отскок точки, а шарик имеет ненулевые размеры. Тем не менее, отскок шарика от поверхности можно рассмотреть как отскок его центра от некоторой окружности, радиус которой меньше, чем внутренний радиус кольца, на величину радиуса шарика.

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

Вычислим радиус окружности, которая ограничивает движение центра шарика (на рисунке он обозначен через R). Если открыть клип Шар в режиме редактирования, легко проверить, что внешний радиус кольца равен 150, а его внутренний радиус — 95% от внешнего (см. свойство Inner radius), то есть 142,5. Кроме того, их этого числа нужно вычесть радиус шарика, который в программе определяется автоматически и записывается в переменную rBall.

  1. Добавьте перед функцией fly строчки

xc = 200;

yc = 200;

R = 142.5 - rBall;

Здесь через xc и yc обозначаются координаты центра кольца.

Теперь остается написать код, который моделирует упругое отталкивание шарика от стенок. Мы расположим его внутри функции fly, он срабатывает тогда, когда расстояние между центром кольца и центром клипа-шарика становится меньше R.

  1. Добавьте в конец функции fly код

var dx = _x - xc;

var dy = _y - yc;

var dist = Math.sqrt(dx*dx + dy*dy);

if ( dist >= R ) {

n1x = dx / dist;

n1y = dy / dist;

vn = vx*n1x + vy*n1y;

vx -= 2*vn*n1x;

vy -= 2*vn*n1y;

updateAfterEvent();

}

  1. Сохраните файл и посмотрите, как работает клип.

Рассмотрим код более подробно. Сначала определяются смещения шарика относительно центра по осям X и Y, а также расстояние до центра:

var dx = _x - xc;

var dy = _y - yc;

var dist = Math.sqrt(dx*dx + dy*dy);

Если это расстояние меньше или равно R, произошло столкновение. Вектор нормали (перпендикулярный к плоскости отскока) всегда направлен к центру кольца и имеет координаты (dx,dy). Если разделить их на dist, получается единичный вектор того же направления с координатами

n1x = dx / dist;

n1y = dy / dist;

Далее вычисляем скалярное произведение вектора скорости и вектора n1, которое равно проекции скорости на нормаль:

vn = vx*n1x + vy*n1y;

и изменяем компоненты вектора скорости в соответствии с формулой предыдущего пункта

vx -= 2*vn*n1x;

vy -= 2*vn*n1y;

Коэффициент 2 говорит о том, что соударение абсолютно упругое.

Вызов функции updateAfterEvent заставляет программу сразу же перерисовать шарик в новом положении.

Если внимательно присмотреться, шарик в момент соударения «заходит» на кольцо. Действительно, это следует из условия dist>=R. Чтобы исправить этот недочет, нужно «вернуть» шарик назад так, чтобы его центр находился точно на окружности. Попробуйте разобраться в следующем коде самостоятельно.

  1. Добавьте в начало тела условного оператора (внутри фигурных скобок) код

var k = (dist - R) / R;

_x -= dx*k;

_y -= dy*k;

  1. Сохраните фильм с именем ЛР5_1.fla

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