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



Подстрели лису

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

Рассмотрим еще одну игру из серии "Найди и нажми" - игру-тир. Как и в игре "Найди лису", задача пользователя - щелкнуть по объектам на экране. На игру "Поймай лису" она похожа тем, что объекты появляются на экране в произвольных местах и через произвольный интервал времени.
Но в отличие от предыдущих игр, объекты будут двигаться, лиса будет не просто появляться из отверстия, а бегать, поворачиваться или выглядывать из-за дерева. Игрок должен обладать хорошей реакцией, чтобы попасть по лисе до того, как она снова исчезнет.
На рис. 8.7 показана сцена, очень напоминающая сцену игры "Найди лису". Однако теперь лиса не будет ждать, пока игрок обнаружит ее. Рисунок демонстрирует кадр анимации, в которой лиса быстро перебегает из одной части экрана в другую.

Рисунок 8.7 В игре "Подстрели лису" лиса перемешается по игровому полю

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

За основу данной игры взята игра "Поймай лису". Лисы постоянно бегают из одной части игрового поля в другую. Мы будем использовать три анимационных последовательности: лиса перебегает с места на место, раскачивается под деревом и выглядывает из-за дерева. Каждая анимация используется два или три раза, различные их комбинации составляют семь возможных анимаций, воспроизводящихся во время игры.
С интервалом в две секунды и менее запускается одна из анимационных последовательностей, и игрок получает возможность щелкнуть по лисе. Анимация должна продолжиться, показав перед этим, попал ли игрок в цель.
Игра должна отслеживать количество сделанных выстрелов и количество попаданий, а также задавать ограничение на число произведенных выстрелов. Курсор следует сделать не в виде стрелки, а в виде прицела ружья.

Подход

Поскольку рассматриваемая игра была создана на основе игры "Поймай лису", основная часть кода должна быть вам знакома. Тем не менее, в него были внесены некоторые изменения и дополнения.
Первые изменения касаются способа организации клипов, которые должны содержать анимацию движения и одновременно показывать, произошло ли попадание в лису. Для этого необходимо использовать клип внутри клипа. Вложенный клип имеет два состояния: "поражен" и "не поражен". Во внешнем клипе описывается движение лисы.
В игре отслеживается и обшее количество выстрелов, и количество попаданий. Оба числа отображаются на экране. После того как пользователь израсходует все выстрелы, игра завершается.
Еще одно новшество данной игры - использование необычного курсора. Стандартный курсор мыши спрятан, вместо него виден клип, перемещающийся по рабочему полю за курсором (см. нижнюю часть рис. 8.7).

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

Наиболее сложным является создание клипов. Чтобы лучше понять, о чем пойдет речь в этом разделе, внимательно изучите ролик Shootafox.fla.
В библиотеке вы увидите три клипа: Peeking Fox (Выглядывающая лиса), Running fox (Бегущая лиса) и Swinging fox (Раскачивающаяся лиса). Каждый из этих клипов состоит из одного кадра или короткой анимации лисы, за которой следует короткая анимация, изображающая удивленную лису, обведенную желтым контуром. Первая часть соответствует, движению живой лисы, вторая часть обозначает, что пользователь зверька. Вторая часть начинается с кадра, имеющего метку "hit". Ролик также включает семь клипов с именами "fox()" - "fox6". Эти клипы содержат внутри себя один из вышеописанных клипов, однако теперь, анимация изображает, как лиса движется по игровому полю или выглядывает из-за дерева. Клипы, расположенные внутри каждого из клипов с именами "fox0" - "fox6", содержат метку "fox", благодаря чему код может обращаться к ним. Для того чтобы показать, что лиса поражена, копия клипа "fox", находящегося внутри клипов "fox0" - "fox6", переходит к кадру "hit".
Большое значение имеет распределение слоев. Ролик состоит из 15 слоев, представляющих собой либо элементы обстановки (в данном случае лес), либо самих лис. Это позволяет прятать лис за одними предметами и показывать перед другими. Отдельные слои зарезервированы для клипов "actions" и "cursor".
В качестве курсора используется клип с изображением перекрестия. За кадром 1, в котором находится простое перекрестие, следует небольшая анимация вспышки, запускаемая во время выстрела игрока. Затем клип возвращается к кадру 1, который содержит команду stop ().
Как и остальные ролики, рассматриваемые в данной главе, этот ролик включает начальное окно игры, саму игру и окно завершения игры.

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

Как и в предыдущих примерах, основной код назначен клипу "actions". Первая часть кода - функция onClipEvent (load). Клип устанавливает счета на 0 и инициализирует переменную shotsLeft, которой присваивается значение 50. Это позволяет игроку сделать 50 выстрелов и убить как можно больше лис. Переменная shotsLeft используется для отображения счета на экране, а переменная showshotsLeft, связанная с текстовой областью, отображает, сколько выстрелов осталось у игрока.
При помощи функции Mouse.hide () в блоке onClipEvent (load) скрывается курсор мыши.

onClipEvent (load) {
// Задаем время между появлениями лис.
timeBetweenFoxes = 2000;
// Вычисляем, когда должна появиться следующая лиса.
nextFox = getTimer()+timeBetweenFoxes;
// Инициализируем переменную, содержащую количество
// попаданий и число выстрелов.
score = 0;
shotsLeft = 50;
_root.showScore = "Score:"+score;
_root.showShotsLeft = "Shots Left:"+shotsLeft;
// Прячем курсор.
Mouse.hide();
}

