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