Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Шрифт:
Объекты-астероиды расположены в клипе "rock", который состоит из трех частей. Первая часть – статический кадр с изображением астероида, когда он приближается к кораблю. Вторая часть состоит из нескольких кадров анимации: взрыв астероида при попадении в него пули. Эта последовательность помечена как "explode red". И последняя часть – последовательность "explode blue". Просмотрите исходный ролик на Web-сайте, чтобы понять, как был создан этот клип (рис. 16.2).
Рисунок 16.2. Взрыв астероида (клип
В ролике находится также клип «point», в котором генерируются объекты-пули, и клип cursor, заменяющий обычный вид курсора на перекрестие.
В ролике на главной временной шкале расположены три кадра: "start", "play" и "game over". Все действие происходит в кадре "play".
Создание кода
Код инициализируется действием, помешенным в небольшой клип «actions», который расположен за пределами рабочего поля, и кнопкой «button», которая находится точно под клипом. Клип «actions» вызывает одну функцию в начале игры и четыре других при каждом обрашении к кадру.onClipEvent (load) {
// Загружаем игру.
_root.initGame;
}
onClipEvent (enterFrame) {
// Перемещаем перекрестие.
_root.moveCursor;
// Перемещаем все пули.
_root.moveBullets;
// С вероятностью 10 % создаем новый астероид.
if (Math.random < .1) _root.createRock;
// Перемещаем все астероиды.
_root.moveRocks;
}Кнопка «button» реагирует на нажатие клавиши Пробел и вызывает функцию основной временной шкалы.
on (keyPress «<Space>») {
// Нажатие клавиши Пробел означает выстрел.
fire;
}Вы обнаружите все функции в основной временной шкале. Функция initGame создает массивы, в которых будет храниться информация об астероидах и пулях. Она помешает клипы «foreground» и «cursor» поверх остальных, таким образом оказывается, что астероиды и пули располагаются под ними. Будет казаться, что они находятся вне космического корабля.
Восстанавливаются значения переменных damage и hits. Переменная level не имеет отношения к уровню игры, а используется для определения вновь создаваемого клипа. Каждый новый клип – пуля или астероид – помешается на новый уровень.
С помошью команды 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 *= .4;
// Если пуля оказалась слишком далеко от астероида, удаляем ее.
if (bullets[i].dist < .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 = bullets[i].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: .01, clip: "rock"+level});
}Подобно функции moveBullets функция moveRocks использует свойство dist каждого астероида, чтобы передвинуть его. Однако со временем он приближается к экрану и его начальное значение 0,01 в каждом кадре увеличивается на 10 %. Помимо положения астероида его свойства _xscale и _yscale также зависят от dist, это делает возможным увеличивать астероид и создавать иллюзию его приближения к кораблю. Если занчение dist становится больше 1,0 и астероид все еше находится в видимой области экрана, считается, что астероид попал в корабль. Астероид взрывается, и значение переменной damage увеличивается. Если значение переменной damage больше или равно 20, то игра заканчивается.