Аналогично, когда шар прекращает движение, он удаляется из moving и вставляется в notMoving.
Затем мы правильно размещаем шары на столе вызовом функции rack(). После этого, в строке 15, если ход за Эстель, ей дают шар-в-руке вызовом функции ballInHand(). Строка «partial» передается в ballInHand(). Эта строка означает, что шар-в-руке позади головной линии. Если передается «full», то она получает шар-в-руке без ограничений. Заключительные несколько строк в этой функции прозрачны: вызывается функция moveVariables() (она инициализирует некоторые переменные и вызывается перед каждым ударом). Затем появляется всплывающая графика и информирует вас, что игра началась.
onEnterFrame
В нижней части кадра Actions есть событие onEnterFrame:
1 this.onEnterFrame =function(){
2 //l =getTimer();
3 if (inPlay){
4 moveBalls();
5 keepGoing =true;
6 timer =0;
7 while (keepGoing &&++timer<10){
8 ball2Ball();
9 }
10 detectWalls();
11 patch();
12 renderBalls();
13 if (game.moving.length ==0){
14 moveDone();
15 }
16 }
17 //trace(getTimer()-l);
18 };
Операторы в данном случае выполняются в каждом кадре, если inPlay равно true. Эта переменная устанавливается в true, когда пробивается шар-биток. В строке 4 мы делаем кое-что, что вы уже видели повсюду в этой книге: обновляем координаты объектов в памяти, но не в сцене. Далее мы устанавливаем keepGoing в true и timer в 0. Ранее в этой главе мы в деталях рассмотрели способ, которым мы выполняли обнаружение столкновения. Мы сохраняем все столкновения, сортируем массив и затем вычисляем реакцию на столкновения для первого столкновения в массиве. В строках 7-9 мы проходим через скрипт обнаружения столкновения снова и снова, пока не обнаружены все столкновения. Когда никаких более столкновений не обнаружено, функция ball2Ball() устанавливает keepGoing в false, и цикл прерывается. Однако, вы вероятно уже обратили внимание, что мы установили также другое ограничение для этого цикла – мы не можем позволить ему выполняться более чем десять раз за кадр