Если длина массива moving равна 0, то все шары останавливаются и ход завершается. Когда это происходит, вызывается moveDone(), который анализирует результаты ваших ударов и определяет, чей сейчас ход.
Анализ времени выполнения кода
Вы обратили внимание на две строки, закомментированные в нашем вышеприведенном коде ActionScript (строки 2 и 17)? Если снять комментарии, они распечатают значение времени в миллисекундах (ms), которое требуется для полного выполнения всех операторов в событии onEnterFrame. Приблизительно 24 раза в секунду в окно вывода output печатается новое число. Это одно из моих наиболее часто используемых средств, когда необходимо найти способы оптимизации игры. Я использую данный метод, когда пытаюсь найти самые медленные части скрипта. Я могу видеть числа, так как рамка разбита и шар-биток ставится как шар-в-руке, чтобы посмотреть, делаются ли вещи с разумной скоростью. Что считать разумной? Вы должны обратиться к вашему собственному опыту, чтобы ответить на этот вопрос. Но вот точка старта: мы работаем на 24 fps. В 1 секунде 1000 ms – приблизительно 41 ms в кадре. Если распечатываемое время для вашего события onEnterFrame больше 41 ms, то фильм не будет воспроизводиться не на полной скорости. Так что у вас возникло бы желание постараться придерживаться числа ниже 41. Я бы считал разумным иметь в некоторые моменты более 41 (такие как разбивание бильярда), не в среднем не подниматься выше 41.
moveDone()
Эта функция обрабатывает логику для определения, сохранился ли за вами ход или игра завершена. Когда вы ударяете по шару-битку, отслеживается несколько действий игры. Если вы сталкиваетесь сначала с правильным шаром, то correctFirstHit устанавливается в true. Если 9-шаров забиты в лузы, то nineBallSank устанавливается в true. Эти четыре булевых значения могут определить, сохраняется ли ваш ход или игра закончена. Если игра закончена, то этот скрипт также определит, кто победитель:
1 function moveDone(){
2 roundPositions();
3 flagStopped("yes");
4 inPlay =false;
5 var loseTurn =false;
6 var gameOver =false;
7 var scratch =false;
8 if (nineBallSank &&!cueBallSank &&correctFirstHit){
9 var gameOver =true;
10 }else if (nineBallSank &&(cueBallSank ||