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

Луноход

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

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