Давайте назовем векторную скорость мяча по x как vxi (v для «velocity», x для «x direction», i для «initial»), а скорость мяча по y как vyi. Проекции vxi и vyi на линию действия будут vyip (p соответствует «prime»):
vyip =vyi *cos(alpha)-vxi *sin(alpha)
Проекция vxi и vyi на саму линию равна vxip.
vxip =vxi *cos(alpha)+vyi *sin(alpha)
Теперь, когда шаг 1 выполнен, мы перемещаемся на шаг 2 и меняем знак vyip (помните, что f соответствует «final»).
vyfp =-vyip
vxfp =vxip
Обратите внимание, что конечная векторная скорость вдоль линии (vxfp) неизменна. Теперь мы перемещаемся на шаг 3 для проецирования vyfp и vxfp обратно на оси x и y для получения конечных векторных скоростей, vxf и vyf.
vxf =vxfp *cos(alpha)-vyfp *sin(alpha)
vyf =vyfp *cos(alpha)+vxfp *sin(alpha)
Эти два значения, vxf и vyf, являются векторными скоростями мяча по x и y в момент после столкновения. Использовать этот кода ActionScript не трудно. Давайте посмотрим на пример. Откройте файл ball_line.fla в папке Chapter06. Код ActionScript в этом файле очень похож на то, что вы видели в файле ball_line.fla из Главы 5, «Обнаружение столкновений». Основное отличие кода ActionScript в этом файле заключено в функции ballLineReaction(). Эта функция приведена ниже:
1 function ballLineReaction(tempLine,point,x,y){
2 var lineDecay =tempLine.lineDecay;
3 var alpha =tempLine.angle;
4 var cosAlpha =math.cos(alpha);
5 var sinAlpha =math.sin(alpha);
6 //получить векторные скорости шара по x и y
7 var vyi =point.ymov;
8 var vxi =point.xmov;
9 //спроецировать векторные скорости по x и y на линию действия
10 var vyip =vyi*cosAlpha-vxi*sinAlpha;
11 //спроецировать векторные скорости по x and y на линию
12 var vxip =vxi*cosAlpha+vyi*sinAlpha;
13 //перевернуть векторную скорость вдоль линии действия
14 var vyfp =-vyip*lineDecay;
15 var vxfp =vxip;
16 //перевести назад на оси x и y во Flash
17 var vyf =vyfp*cosAlpha+vxfp*sinAlpha;
18 var vxf =vxfp*cosAlpha-vyfp*sinAlpha;
19 //установить векторные скорости шара на основе полученных результатов
20 point