crouch();
58 var crouchMove =true;
59 var left =false;
60 }
61 }
62 }
63 }
64 }
65 hero.onPlatform =onPlatform;
66 if (crouchMove){
67 if (left){
68 hero.tempx -=hero.pushSpeed;
69 }else {
70 hero.tempx +=hero.pushSpeed;
71 }
72 }
73 if (!hero.onPlatform &&oldOnPlatform){
74 //он как раз слева от платформы
75 hero.inAir =true;
76 }
77 }
Вначале мы сохраняем текущее состояние свойство onPlatform объекта hero как oldOnPlatform. Мы используем это в конце функции для определения, находится ли герой слева от платформы без подпрыгивания. Далее мы устанавливаем локальную переменную onPlatform в false. Мы предполагаем, что герой находится не на платформе. Затем, в последующих циклах и условиях мы определяем, действительно ли герой находится на платформе.
В строке 4 мы инициируем цикл for, который проходит по всем объектам платформ в массиве column (который хранит объекты, представляющие платформы). В строке 5 мы создаем ссылку на текущий объект в массиве column с именем platform. Затем мы создаем несколько локальных переменных для хранения некоторых свойств это платформы (строка 6-10).
В строке 11 мы делаем нечто, что может быть не очевидно в данный момент. Если вы помните описание независимого от кадров обнаружения столкновений в Главе 5, «Обнаружение столкновений», это подобно моментальному снимку. Если один или оба объекта двигаются достаточно быстро, то они могут пройти друг сквозь друга без обнаружения этого факта. Такое возможно и в этой игре. В действительности, я столкнулся с этой проблемой при программировании этой игры и применил технику, которую я собираюсь описать. Вот что происходит в строке 11: мы берем координаты, где герой был в последнем кадре и координаты, где он находится в этом кадре, и затем делим это расстояние на шаги. Далее мы проходим через процедуру обнаружения столкновения в каждом шаге. Если столкновение найдено, мы останавливаем цикл. В большинстве случаев вы убедитесь, что одной петли достаточно