Космический бой
С помощью команды 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, это делает возможным увеличивать астероид и создавать иллюзию его приближения к кораблю.