Луноход
Если после этого значение переменной landed все еще равно true, значит, луноход удачно совершил посадку. Все, что, теперь необходимо сделать, – перейти к следующему кадру в основной временной шкале и увеличить значение переменной gameLevel на единицу.
function
checkForLand() {
// Выясняем, обе ли опоры находятся на посадочной площадке.
landed
=
true
;
for
(i
=
0
; i
<
footPoints.length; i
+
+
) {
// Просматриваем все площадки.
footDown
=
false
;
for
(j
=
0
; j
<
pads.length; j
+
+
) {
// Проверяем, находится ли опора на площадке,
if
(pads[j].hitTest(ship._x
+
footPoints[i].x, ship._y
+
footPoints[i].y,
true
)) {
footDown
=
true
;
break
;
}
}
// Если опора не находится на площадке, значит, корабль не совершил посадку,
if
(!footDown) {
landed
=
false
;
break
;
}
}
// Проверяем, не слишком ли быстра движется корабль.
if
(ship.dy
>
3.0
)
landed
=
false
;
if
(landed) {
// Посадка совершена.
gotoAndPlay(_currentFrame
+
1
);
gameLevel
+
+
;
}
}
С другой стороны, необходимо проверять, взорвался луноход или нет. В массиве hitPoints содержится список координат точек вокруг корабля: двух опор, середины каждой стороны, вершины и центра днища. Так как невозможно определить, полностью ли один объект накладывается на другой, вы просто проверяете эти точки. Если какая-то из них оказалась внутри элемента "activeground", тогда корабль разбился. У клипа "Ground – level X" на каждом уровне – имя экземпляра "activeground".
function
checkForCrash() {
// Корабль не совершил посадку. Проверяем, коснулся ли он поверхности Луны,
if
(Handed) {
// Просматриваем все возможные точки касания.
for
(i
=
0
; i
<
hitPoints.length; i
+
+
) {
// Проверяем, не коснулся ли корабль поверхности Луны в этой точке.
if
(activeground.hitTest(ship._x
+
hitPoints[i].x, ship._y
+
hitPoints[i].y,
true
)) {
ship.gotoAndPlay(
"explode"
);
// Уменьшаем количество жизней или завершаем игру.
gotoAndPlay(
"lost ship"
);
break
;
}
}
}
}
Еще одна полезная функция в этом ролике – showFuel. Она берет клип "meter" и присваивает его свойству _xscale величину fuel. Так как сначала значение переменной fuel (запас горючего) равно 100, а затем уменьшается до 0, его легко использовать для свойства _xscale. Если бы диапазон значений fuel был другим, вам бы пришлось сначала преобразовать их так, чтобы они находились в диапазоне от 0 до 100, а лишь затем присваивать их свойству _xscale.
function
showFuel() {
gauge.meter._xscale
=
fuel;
}
Обратите внимание: для того чтобы размеры клипа "meter" уменьшались справа налево, необходимо поместить центр клипа так, чтобы центр прямоугольника располагался справа от него. Если центр клипа окажется слева, то изменение величины _xscale приведет к тому, что объект будет сокращаться к центру, а не справа налево.
К сведению
В этом ролике к каждой кнопке Play прикреплена одна строчка кода. Просмотрите каждый из этих сценариев, чтобы понять, к какому кадру переходит ролик или какая функция вызывается.
Обратите внимание, что во всех трех типах ускорителей использовалась одна и та же анимация – thrust animation. Для левого и правого ускорителей клип поворачивался на 90° или на – 90°. Размер анимации боковых ускорителей был уменьшен, так как предполагается, что они слабее основного ускорителя.
Другие возможности
В этой игре очки не начисляются. Вы же можете добавлять очки за каждую успешную посадку, причем за посадку на труднодоступные посадочные площадки начислять больше обычного. Также можно предоставлять премию за скорость и объем неиспользованного топлива. Добавить уровни к игре очень просто, для этого нужно только нарисовать рельеф. Когда вы исчерпаете все свои идеи, попробуйте изменить код таким образом, чтобы на более высоких уровнях с тем же рельефом корабль имел меньше топлива или была более сильная гравитация.