Создание Flash-игр

         

Охота на лис

Исходный файл: Huntafox.fla

Одна из самых устойчиво популярных долгие годы игр - "Охота на оленей". В этой игре вы часами сидите, наблюдая пейзаж, пока не покажется олень, которого можно будет застрелить. Несмотря на то, что продано миллионы копий этой игры, она достаточно простая. Во Flash можно легко сделать что-нибудь в этом роде.

Задача проекта

Задача состоит в том, чтобы сделать игру - стрелялку, позволяющую пользователю передвигаться влево и вправо по пространству, большему, чем способно вместить в себя рабочее поле экрана. Мишени возникают в случайное время и в случайных местах, вне зависимости от того, куда сейчас смотрит игрок. Перемещение должно создавать игроку иллюзию пространства, так чтобы близкие объекты двигались быстрее далеких.

Подход

Все, что вы должны сделать по сравнению с предыдущей игрой, - это позволить пользователю перемешаться по большому фоновому изображению из стороны в сторону. Но это не так-то просто. Одни элементы фона ближе к играющему, чем другие. Чтобы у игрока действительно создалось ощущение движения охотника, близкие объекты должны двигаться быстрее дальних.
Чтобы этого добиться, мы разбиваем элементы фона на четыре группы: близко - деревья, подальше - кусты, еще дальше - холмы, затем - небо и земля. Небо и земля остаются неподвижными. А деревья, кусты и холмы движутся в зависимости от того, насколько далеко они от игрока.
Лисы прячутся за деревьями и в кустах. Это значит, что они должны двигаться вместе с этими элементами. Посмотрите на исходный файл Huntafox.fla на сайте, чтобы понять, как это выглядит. Если вы двигаете курсор вправо по рабочему полю, панорама смешается вправо. Видите, как деревья движутся быстрее кустов, а кусты быстрее холмов? Заметьте также, что деревья иногда затеняют кусты. Хорошему игроку нужно совсем немного подвигать панораму, чтобы убить максимально возможное количество лис. На рис. 8.8 показан случай, когда лиса выглядывает за-за дерева.

Рисунок 8.8. Лиса выглядывает из-за дерева





Подготовка ролика

Структура ролика такая же, как и в предыдущем примере. Четыре слоя "Фон", "Кусты", "Холмы" и "Деревья" - шириной примерно в 1200 пикселов центрованы на рабочем поле шириной в 550 пикселов. Слои Кусты" "Холмы" и "Деревья" Содержат по одному клипу в каждом - они называются "bushes", "hills" и "trees" и включают в себя все элементы соответствующего слоя.
Слоев с лисами два. Один слой содержит лис, прячущихся за кустами, а другой - прячущихся за деревьями. Клипы с лисами за деревьями носят имена от "foxO" до "fox6", а клипы с лисами за кустами - от "fox7" до "fox9".
Клипы с лисами такие же, как в игре "Подстрели лису", только лиса остается видимой гораздо дольше. Чтобы лисы могли прятаться за узкими деревьями, в каждом клипе я использовал слои-маски, позволяющие скрыть те части лисы, которые не должны быть видны.
Изображения лис внутри каждого клипа с лисой такие же, как в игре "Подстрели лису". Однако последний кадр анимации попадания отправляет родительский клип назад к его первому кадру. Это означает что, когда вы попадаете в лису, она исчезает сразу же, как заканчивается анимация попадания.

Создание кода

Хотя и клипы и слои отличаются от тех, что использованы в игре "Подстрели лису", основной сценарий этой игры применим и в нашем случае. Это сценарий, назначенный клипу "actions". Необходимо внести только два изменения, и я не буду приводить здесь весь код. Первое изменение состоит в том, что теперь можно выбирать из 10, а не из 7 лисиц, поэтому число внутри функции Math.random должно быть 10.
Второе изменение обращает внимание на положение курсора, так что сцена перемешалась, если пользователь двигает курсор вправо или влево. В этом случае вызывается функция moveScene на корневом уровне. Она принимает значения -1 или 1 в зависимости от направления движения.

// Перемещаем панораму,
if (_root._xmouse < 50) {
_root.moveScene(1);
} else if (_root._xmouse > 500) {
_root.moveScene(-1);
}

