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

на главную - закладки

Жанры

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

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

Шрифт:

function determineBounds(pos) {

// Определяем границы перемещения.

var bounds = {left:1000,right:1000,top:1000,bottom:pos.y};

// Цикл по всем объектам.

for(var i=0;i<objects.length;i++) {

// Рассматриваем только блоки.

if (objects[i].type == "box") {

var dx = objects[i].x – pos.x;

var dy = objects[i].y – pos.y;

// Если блок в той же вертикальной позиции.

if ((dy >= 0) and (dy <= 50)) {

// Определяем, является ли ближайшим левый блок.

if ((dx+50 <= 0) and (Math.abs(dx+50) < bounds.left)) {

bounds.left = Math.abs(dx+50);

// Определяем, является ли ближайшим правый блок.

} else if ((dx >= 0) and (dx < bounds.right)) {

bounds.right = dx-50;

}

}

// Блок в той же горизонтальной позиции.

if ((dx >= -50) and (dx <= 50)) {

//

Определяем, является ли ближайшим нижний блок.

if ((dy+50 <= 0) and (Math.abs(dy+50) <=

bounds.bottom)) {

bounds.bottom = Math.abs(dy+50);

// Определяем, является ли ближайшим верхний блок.

} else if ((dy-50 >= 0) and (dy-50 < bounds.top)) {

bounds.top = dy-50;

}

}

}

}

return(bounds);

}

Если лиса находится в воздухе, то независимо от того, прыгает ли она вверх или падает вниз, это состояние рассматривается как падение. Функция CheckFall следит за вертикальным перемещением лисы. Когда игрок прыгает, переменная fallSpeed принимает значение jumpPower, которое равно 60. Таким образом, лиса пытается переместиться на 60 пикселов по вертикали. В каждом кадре, в котором происходит процесс «прыжок/падение», переменная fallSpeed уменьшается на 10, что создает эффект силы тяжести. В конечном счете значение fallSpeed обнулится в верхней точке прыжка и начнет уменьшаться, а лиса устремится вниз.

Если значения скорости падения еще недостаточно, чтобы лиса достигла земли, то падение продолжается. Но как только уровень земли достигнут или пройден, падение прекращается, и вертикальная позиция лисы устанавливается равной положению земли.

Функция checkFall также обращается к свойству foxBound.top, чтобы проверить, нет ли блока над лисой. Если лиса упирается в верхнюю границу возможного движения, то импульс, направленный вверх, пропадает, переменная fallSpeed обнуляется. Процесс «прыжок/падение» продолжается, но является теперь только падением.

function checkFall {

// Учитываем силу тяжести.

fallSpeed -= 10;

// Проверяем, есть ли место для падения.

if (fallSpeed > -foxBounds.bottom) {

foxPos.y += fallSpeed;

// Прекращаем падение и устанавливаем лису на уровень земли.

} else {

foxPos.y -= foxBounds.bottom;

fallSpeed = 0;

falling = false;

fox.gotoAndStop(1); // stand

}

// Смотрим, не упирается ли лиса в верхний блок.

if (foxPos.y > foxBounds.top) {

foxPos.y = foxBounds.top;

fallSpeed = 0;

}

}

Функция drawObjects создает эффект движения лисы. Она перерисовывает все объекты в соответствии с положением лисы.

function drawObjects {

// Цикл по всем объектам.

for(var i=0;i<objects.length;i++) {

// Устанавливаем горизонтальную позицию в соответствие с положением лисы.

_root["object "+i]._x = x = 275 + objects[i].x – foxPos.x;

// Устанавливаем горизонтальную позицию в соответствие со значением floor.

_root["object "+i]._y = floor – objects[i].y;

}

}

Функция getAcorns просматривает объекты в поисках орехов. Каждый орех проверяется, достаточно ли близко он находится к лисе, чтобы она могла его взять. Если орех съеден, его свойство type устанавливается в значении used. Этот орех теперь игнорируется всеми функциями, так как они не проверяют объекты типа used.

function getAcorns {

// Просматриваем все объекты.

for(var i=objects.length-1;i>=0;i—) {

if (objects[i].type == "acorn") {

// Если ближе 30 пикселов – хватаем орех.

if (distance(_root["object "+i],fox) < 30) {

_root["object "+i].play;

objects[i].type = "used";

score += 100;

}

}

}

}

Функция getAcorns вызывает функцию distanse для определения расстояния между лисой и орехом. Эта же функция будет в дальнейшем использоваться функцией moveBunnies.

// Функция для определения расстояния между клипами.

function distance(mc1,mc2) {

d = Math.sqrt(Math.pow(mc1._x-mc2._x,2)+Math.pow(mc1._y-mc2._y,2));

return d;

}

Все

