Нам необходимо знать линию действия, поэтому мы вычисляем ее в строках 10-12; в строке 10 и 11 мы вычисляем подъем и протяженность линии действия, а затем в строке 12 мы вычисляем угол с помощью atan2. Поскольку мы будем использовать синус и косинус угла theta несколько раз, в строках 13 и 14 мы устанавливаем переменные для сохранения этих значений, чтобы не приходилось вычислять их повторно. В строках 16 и 17 векторная скорость каждого шара спроецирована на линию действия. Эти векторные скорости изменяются во время столкновения. Далее мы вычисляем векторные скорости, перпендикулярные линии действия. Они лишь должны помочь нам сделать проецирование обратно на оси Flash. В строках 21-27 использованы уравнения сохранения. Результатом (строки 26 и 27) являются новые векторные скорости вдоль линии действия после столкновения. Теперь, когда мы имеем новую векторную скорость вдоль линии действия, мы можем сделать перевод обратно на оси x и y Flash. Мы делаем это в строках 29-32. Это новые векторные скорости каждого шара и должны быть сохранены для каждого шара. Но вначале мы устанавливаем временную позицию шара, точно там, где шары должны быть, когда они впервые столкнулись (строки 34-37). Теперь мы изменяем векторную скорость объектов ball в строках 38-41.
Создайте SWF для тестирования этого файла. Вы можете видеть, что когда два шара сталкиваются, они реагируют в реалистичной манере. Закройте SWF и измените массу одного из шаров в большую сторону, например 10 или 20. Затем протестируйте файл снова, и вы увидите, что уравнения сохранения работают правильно. Вы только что изучили самую трудную часть в создании игры бильярд!
Если вы хотели бы посмотреть другую реализацию описанных выше положений, откройте файл realGravity.fla в папке Chapter06. Этот файл был создан с помощью Flash 5 некоторое время назад, так что код ActionScript может выглядеть по-другому в сравнении с тем, что приведен здесь (но он, конечно, по-прежнему работает так же превосходно)