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

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

Если значение dist становится больше 1.0 и астероид все еще находится в видимой области экрана, считается, что астероид попал в корабль. Астероид взрывается, и значение переменной damage увеличивается. Если значение переменной damage больше или равно 20, то игра заканчивается.

function moveRocks() {
    // Перемещаем все астероиды,
    for (i = rocks.length - 1; i >= 0; i--) {
        // Уменьшаем расстояние до корабля на 10%.
        rocks[i].dist *= 1.1;
        // Проверяем, может ли астероид задеть корабль.
        if (rocks[i].dist > 1.0) {
            // Проверяем, ударил ли астероид корабль,
            if (rocks[i].destx > 0 and rocks[i].destx < 550 and rocks[i].desty > 0 and rocks[i].desty < 400) {
                // Взрываем астероид и увеличиваем количество повреждений.
                _root[rocks[i].clip].gotoAndPlayf "explode blue");
                damage++;
                foreground.displayDamage = damage;
                // Смотрим, превысило ли количество повреждений допустимый уровень.
                if (damage >= 20) {
                    removeAllRocks();
                    Mouse.show();
                    gotoAndStop("game over");
                }
                // Если астероид не попал по кораблю, то убираем его.
            }
            else {
                _root[rocks[i].clip].removeMovieClip();
            }
            // Убираем элемент из массива,
            rocks.splice(i, 1);
            // Перемещаем астероид.
        }
        else {
            rocks[i].x = (1.0 - rocks[i].dist) * rocks[i].startx + rocks[i].dist * rocks[i].destx;
            rocks[i].y = (1.0 - rocks[i].dist) * rocks[i].starty + rocks[i].dist * rocks[i].desty;
            _root[rocks[i].clip]._x = rocks[i].x;
            _root[rocks[i].clip]._y = rocks[i].y;
            // Увеличиваем астероид.
            _root[rocks[i].clip]._xscale = 100 * rocks[i].dist;
            _root[rocks[i].clip]._yscale = 100 * rocks[i].dist;
        }
    }
}

Когда пуля достигает своей цели, вызывается функция checkForHit. Она проверяет все астероиды: находится ли один из них там же, где и пуля. Если да, астероид взрывается и удаляется из массива, увеличивается значение переменной hits.

function checkForHit(x, y) {
    // Просматриваем все объекты-астероиды на предмет попадания по ним.
    for (j = rocks.length - 1; j >= 0; j--) {
        // Выясняем, попадет ли пуля в этот астероид,
        if (_root[rocks[j].clip].hitTest(x, y)) {
            // Если да, взрываем астероид и удаляем из массива.
            hits++;
            foreground.displayHits = hits;
            _root[rockfj].clip].gotoAndPlay("explode red");
            rocks.splice(j, 1);
        }
    }
}

В конце каждой анимации взрыва (рис. 16.2) небольшой сценарий вызывает функцию killRock, которая удаляет любой вызывающий ее клип. Таким образом, можно удалить астероид сразу же, как только он взорвался.

function killRock(clip) {
    //вызываем эту функцию,когда астероид взорвался, чтобы удалить его.
    clip.removeMovieClip();
}

Когда игра заканчивается, вызывается функция removeAllRocks, чтобы в кадре "game over" не отображались оставшиеся пули и астероиды.

function removeAllRocks() {
    // Удаляем все астероиды.
    for (i = rocks.length - 1; i >= 0; i--) {
        _root[rocks[i].clip.removeMovieClip();
    }
}

К сведению

В клипе "foreground" находятся текстовые поля, связанные с переменными hits и damage. К сожалению, так как они расположены на первом уровне внутри клипа, они не будут реагировать на изменения значений hits и damage, принадлежащих основной временной шкале. То есть для этих текстовых полей необходимо указать команды типа _root.displayDamage = damage. Для того чтобы избежать недоразумений, эти области были названы displayDamage и displayHits.

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

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

Также можно усовершенствовать игру, предусмотрев уровни и изменив отображение числа столкновений с астероидом. Например, у вас есть некий механизм подсчета этого числа: когда его значение приблизится к максимальной отметке, начнет мигать красная лампочка.

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