Шрифт:
function moveBunny {
// Проверяем, пришло ли время для следующего шага кролика.
if (getTimer > bunny.nextmove) {
// Определенное время кролик двигаться не может.
bunny.nextmove = getTimer + 60 – gameLevel*10;
// Перемещаем кролика, bunny.
bunny._x += bunny.move.x*5;
bunny._y += bunny.move.y*5;
// Выясняем, дошел ли кролик до положения цели.
if (bunny._x == bunny.dest.x and bunny._y ==bunny.dest.y) {
// Создаем массив с координатами
// возможных положений кролика.
possibilities = new Array;
for (i=0; i<berries.length; i++) {
// Определяем расстояние между
// текущим положением кролика и ягодой.
xdiff = Math.abs(berries[i]._x – bunny._x);
ydiff = Math.abs(berries[i]._y – bunny._y);
// Если эта ягода находится рядом…
if ((xdiff == 25 and ydiff == 0) or (xdiff == 0
and ydiff == 25) {
//…тогда ее положение может
// быть положением цели кролика.
possibilities.push(berries[i]);
}
}
// Среди возможных положений цели выбираем произвольное.
do {
r = int(Math.random*possibilities.length);
// Указываем новое положение цели
// и направление движения.
bunny.dest.x = possibilities[r]._x;
bunny.dest.y = possibilities[r]._y;
bunny.move.x = (possibilities[r]._x – bunny._x)/25;
bunny.move.y = (possibilities[r]._y – bunny._y)/25;
// Принимаем выбранные положения, если кролик
// не возвращается назад или если этот
// путь – единственно возможный.
} while ((bunny.dest.x = lastx and bunny.dest.y == lasty) and (possibilities.length > 1));
// Запоминаем координаты предыдущего положения.
lastx = bunny._x;
lasty = bunny._y;
}
}
// Проверяем, находится ли кролик поблизости с лисой.
if (Math.abs(bunny._x – fox._x) <= 10 and Math.abs(bunny._y –
fox._y) <= 10 {
if (lives < 1) {
gotoAndStop("game over");
} else {
lives–;
gotoAndStop("lost life");
}
}
}
К сведению
Не забудьте, что нужно присвоить имена связи клипам лисы, кролика и ягоды. Для каждого кадра, в том числе и в небольших клипах, вам понадобится функция stop.
Другие возможности
Есть множество способов усовершенствовать эту игру. У вас может быть несколько кроликов, специальные ягоды, которые на короткое время будут позволять лисе гоняться за кроликом. Через определенные промежутки времени из центральной области будет выходить новый кролик, а в коридорах лабиринта будут появляться бонусные очки.
Возможно, вам в голову придут и другие идеи, например сделать так, чтобы кролик был более сообразительным: гонялся за лисой соперничал с лисой и поедал ягоды. Можно начислять дополнительные очки в конце каждого уровня в зависимости от того, насколько быстро он был пройден.Луноход
Исходныйт файл: Moonlander.fla
Вот еше одна классическая игра. Игра "Луноход" была, возможно, второй из когда-то созданных компьютерных игр. Ее первая версия предназначалась для универсальной ЭВМ и была полностью основана на тексте. Каждую секунду компьютер в виде текста выдавал, где в данный момент находится луноход и какова его скорость. По мере снижения лунохода игрок мог вносить коррективы.
С тех пор игра воссоздавалась в различных графических форматах, большинство из которых, как и здесь, использовали вид сбоку (рис. 16.6).
Рисунок 16.6 . Луноход снижается, пытаясь приземлиться на одну из приспособленных для этого площадок
Задача проекта
Цель – создать стандартную игру, в которой корабль должен удачно совершить посадку. Он начинает свое движение вверху экрана, игрок управляет сильным вертикальным ускорителем, расположенным под кораблем, а также более слабыми ускорителями – по бокам корабля.
С течением времени корабль снижается под воздействием гравитации. Игрок не может постоянно пользоваться ускорителями, так как у корабля ограниченный запас горючего.
Задача игрока состоит в том, чтобы корабль в полной сохранности совершил посадку на одну из отведенных для этого площадок. Если он сядет не на площадку или как-то иначе коснется поверхности луны, то произойдет взрыв.
В этой игре несколько уровней. В ролике, который приводится в качестве примера, их три, и в каждом отображается различный рельеф.
Подготовка ролика
Сначала рассмотрим клип «ship». На рис. 16.7 показан полноэкранный вид окна программы Flash в момент, когда выбран клип корабля. В этом клипе несколько кадров с метками: «normal», «up», «left», «right» и «explode».
Рисунок 16.7. Клип «ship» включает следующие кадры: «normal», «up», «left», «right» и «explode»
В первом кадре представлен корабль без включенных ускорителей. Во втором кадре включен главный ускоритель, который поднимает корабль вверх. В третьем и четвертом кадрах отображены боковые ускорители. На рис. 16.7 показан кадр «left». Обратите внимание, что слово «left» означает, что корабль будет двигаться влево, а пламя ускорителя находится справа.
Кадр "explode" представляет собой начало небольшой анимации, в которой луноход взрывается. Эта анимация используется в том случае, когда игрок посадил корабль не на площадку.
В дополнение к клипу "background", который совсем не используется в коде, три других клипа представляют собой рельеф поверхности для трех уровней игры. Эти клипы называются "Ground – level 1", "Ground – level 2" и "Ground – level 3".
Клип "pad" – всего лишь желтый прямоугольник, который показывает, что непосредственно под луноходом находится посадочная площадка.
Основная временная шкала этого ролика действительно сложная. Информация о кадрах и их содержимом приведена в табл. 16.1.
Таблица 16.1. Кадры основной временной шкалыУ вас также будет два простых клипа: «fuel gauge» и «fuel meter». Первый представляет собой пустой прямоугольник, а второй – сплошной. Клип «meter» помещается внутри клипа «gauge». Далее в коде вы укажете, чтобы при сжигании горючего размеры клипа «meter» уменьшались, то есть он будет занимать меньше места в прямоугольнике «gauge».
Создание кода
В трех кадрах «level1», «level2» и «level3» у вас будут клипы «actions», которые вызывают необходимые для игры функции. В начале уровня вызывается только одна функция, а в течение игры постоянно – другая.onClipEvent(load) {
_root.startLevel;
}
onClipEvent(enterFrame) {
_root.moveShip;
}Обе эти функции расположены в основной временной шкале первого кадра. Сценарий ролика начинается с функции startGame, которая вызывается, когда в первом кадре игрок щелкает по кнопке Play. Она устанавливает значение переменной gameLevel, отображаемое в текстовом поле в верхнем правом углу экрана. Затем с помощью функции startLevel начинается первый уровень.
function startGame {
gameLevel = 1;
startLevel;
}Функция startLevel выполняет множество задач. Сначала она переводит ролик к кадру в соответствии со значением переменной gameLevel, затем помещает корабль вверху экрана. Скорость корабля, которая определяется величинами dx и dy, обнуляется. Для увеличения скорости корабля и для того, чтобы он начал двигаться вниз, используется переменная gravity.
В массивах hitPoints и footPoints содержатся координаты некоторых точек относительно центра корабля. Для определения, коснулся ли корабль поверхности луны, используются элементы массива hitPoints. А оба элемента массива footPoints нужны, чтобы определить, находятся ли обе опоры лунохода на посадочной площадке.
В массиве pads хранятся имена трех клипов посадочных площадок. На одном уровне имеется всего лишь две посадочные площадки, но язык ActionScript этого не учитывает.function startLevel {
gotoAndStop("level"+gameLevel);
// Размещаем клип корабля.
ship._x = 275;
ship._x = 25;
// Корабль не движется.
ship.dx = 0;
ship.dy = 0;
// Инициализируем гравитацию.
gravity = .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]);
}
}