Чтение онлайн

на главную

Жанры

Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript

Розенцвейг Гэри

Шрифт:

Объекты-астероиды расположены в клипе "rock", который состоит из трех частей. Первая часть – статический кадр с изображением астероида, когда он приближается к кораблю. Вторая часть состоит из нескольких кадров анимации: взрыв астероида при попадении в него пули. Эта последовательность помечена как "explode red". И последняя часть – последовательность "explode blue". Просмотрите исходный ролик на Web-сайте, чтобы понять, как был создан этот клип (рис. 16.2).

Рисунок 16.2. Взрыв астероида (клип

«rock»)

В ролике находится также клип «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, то игра заканчивается.

Поделиться:
Популярные книги

Имя нам Легион. Том 3

Дорничев Дмитрий
3. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 3

Метатель. Книга 2

Тарасов Ник
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 2

Безумный Макс. Ротмистр Империи

Ланцов Михаил Алексеевич
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Безумный Макс. Ротмистр Империи

Болотник

Панченко Андрей Алексеевич
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Болотник

Темный Лекарь 6

Токсик Саша
6. Темный Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 6

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2

Целитель

Первухин Андрей Евгеньевич
1. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Целитель

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

Зауряд-врач

Дроздов Анатолий Федорович
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Зауряд-врач

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Фараон

Распопов Дмитрий Викторович
1. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Фараон

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2