Клип "moveScene" находится на главной временной шкале. Этот сценарий начинается с определения нескольких переменных. panAmount отслеживает расстояние, на которое пользователь сдвинулся вправо или влево. Например, если пользователь двигается влево, тогда графика движется вправо и panAmount принимает значение 1. Если он продолжает двигаться в этом направлении, panAmount увеличивается до 2, -, и т.д. Если пользователь движется в противоположном направлении, panAmount принимает значения -1, -2 и так далее.
Поскольку мы не можем нарисовать бесконечно широкую сцену, нам приходится задавать границы панорамирования. Две переменные содержат максимально разрешенное передвижение влево и вправо. Я определил эти границы путем проб и ошибок. Начал я с 50 и увидел, что игрок может доходить до конца деревьев. Тогда я начал пробовать меньшие числа, пока игрок не перестал вылезать за границы сцены.

panLimitLeft = -30;
panLimitRight = 30;
panAmount = 0 ;

Чтобы перемешаться по сцене, сначала проверяется, не превышает ли следующее значение panAmount допустимые границы. Функция работает только в том случае, если следующее значение находится в пределах допустимого.
Потом три клипа - "trees", "bushes" и "hills" - перемещаются в нужном направлении. Деревья перемещаются с коэффициентом (фактически скоростью) 10, кусты - с коэффициентом 5 и холмы - 4. Я подобрал эти значения путем проб и ошибок. По-моему, они создают достаточное ощущение глубины.
Первые 7 лисиц, которые находятся прямо за деревьями, движутся с ними вместе с коэффициентом движения 10. Остальные три лисы перемещаются с коэффициентом 5, поскольку сидят за кустами.

function moveScene(d) {
// Проверяем, не выходит ли значение панорамирования за
// разрешенные границы.
if ((panAmount+d > panLimitLeft) and (panAmount+d < panLimitRight)) {
// Увеличиваем значения.
panAmount += d;
// Передвигаем слои с разными скоростями,
trees._x += d*10;
bushes._x += d*5 hills._x += d*4;
/7 Передвигаем клипы "foxes 0-6".
for{i = 0;i<7;i + + ) {
_root["fox"+i]._x += d*10;
// Передвигаем клипы "foxes 7-9"
for(i=7;i<10;i++) {
_root [ "fox"+i] ._x += d*5;
}
}
}

Я уже упоминал, что в конце клипа "peeking fox" появляется новый сценарий. Клип "peeking fox" содержится внутри всех трех клипов с лисами. Это статичное изображение лисы. Также он содержит короткую анимацию попадания, которую показывает при щелчке пользователя по лисе. В конце этой анимации я возвращаю клип "peeking fox" в начальную позицию, а также отправляю родительский клип к первому кадру. Это означает, что вместо того чтобы проигрывать анимационную последовательность "покажи - подожди - спрячь", лиса сразу оказывается видимой.

gotoAndStop(1);
_parent.gotoAndStop(1);

К сведению

Все стандартные части предыдущих игр присутствуют и здесь. Есть окно начала игры с кнопкой в нем. Есть два текстовых поля: очки и оставшиеся выстрелы. Курсор невидим и заменен клипом с изображением р ла. Во всех этих случаях используется код как в игре "Подстрели лису*

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

Чтобы улучшить игру, я увеличил промежутки времени между появлениями лисы. Сейчас они составляют 2 секунды, а должны быть больше двух минут, чтобы игра стала напоминать "Охоту на оленей". Вы можете даже сделать промежутки случайными, чтобы было еще интереснее.
Вместо того чтобы переключать внимание охотника справа налево, вы можете двигаться по кругу. В некотором отношении это может быть проще. Вам не надо беспокоиться о слоях перспективы, как в этой игре. Вместо этого фон может быть одной неподвижной картинкой. Однако, вы также должны найти способ соединять друг с другом левую и правую половины круговой панорамы. Самый простой способ сделать это - заставить правую сторону повторить полную картину вида рабочего поля слева. Тогда, даже если игрок пытается продвинуться дальше вправо, вы просто повторяете весь путь налево. Потребуется немало терпения и труда, чтобы все получилось гладко, но достичь этого возможно.


Содержание раздела