Луноход
В массиве pads хранятся имена трех клипов посадочных площадок. На одном уровне имеется всего лишь две посадочные площадки, но язык ActionScript этого не учитывает.
function startLevel() { gotoAndStop("level" + gameLevel); // Размещаем клип корабля. ship._x = 275; ship._x = 25; // Корабль не движется. ship.dx = 0; ship.dy = 0; // Инициализируем гравитацию. gravity = 0.1; // Инициализируем индикатор горючего. fuel = 100; showFuel(); // Определяем точки корабля, которые могут коснуться поверхности Луны. hitPoints = new Array(); hitPoints.push({ x: -9, y: 13 }); hitPoints.push({ x: 9, y: 13 }); hitPoints.push({ x: 0, y: -10 }); hitPoints.push({ x: -9, y: -7 }); hitPoints.push({ x: 8, y: -7 }); // Определяем координаты опор лунохода footPoints = new Array(); footPoints.push({ x: -9, y: 13 }); footPoints.push({ x: 9, y: 13 }); // Создаем массив из клипов "pad" (посадочная площадка) pads = new Array(); for (i = 0; i < 3; i++) { pads.push(_root["pad" + i]); } }В каждом кадре посредством клипа "actions" вызывается функция moveShip, которая, в свою очередь, вызывает множество небольших функций для управления кораблем. Всегда лучше разбивать большой фрагмент кода на несколько небольших функций.
function moveShip() { shipThrusters(); shipMovement(); checkForLand(); checkForCrash(); }Функция shipThrusters проверяет, осталось ли еще горючее, если нет, то клип "ship" переходит к кадру "normal". В противном случае, если игрок нажимает на одну из клавиш со стрелками "вверх", "влево" или "вправо", включается соответствующий ускоритель. Клип "ship" переходит к соответствующему кадру, и чтобы отразить эффект действия ускорителя, изменяются значения dx и dy. Также уменьшается количество топлива.
function shipThrusters() { // Проверяем ускорители и корректируем скорость, if (fuel < 0) { ship.gotoAndStop("normal"); } else if (Key.isDown(Key.UP)) { ship.dy -= 0.4; ship.gotoAndStop("up"); fuel -= 2; showFuel(); } else if (Key.isDown(Key.LEFT)) { ship.dx -= 0.2; ship.gotoAndStop("left"); fuel -= 1; showFuel(); } else if (Key.isDown(Key.RIGHT)) { ship.dy += 0.2; ship.gotoAndStop("right"); fuel -= 1; showFuel(); } else { //Не включен ни один из ускорителей, ship.gotoAndStop("normal"); } }Функция shipMovement изменяет скорость корабля согласно гравитации и перемешает корабль в зависимости от скорости лунохода.
function shipMovement() { // Гравитация заставляет корабль двигаться вниз, ship.dy += gravity; // Перемещаем корабль. ship._x += ship.dx; ship._y += ship.dy; }Функция checkPorLand проверяет массив footPoints: находится ли хоть одна опора лунохода внутри клипа "pad". Если там нет ни одной опоры, переменной landed присваивается значение false. Такое же значение присваивается и в том случае, когда скорость лунохода больше трех единиц, поскольку данная скорость слишком высока для того, чтобы луноход смог совершить посадку.
