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

Космический бой

С помощью команды Mouse.hide () с экрана удаляется обычный курсор, вместо этого положение курсора вы будете определять с помощью клипа.

function initGame() {
    // Создаем массивы для пуль и астероидов,
    bullets = new Array();
    rocks = new Array();
    // Помещаем перекрестие и кабину корабля поверх остальных элементов.
    _root["foreground"].swapDepths(9999999);
    _root["cursor"].swapDepths(9999999);
    // Устанавливаем переменные,
    level = 0;
    damage = 0;
    hits = 0;
    // Убираем обычный курсор, вместо него отображаем перекрестие.
    Mouse.hide();
}

При каждом обращении к клипу "actions" вызывается функция moveCursor, которая помешает клип "cursor" в точку, где находится курсор мыши. Игрок использует такой курсор, чтобы прицеливаться.

function moveCursor() {
    // Перемещаем перекрестие в точку, где находится курсор мыши.
    cursor._x = _xmouse;
    cursor._y = _ymouse;
}

Кнопка "button" при нажатии клавиши Пробел вызывает функцию fire, в которой определяется положение курсора и создается пара новых клипов "point" для пуль. Кроме того, в массив bullets добавляются следующие элементы: исходное положение, конечное положение, пройденное расстояние и имя клипа для каждой пули.

function fire() {
    // Определяем положение мыши.
    x = _xmouse;
    y = _ymouse;
    // Создаем левую пулю.
    level++;
    attachMovie("point", "bullet" + level, level);
    bullets.push({
        startx: 50,
        starty: 350,
        destx: x,
        desty: y,
        dist: 1.0,
        clip: "bullet" + level
    });
    // Создаем правую пулю.
    level++;
    attachMovie("point", "bullet" + level, level);
    bullets.push({
        startx: 500,
        starty: 350,
        destx: x,
        desty: y,
        dist: 1.0,
        clip: "bullet" + level
    });
}

После того как пуля выпущена, ее движением во всех кадрах управляет функция moveBullets, которая использует массив bullets, чтобы отслеживать путь каждой пули. В каждом кадре значение свойства dist уменьшается на 40% от своего предыдущего значения. Пуля отображается между своим исходным и конечным положением в зависимости от значения dist. Если это значение равно 1.0, пуля находится в исходном положении, а при 0.0 – в конечном.

Однако когда значение свойства dist становится равным 0.01, считается, что пуля практически закончила свой путь. В этот момент вызывается функция checkForHit, чтобы определить, попадет ли пуля в астероид или нет. Независимо от результата пуля удаляется из массива и ролика.

Эта игра не претендует на трехмерную модель реального пространства. Она, скорее, воссоздает типичную аркадную игру.

function moveBullets() {
    // Перемещаем все пули.
    for (i = bullets.length - 1; i >= 0; i--) {
        // Увеличиваем пройденное расстояние на 40%.
        bullets[i].dist *= 0.4;
        // Если пуля оказалась слишком далеко от астероида, удаляем ее.
        if (bullets[i].dist < 0.01) {
            checkForHit(bullets[i].destx, bullets[i].desty);
            _root[bullets[i].clip].removeMovieClip();
            bullets.splice(i, 1);
            // Помещаем пулю ближе к цели.
        }
        else {
            bullets[i].x = bullets[i].dist * bullets[i].startx + (1.0 - bullets[i].dist) * bullets[i].destx;
            bullets[i].y = bullets[i].dist * bullets[i].starty + (1.0 - bullets[i].dist) * bullets[i].desty;
            _root[bullets[i].clip]._x = bulletsfi].x;
            _root[bullets[i].clip]._y = bullets[i].y;
        }
    }
}

Астероид создан так же, как и пуля. Однако координаты появления и исчезновения астероида выбираются случайно. Стартовая точка находится на расстоянии 25 пикселов по горизонтали и вертикали от центра экрана. Конечная точка отстоит от центра на расстоянии 550 пикселов по горизонтали и 400 по вертикали, что ровно в два раза больше размера рабочего поля. Это означает, что астероид появляется всегда в районе центра экрана, но может финишировать в любой точке вне видимой его области.

function createRock() {
    // Задаем случайное положение для астероида,
    startx = Math.random() * 50 + 250;
    starty = Math.random() * 50 + 175;
    // Задаем случайное направление движения,
    destx = Math.random() * 1100 - 275;
    desty = Math.random() * 800 - 200;
    // Добавляем астероид.
    level++;
    attachMovie("rock", "rock" + level, level++);
    rocks.push({
        startx: startx,
        starty: starty,
        destx: destx,
        desty: desty,
        dist: 0.01,
        clip: "rock" + level
    });
}

Подобно функции moveBullets функция moveRocks использует свойство dist каждого астероида, чтобы передвинуть его. Однако со временем он приближается к экрану и его начальное значение 0.01 в каждом кадре увеличивается на 10%. Помимо положения астероида его свойства _xscale и _yscale также зависят от dist, это делает возможным увеличивать астероид и создавать иллюзию его приближения к кораблю.

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