Использование объекта Mouse позволяет контролировать видимость курсора, расположенного над рабочим полем ролика. При помощи команды Mouse.hide() вы можете скрыть курсор, при помощи команды Mouse. show () - вновь вывести его на экран. Так как курсор скрыт, его необходимо заменить чем-нибудь, чтобы игрок видел, по какому месту экрана он щелкает. В данном случае клип "cursor" ставится в соответствие положению курсора мыши. В остальном функция onClipEvent (enterFrame) повторяет аналогичную функцию игры "Поймай лису".

onClipEvent (enterFrame) {
// Передвигаем курсор.
_root["cursor"]._x = _root._xmouse;
_root["cursor"]._y = _root._ymouse;
// Проверяем, не пора ли показывать следующую лису
if (getTimer()>=nextFox) {
// Сокращаем время до следующего появления лисы.
timeBetweenFoxes -= 5;
// Проверяем, не завершена ли игра
if (shotsLeft < 1) {
_root.gotoAndPlay("End");
// Если нет, показываем новую лису.
} else {
// Задаем появление новой лисы,
while (true) {
fox = int(Math.Random()*7);

if (_root["fox"+fox]._currentFrame == 1) { break;
}
}
// Начинаем анимацию лисы.
_root["fox"+fox].gotoAndPlay(2);
// Вычисляем момент появления следующей лисы.
nextFox = getTimer()+timeBetweenFoxes;
}
}
}

Функцию onClipEvent (mouseDown) из игры "Поймай лису" необходимо изменить, учесть условия игры "Подстрели лису". Прежде всего, в качестве активной точки курсора будут использоваться координаты клипа "cursor", а не реальные координаты курсора мыши, которые с обновлением кадра могут немного измениться. Затем в функции проверяется. попал ли пользователь по какому-нибудь из семи клипов. Если один из клипов поражен, в клипе "fox" внутри пораженного клипа осуществляется переход к кадру "hit" - пользователь видит, что попал в лису. Значение переменной score увеличивается в случае поражения лисы, значение переменной shotsLeft уменьшается в любом случае.
Игра заканчивается, когда с помощью функции onClipEvent (enterFrame) перед созданием новой лисы обнаруживается, что у игрока не осталось выстрелов. Ролик завершается не сразу после последнего выстрела, а через одну - две секунды.

onClipEvent (mouseDown) {
// Показываем анимацию выстрела.
_root["cursor"].gotoAndPlay("blast");
// Определяем координаты курсора.
x = _root._root["cursor"]._x;
y = _root._root["cursor"]._y;
// Проверяем, в какую лису попал пользователь,
for (i=0; i<7; i++) {
// Проверяем на попадание только "высунувшихся" лис.
if (_root["fox"+i]["fox"]._currentFrame <= 1) {
// Проверяем, попал ли пользователь
//в какую-либо из лис.
if (_root["fox"+i].hitTest(x, y, false)) {
// Показываем, что попал.
_root["fox"+i].fox.gotoAndPlay("hit");
// Увеличиваем счет.
score++;
}
}
}
// Уменьшаем число оставшихся выстрелов.
shotsLeft--;
// Обновляем счет, отображаемый на экране.
_root.showScore = "Score:"+score;
_root.showShotsLeft = "Shots Left:"+shotsLeft;
}

Данный код также задает переход клипа, содержащего курсор, к кадру "blast", анимация вспышки продолжается в течение нескольких кадров, затем ролик возвращается к кадру 1. Даже если игрок не попал в лису, он видит, что выстрел был сделан.
Следующая функция, onClipEvent(unload), запускается перед исчезновением клипа с рабочего поля. Это происходит при завершении игры. В данном случае функция необходима, чтобы сделать курсор видимым.

onClipEvent (unload) {
// Отображаем обычный курсор.
Mouse.show();
}

К сведению

После создания кода необходимо присвоить копиям клипа имена с "fox0" по "fox6", соответствующие их именам в библиотеке. В нашем примере центр всех клипов с изображениями лис совпадает с центром рабочего поля. Это было сделано следующим образом: анимация была добавлена в главную временную шкалу, выделена, скопирована при помощи команды Edit -> Copy Frames (Редактировать ->Копировать кадры) и вставлена в пустой клип.

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

В игру легко внести различные изменения. Заданное количество выстрелов можно заменить таймером. Игра может состоять из уровней: игрок будет переходить на другой уровень, поразив определенное количество лис.
Имейте в виду, что игра дает возможность набирать более 50 очков. Каким образом? В ходе игры лисы начинают появляться друг за другом все быстрее и быстрее. Через некоторое время на экране одновременно будут появляться несколько лис. Когда пути двух лис пересекаются, вы можете убить их одним выстрелом, однако это требует сноровки. Если хотите, отмените данное свойство.
В игре могут использоваться некоторые звуковые эффекты и фоновые звуки. Игра будет более интересной, если добавить отвлекающую внимание анимацию, например пролетающую птицу или ветер, раскачивающий ветви.

Назад Начало Вперед



Книжный магазин