Космический бой
Если значение 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.
Другие возможности
Возможно, вы захотите создать свои собственные вариации этого ролика. Допустим, реализовать такую идею: пули всегда будут попадать в одну точку экрана. Игрок сможет управлять кораблем с помощью клавиш со стрелками. Например, если игрок нажимает клавишу со стрелкой "влево", то чтобы создать иллюзию перемещения, все астероиды двигаются вправо.
Также можно усовершенствовать игру, предусмотрев уровни и изменив отображение числа столкновений с астероидом. Например, у вас есть некий механизм подсчета этого числа: когда его значение приблизится к максимальной отметке, начнет мигать красная лампочка.
