Луноход
Если после этого значение переменной landed все еще равно true, значит, луноход удачно совершил посадку. Все, что, теперь необходимо сделать, – перейти к следующему кадру в основной временной шкале и увеличить значение переменной gameLevel на единицу.
function checkForLand() { // Выясняем, обе ли опоры находятся на посадочной площадке. landed = true; for (i = 0; i < footPoints.length; i++) { // Просматриваем все площадки. footDown = false; for (j = 0; j < pads.length; j++) { // Проверяем, находится ли опора на площадке, if (pads[j].hitTest(ship._x + footPoints[i].x, ship._y + footPoints[i].y, true)) { footDown = true; break; } } // Если опора не находится на площадке, значит, корабль не совершил посадку, if (!footDown) { landed = false; break; } } // Проверяем, не слишком ли быстра движется корабль. if (ship.dy > 3.0) landed = false; if (landed) { // Посадка совершена. gotoAndPlay(_currentFrame + 1); gameLevel++; } }С другой стороны, необходимо проверять, взорвался луноход или нет. В массиве hitPoints содержится список координат точек вокруг корабля: двух опор, середины каждой стороны, вершины и центра днища. Так как невозможно определить, полностью ли один объект накладывается на другой, вы просто проверяете эти точки. Если какая-то из них оказалась внутри элемента "activeground", тогда корабль разбился. У клипа "Ground – level X" на каждом уровне – имя экземпляра "activeground".
function checkForCrash() { // Корабль не совершил посадку. Проверяем, коснулся ли он поверхности Луны, if (Handed) { // Просматриваем все возможные точки касания. for (i = 0; i < hitPoints.length; i++) { // Проверяем, не коснулся ли корабль поверхности Луны в этой точке. if (activeground.hitTest(ship._x + hitPoints[i].x, ship._y + hitPoints[i].y, true)) { ship.gotoAndPlay("explode"); // Уменьшаем количество жизней или завершаем игру. gotoAndPlay("lost ship"); break; } } } }Еще одна полезная функция в этом ролике – showFuel. Она берет клип "meter" и присваивает его свойству _xscale величину fuel. Так как сначала значение переменной fuel (запас горючего) равно 100, а затем уменьшается до 0, его легко использовать для свойства _xscale. Если бы диапазон значений fuel был другим, вам бы пришлось сначала преобразовать их так, чтобы они находились в диапазоне от 0 до 100, а лишь затем присваивать их свойству _xscale.
function showFuel() { gauge.meter._xscale = fuel; }Обратите внимание: для того чтобы размеры клипа "meter" уменьшались справа налево, необходимо поместить центр клипа так, чтобы центр прямоугольника располагался справа от него. Если центр клипа окажется слева, то изменение величины _xscale приведет к тому, что объект будет сокращаться к центру, а не справа налево.
К сведению
В этом ролике к каждой кнопке Play прикреплена одна строчка кода. Просмотрите каждый из этих сценариев, чтобы понять, к какому кадру переходит ролик или какая функция вызывается.
Обратите внимание, что во всех трех типах ускорителей использовалась одна и та же анимация – thrust animation. Для левого и правого ускорителей клип поворачивался на 90° или на – 90°. Размер анимации боковых ускорителей был уменьшен, так как предполагается, что они слабее основного ускорителя.
Другие возможности
В этой игре очки не начисляются. Вы же можете добавлять очки за каждую успешную посадку, причем за посадку на труднодоступные посадочные площадки начислять больше обычного. Также можно предоставлять премию за скорость и объем неиспользованного топлива. Добавить уровни к игре очень просто, для этого нужно только нарисовать рельеф. Когда вы исчерпаете все свои идеи, попробуйте изменить код таким образом, чтобы на более высоких уровнях с тем же рельефом корабль имел меньше топлива или была более сильная гравитация.
