Вход/Регистрация
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;

}

}

}

  • Читать дальше
  • 1
  • ...
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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