Иллюстрированный самоучитель по созданию Flash-игр

Луноход

Если после этого значение переменной 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°. Размер анимации боковых ускорителей был уменьшен, так как предполагается, что они слабее основного ускорителя.

Другие возможности

В этой игре очки не начисляются. Вы же можете добавлять очки за каждую успешную посадку, причем за посадку на труднодоступные посадочные площадки начислять больше обычного. Также можно предоставлять премию за скорость и объем неиспользованного топлива. Добавить уровни к игре очень просто, для этого нужно только нарисовать рельеф. Когда вы исчерпаете все свои идеи, попробуйте изменить код таким образом, чтобы на более высоких уровнях с тем же рельефом корабль имел меньше топлива или была более сильная гравитация.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.