кролики контролируются функцией moveBunnies. Нет смысла следить за кроликами вне экрана, поэтому перемещаются только кролики, находящиеся не далее чем 275 пикселов от лисы. Перед перемещением кролика вызывается функция determineBounds для определения границ его возможного перемещения. Если границы позволяют, кролик начинает передвигаться в сторону позиции игрока. Если лиса оказывается достаточно бестолковой, чтобы подобраться близко к кролику, игра заканчивается.

function moveBunnies {

// Просматриваем все объекты в поисках кроликов.

for(var i=objects.length-1;i>=0;i—) {

if (objects[i].type == "bunny") {

// Перемещаем только видимых кроликов.

if (Math.abs(objects[i].x-foxPos.x) < 275) {

// Движемся в сторону лисы.

if (foxPos.x < objects[i].x) {

var dx = -bunnySpeed;

} else if (foxPos.x > objects[i].x) {

var dx = bunnySpeed;

}

// Определяем границы.

bunnyBounds = determineBounds(objects[i]);

// Движемся только в пределах этих границ.

if ((dx < 0) and (bunnyBounds.left > Math.abs(dx))) {

objects[i].x += dx;

} else if ((dx > 0) and (bunnyBounds.right > Math.abs(dx))) {

objects[i].x += dx;

}

// Не подобрался ли кролик достаточно близко к лисе.

if (distance(_root["object "+i],fox) < 30) {

_root.onEnterFrame = undefined;

trace("got ya");

}

}

}

}

}

К сведению

Клип с лисой содержит три части: «stand», «run» и «jump». В первом кадре содержится команда stop. В последнем кадре анимации «run» содержится команда gotoAndPlay(«run»). Благодаря этому движение зацикливается.

Клип "acorn" также содержит команду stop в первом кадре.

Еще один важный момент – это установка центра координат клипов. Он расположен внизу и отцентрован по горизонтали. На рис 16.9 изображен клип "box" и его центр.

Рисунок 16.9. Во всех клипах центр находится внизу точно посередине

Другие возможности

Эта игра демонстрирует лишь простейшие возможности платформенного скроллера. Она настолько проста, что даже не имеет завершения. Существует несколько возможностей оформить конец игры.

Во первых, вы можете достигать крайней правой точки для окончания игры или уровня. Пространство этой игры относительно невелико, но если сделать его в несколько раз больше, то прохождение до границы уже будет некоторым достижением.

В другом варианте игра оканчивается, когда игрок собрал все орехи. Опять же вы можете сделать пространство игры больше.

Большинство платформенных скроллеров предлагают также избавляться от разных отрицательных героев. Обычно для этого достаточно прыгнуть сверху на такого плохого парня. В существующем варианте игры, если вы запрыгнете на кролика, игра окончится точно так же, как если бы вы пересеклись с ним по горизонтали. Но если вы сможете определить, что лиса падает сверху в момент столкновения с кроликом, то получите сражающуюся лису, которая будет получать дополнительные очки за побежденных кроликов.

Платформенные скроллеры могут быть очень сложными. Они запросто могут включать сотни страниц кода, добавляющих все больше и больше характеристик в игру. У вас же сейчас реализованы лишь самые основные моменты. Используя навыки предыдущих глав, вы вполне можете сколько угодно надстраивать эту игру.

Глава 17 Сложные приемы

• Выполнение и оптимизация

• Экран загрузки

• Защита от копирования

• Список лучших игроков

• Определение версии Flash-плагина

Хотя в предыдущих главах речь шла о сотнях алгоритмов ActionScript, многое осталось «за кадром». Мы не стали для иллюстрации этих концепций описывать использующие их игры, решили, что оптимальнее рассмотреть дополнительные возможности сами по себе. В этой главе затрагиваютсяе такие темы, как оптимизация, загрузка ролика, списки лучших игроков и защита от копирования, а также описывается множество полезных технических приемов.

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

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Безымянный раб [Другая редакция]

Зыков Виталий Валерьевич
1. Дорога домой
Фантастика:
боевая фантастика
9.41
рейтинг книги
Безымянный раб [Другая редакция]

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Сумеречный Стрелок 2

Карелин Сергей Витальевич
2. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный Стрелок 2

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант

Приручитель женщин-монстров. Том 2

Дорничев Дмитрий
2. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 2

Приручитель женщин-монстров. Том 4

Дорничев Дмитрий
4. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 4

Путь (2 книга - 6 книга)

Игнатов Михаил Павлович
Путь
Фантастика:
фэнтези
6.40
рейтинг книги
Путь (2 книга - 6 книга)

Эксперимент

Юнина Наталья
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Эксперимент

Начальник милиции

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

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

Восход. Солнцев. Книга VII

Скабер Артемий
7. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга VII

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Тринадцатый