Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript - Гэри Розенцвейг
Шрифт:
Интервал:
Закладка:
onClipEvent(enterFrame) {
// Выясняем, пришло ли время проиграть следующую мелодию.
if (getTimer() > nextTime) {
// Получение сообщения.
note = _root.notes[noteNum];
// Проигрывается анимация пения
// и соответствующий звуковой файл.
_root["bird"+note].gotoAndPlay(2);
_root["note"+note].gotoAndPlay(2);
// Ждем одну секунду, прежде чем проиграть следующую
// мелодию.
nextTime = getTimer() + 1000;
noteNUm++;
// Если больше сообщений нет, продолжаем со следующего
// шага.
if (noteNum > _root.notes.length) {
_root.startRepeat();
}
}
}Каждая кнопка, расположенная на рабочем поле в кадре «repeat», при щелчке по ней должна вызывать функцию clickBird. Каждый из четырех сценариев немного отличается от остальных, так как они должны передать функции различные числа. Вот сценарий для одной из кнопок:
on (press) {
clickBird(1);
}
К сведению
Во всех шести кадрах ролика должна быть команда stop(). В кадрах со второго по шестой это единственная команда.
В кадрах "wait", "correct" и "wrong" находятся кнопки. В кадре "wait" кнопка переводит игру к кадру play, где проигрывается последовательность мелодий. Кнопка кадра "correct" снова переносит игрока к кадру "play". Однако также должна быть вызвана функция addNewNote, чтобы добавить сообщение в последовательность.on (press) {
addNewNote();
gotoAndPlay("play");
}Кнопка в кадре «wrong» переводит ролик к кадру «start», где можно заново начать игру.
Также не забудьте добавить текстовое поле, связанное с переменной scoreDisplay, чтобы игроки знали о результатах своей игры.
Другие возможности
Тема игры может быть любой. Достаточно изменить фон и вид элементов. Количество элементов зависит о того, насколько сложной вы хотите сделать игру.Дедукция
Исходный файл: Deduction.fla
Следующая игра полностью основана на логике. Один из наиболее популярных ее вариантов (для двух игроков) известен под названием "Mastermind" [17] .
Цель игры – угадать произвольную последовательность из пяти цветов. Игрок начинает с предположений. Затем компьютер отвечает, отгадано ли хоть что-то, то есть игрок получает информацию о количестве правильно расположенных цветов и количестве правильных цветов, оказавшихся не на своих местах. На основе этой информации игрок пробует угадать еще раз. Так продолжается определенное число попыток или до тех пор, пока игрок не угадает последовательность.
На рис. 14.3 показан фрагмент этой игры (см. ролик Deduction.fla, размещенный на Web-сайте). Область игры – выпиленное полено, а цвета представлены в виде камешков. Игрок может выбрать любой из пяти цветных камешков, чтобы заполнить пустое пространство, или не выбрать вообще. Компьютер отвечает следующим образом: отображает белый камешек для каждого правильного цвета, и черный камешек для каждого правильного цвета, помещенного не на свое место.
Рисунок 14.3. Игра на дедукцию позволяет построить последовательность из камешков, затем выводит результаты с помощью белых и черных камешков
Задача проекта
Цель ролика – создать простую игру под названием «Дедукция». Игроку предоставляется 10 шансов, чтобы угадать последовательность. После каждого варианта игроку выдается результат угадывания.
Подход
Игра начинается с создания произвольной последовательности из пяти цветов, которая хранится компьютером в тайне до конца игры.
При каждой попытке игроку предоставляется пять новых пустых мест, которые нужно заполнить. В дополнение к ним справа появляется кнопка Done (Готово). На рис. 14.4 показано, что видит игрок в начале игры.
Рисунок 14.4. Игра начинается с того, что отображаются пять свободных пустых мест и кнопка Done
Игрок может щелкнуть по любому пустому месту, чтобы изменить его цвет. Цвет изменяется в соответствии с шестью вариантами: пятью различными цветами и пустым местом.
После того как игрок указал цвета для пяти мест, он может щелкнуть по кнопке Done, чтобы получить результат. Появление белого камешка свидетельствует о правильно расположенном цвете, черного – о правильном цвете, помещенном не на свое место.
Затем под имеющимся рядом отображаются следующие пять свободных мест вместе с кнопкой Done. На рис. 14.5 показано, как выглядит игра после нескольких шагов.
Рисунок 14.5. Так выглядит игровое поле после нескольких попыток пользователя
Подготовка ролика
В клипе «rock» содержится восемь кадров, первый из которых показывает пустое место. Кадры со второго по шестой отображают пять цветов, из которых должен выбрать пользователь. Седьмой и восьмой кадры отображают белые и черные камешки, имеющие метки «white» и «black» соответственно, чтобы код мог обращаться к ним.
Теперь осталось поместить на рабочее поле фон и указания. Камешки и кнопка Done создаются кодом. Для клипа "rock" установите имя ("rock") в панели Linkage Properties. Я также создал небольшую кнопку, чтобы можно было перейти внутрь клипа камешка. Кнопку "Done" создать очень просто, но так как нам нужно управлять ее положением, мы должны поместить ее внутри клипа и указать для него свойство "linkage".
Создание кода
Код игры целиком расположен в первом кадре основной временной шкалы, начинается он с установки целого набора переменных. Эти числа определяют положение различных элементов на рабочем поле при их создании. Вместо того чтобы распределять эти переменные по всему коду, я собрал их в начале программы – так их будет проще найти и изменить.
Последовательность решения задается с помощью пяти случайных чисел и хранится в массиве solution. В переменной row хранится номер попытки. Для начала игры вызывается функция createRow.initGame();
stop();
function initGame() {
// Определяется расположение и расстояние между элементами.
topRowLoc = 60;
leftColLoc = 280;
roghtColLoc = 390;
horizSpace = 21;
vertSpace = 23;
solutionx = 336;
solutiony = 320;
// Создается произвольная последовательность решения.
solution = new Array();
for(i=0;i<5;i++) {
solution.push(int(Math.Random()*5));
}
// Инициализируются переменные.
rows = new Array();
row = 0;
// Устанавливается первый ряд.
createRow();
}В начале каждой попытки функция createRow создает пять пустых мест и определяет их положение. Вдобавок устанавливается новый клип done, который располагается справа (рис. 14.4).
function createRow() {
// Создается новый ряд из пяти пустых мест.
for(i-0;i<5;i++) {
attachMovie("rock","rock"+row+"-"+i,row*10+i);
clip = _root["rock"+row+"-"+i];
clip._x = leftColLoc + i*horizSpace;
clip._y = topRowLoc + row*vertSpace;
clip.active = true;
}
// Создается кнопка Done.
attachMovie("done","done",1000);
_root.done._x = rightColLoc+20;
_root.done._y = topRowLoc + row*vertSpace;
}Когда игрок щелкает по кнопке Done, вызывается функция doneGuess. Сначала пять кнопок в текущем ряду становятся неактивными. В функции createRow свойству active каждого клипа было присвоено значение true. Теперь же этому свойству присваивается значение false (1) . Код, прикрепленный к каждой кнопке, с помощью этого свойства определяет, можно ли щелкнуть по кнопке или нет.
В массиве temp содержатся номера каждого цвета последовательности (2). Например, если даны два первых цвета, один четвертый и два пятых, массив будет выглядеть следующим образом: [2,0,0,1,2].
Следующий цикл проверяет, сколько цветов точно совпадают с предопределенным расположением (3) . Если были найдены совпадения, числа в массиве temp уменьшаются. То есть теперь в этом массиве отображаются те цвета, совпадения с которыми еще надо найти.
Следующий цикл проверяет несовпавшие цвета в последовательности игрока и определяет, какие из этих цветов находятся в массиве temp (4) . Подсчитав, можно выяснить, сколько цветов правильно угаданы, но помещены не на свое место.
Следующие два цикла создают белые и черные камешки, которые будут соответствовать числу правильно угаданных цветов и числу угаданных цветов, расположенных не на своем месте (5) .
Кнопка Done удаляется, так что теперь она не будет появляться в каждой строке (6) . Когда пользователю дается следующая попытка, создается новая кнопка Done.
В конце функции проверяется, совпадают ли все пять цветов или нет (7) . Если да, то ролик переходит к кадру «win». В противном случае код проверяет, была ли эта попытка десятой (последней), и если так, ролик перейдет к кадру «lose», иначе для следующей попытки вызывается функция createRow.function doneGuess() {
numRightSpot = 0;
numRightColor = 0;
(1) → // Пять кнопок становятся неактивными.
for (i=0;i<5;i++) {
_root["rock"+row+"-"+i].active = false;
}
(2) → // Определяем, сколько имеется кнопок одного цвета.
temp = [0,0,0,0,0];
for (i=0;i<5;i++) {
temp[solution[i]]++;
}
(3) → // Выясняем, сколько цветов правильно угадано.
for (i=0;i<5;i++) {
color = _root["rock"+row+"-"+i]._currentFrame – 2;
if (color == solution[i]) {
numRightSpot++;
temp[color]–;
}
}
(4) → // Проверяем, сколько цветов угадано,
// но находится не на своих местах.
for (i=0;i<5;i++) {
color = _root["rock"+row+"-"+i]._currentFrame – 2;