Это требует от нас обратного проецирования с линии действия на оси, с использованием угла theta. Ниже представлены выражения для новых векторных скоростей каждого шара.
xvel1 = v1f*cos(theta)-yvel1prime*sin(theta)
yvel1 = yvel1prime*cos(theta)+v1f*sin(theta)
xvel2 = v2f*cos(theta)-yvel2prime*sin(theta)
yvel2 = yvel2prime*cos(theta)+v2f*sin(theta)
Ниже приводится краткий обзор того, что мы сделали:
1. Спроецировали векторные скорости x и y каждого шара на линию действия. Это необходимо потому, что в момент столкновения оказывают действие лишь векторные скорости (импульсы), которые направлены вдоль линии действия.
2. Применяем уравнения сохранения к этим проецированным векторным скоростям для нахождения новой векторной скорости после столкновения.
3. Используя новые скорости вдоль лини действия и векторных скоростей, перпендикулярных линии действия, спроецировать все назад на оси x и y Flash. Это даст новые значения конечной скорости после того, как произошло столкновение.
Теперь давайте посмотрим это на ActionScript. Откройте файл billiard_ball.fla в папке Chapter06. Код ActionScript в этом файле по большей части идентичен тому, что содержится в файле circle_circle2.fla в Главе 5, «Обнаружение столкновения». Отличия кода ActionScript заключаются в следующем:
1. Мы добавляем к объектам ball переменную mass в процессе определения объекта в начале кода ActionScript. Для объекта ball1 мы устанавливаем mass в 1, выполнением оператора game.ball1.mass =1, а для объекта ball2 мы устанавливаем mass в 1 аналогичным оператором game.ball2.mass =1.
2. В функции ballToBallDetection() мы больше не выполняем оператор trace, когда столкновение обнаружено. Вместо этого, мы вызываем функцию с именем ball2BallReaction(). Когда она вызвана, мы передаем функции ball2BallReaction() следующую информацию:
b1,b2,xl1,xl2,yl1,yl2,whatTime
Если вы помните, b1 и b2 являются ссылками на объекты ball, xl1 и yl1 являются начальными координатами ball1, xl2 и yl2 являются начальными координатами ball2, а whatTime представляет число кадров, начиная с последнего кадра, который следует перед столкновением (это число между 0 и 1)