Луноход
В массиве pads хранятся имена трех клипов посадочных площадок. На одном уровне имеется всего лишь две посадочные площадки, но язык ActionScript этого не учитывает.
function
startLevel() {
gotoAndStop(
"level"
+
gameLevel);
// Размещаем клип корабля.
ship._x
=
275
;
ship._x
=
25
;
// Корабль не движется.
ship.dx
=
0
;
ship.dy
=
0
;
// Инициализируем гравитацию.
gravity
=
0.1
;
// Инициализируем индикатор горючего.
fuel
=
100
;
showFuel();
// Определяем точки корабля, которые могут коснуться поверхности Луны.
hitPoints
=
new
Array();
hitPoints.push({
x:
-
9
,
y:
13
});
hitPoints.push({
x:
9
,
y:
13
});
hitPoints.push({
x:
0
,
y:
-
10
});
hitPoints.push({
x:
-
9
,
y:
-
7
});
hitPoints.push({
x:
8
,
y:
-
7
});
// Определяем координаты опор лунохода
footPoints
=
new
Array();
footPoints.push({
x:
-
9
,
y:
13
});
footPoints.push({
x:
9
,
y:
13
});
// Создаем массив из клипов "pad" (посадочная площадка)
pads
=
new
Array();
for
(i
=
0
; i
<
3
; i
+
+
) {
pads.push(_root[
"pad"
+
i]);
}
}
В каждом кадре посредством клипа "actions" вызывается функция moveShip, которая, в свою очередь, вызывает множество небольших функций для управления кораблем. Всегда лучше разбивать большой фрагмент кода на несколько небольших функций.
function
moveShip() {
shipThrusters();
shipMovement();
checkForLand();
checkForCrash();
}
Функция shipThrusters проверяет, осталось ли еще горючее, если нет, то клип "ship" переходит к кадру "normal". В противном случае, если игрок нажимает на одну из клавиш со стрелками "вверх", "влево" или "вправо", включается соответствующий ускоритель. Клип "ship" переходит к соответствующему кадру, и чтобы отразить эффект действия ускорителя, изменяются значения dx и dy. Также уменьшается количество топлива.
function
shipThrusters() {
// Проверяем ускорители и корректируем скорость,
if
(fuel
<
0
) {
ship.gotoAndStop(
"normal"
);
}
else
if
(Key.isDown(Key.UP)) {
ship.dy
-
=
0.4
;
ship.gotoAndStop(
"up"
);
fuel
-
=
2
;
showFuel();
}
else
if
(Key.isDown(Key.LEFT)) {
ship.dx
-
=
0.2
;
ship.gotoAndStop(
"left"
);
fuel
-
=
1
;
showFuel();
}
else
if
(Key.isDown(Key.RIGHT)) {
ship.dy
+
=
0.2
;
ship.gotoAndStop(
"right"
);
fuel
-
=
1
;
showFuel();
}
else
{
//Не включен ни один из ускорителей,
ship.gotoAndStop(
"normal"
);
}
}
Функция shipMovement изменяет скорость корабля согласно гравитации и перемешает корабль в зависимости от скорости лунохода.
function
shipMovement() {
// Гравитация заставляет корабль двигаться вниз,
ship.dy
+
=
gravity;
// Перемещаем корабль.
ship._x
+
=
ship.dx;
ship._y
+
=
ship.dy;
}
Функция checkPorLand проверяет массив footPoints: находится ли хоть одна опора лунохода внутри клипа "pad". Если там нет ни одной опоры, переменной landed присваивается значение false. Такое же значение присваивается и в том случае, когда скорость лунохода больше трех единиц, поскольку данная скорость слишком высока для того, чтобы луноход смог совершить посадку.