Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript - Гэри Розенцвейг
Шрифт:
Интервал:
Закладка:
На рис. 13.4 показан фрагмент этой игры (файл Matching.fla, расположенный на Web-сайте): в ней 36 карт, из которых четыре уже удалены и две только что открыты. Эти две карты не совпадают, следовательно, они снова будут перевернуты, как только игрок выберет следующую карту.
Рисунок 13.4. Цель игры совпадений – удалить все карты, чтобы стала видна фоновая картинка
Задача проекта
Цель проекта заключается в создании простой, но при этом каждый раз разной игры совпадений. Игрок сможет выбрать одну карту, затем другую. Каждая карта будет перевернута при щелчке мышью, так что будет видна ее картинка. Если карты совпадают, они обе удаляются, в противном случае снова переворачиваются, как только пользователь выберет следующую карту.
Подход
В игре используется только два библиотечных элемента. Первый – клип, в первом кадре которого представлена рубашка карты. В остальных кадрах содержатся картинки. Так как будет 18 различных картинок, в клипе окажется 19 кадров. Если вы хотите, чтобы клип отобразил рубашку карты, перейдите к первому кадру; если хотите увидеть картинку, перейдите к одному из кадров 2-19.
Второй элемент библиотеки – кнопка, расположенная внутри карт клипа. Она будет использоваться для реагирования на действия пользователя.
Игра начинается с создания 36 клипов, помешенных в сетку на рабочем поле. Каждый клип отображает рубашку карты, но если карта перевернута, показывается другая картинка. Каждая картинка будет содержаться в двух клипах, таким образом, получится 18 пар карт.
Когда игрок выбирает первую карту, отображается соответствуюшая ей картинка. Когда игрок выбирает вторую карту, она тоже переворачивается и появившаяся картинка сравнивается с первой открытой картой. Если они совпадают, карты удаляются, в противном случае ничего не произойдет до тех пор, пока игрок не шелкнет еше раз. Тогда первые две карты переворачиваются обратно, и отображается картинка новой выбранной карты.
Подготовка ролика
В ролике Matching.fla есть клип «Cards», временная шкала которого содержит 19 кадров (рис. 13.5).
Рисунок 13.5. Во временной шкале клипа «Cards» имеется 19 кадров, первый без картинки и остальные 18 с различными картинками
В первом кадре расположена рубашка карты, то есть никакой картинки нет. В остальных 18 кадрах содержатся изображения, соответствуюшие разным картам.
Кнопка – просто прямоугольник такого же размера, что и карта. Она расположена в третьем слое клипа "Cards" (см. рис. 13.5), то есть за фоном. Хотя кнопку не будет видно, она будет реагировать на действия пользователя.
Также в клипе "Cards" присутствует фон. У первого кадра, содержашего рубашку карты, фон серый. У остальных кадров, в которых находится какая-либо картинка, белый фон.
Создание кода
Почти весь код этой игры находится в основной временной шкале. Ролик начинается с вызова функции initGame, которая создает список 18 пар карт, случайным образом выбирает карты из первого списка, а затем помешает их во второй список, чтобы перемешать колоду карт.
Потом функция создает 36 карт. Каждый клип автоматически начинается с того, что карта помешается рубашкой вверх, а свойству клипа ("picture") присваивается номер картинки, которую карта будет представлять.initGame();
stop();
function initGame() {
// Создаем отсортированный список карт.
cardsListOrdered = [];
for(i=1;i<=18;i++) {
cardsListOrdered.push(i,i);
}
// Список перемешанных карт.
cardsListSorted = [];
while (cardsListOrdered.length > 0) {
r = int(Math.random()*cardsListOrdered.length);
cardsListSorted.push(cardsListOrdered[r]};
cardsListOrdered.splice(r,1);
}
// Создаем клипы карт и определяем их положение и картинки.
x = 0;
y = 0;
for(i=0;i<36;i++) {
attachMovie("card", "card"+i, i);
_root["card"+i].picture = cardsListSorted[i];
_root["card"+i]._x = x*60+200;
_root["card"+i]._y = y*60+50;
// Переходим к следующей карте.
x++;
if (x > 5) {
x = 0;
y++;
}
}
firstclip = 0;
}...Примечание
Обратите внимание, что с помощью команды push в массив можно добавить сразу более одного элемента. Например, выражение myArray.push(7,12) добавит в массив myArray числа 7 и 12.
Функция initGame заканчивается тем, что обнуляется переменная firstclip. В этой переменной содержится ссылка на карту, по которой шелкнули первой. Когда шелкают по клипу, кнопка внутри этого клипа отреагирует и на основную временную шкалу с помошью функции clickCard будет добавлена ссылка к клипу.
Функция clickCard может выполнить одну из 3-х функций. Если значение переменной firstclip равно 0, ей присваивается клип, по которому шелкнули, карта переворачивается, то есть программа переходит к кадру, содержашему соответствуюшую картинку.
Если в переменной firstclip хранится ссылка на некий клип, значит, одна карта уже перевернута. В этом случае программа переворачивает и вторую карту, присваивает переменной secondclip значение клипа и сравнивает два клипа. Если они совпадают, оба клипа удаляются.
Третье условие, которое, на самом деле, проверяется до двух первых, возникает тогда, когда игрок шелкает по одной и той же карте дважды. В таком случае значение переменной clip будет равно firstclip. Карта просто снова переворачивается и значение firstclip обнуляется.
Прежде чем проверить эти три условия, функция clickCard определяет, перевернуты ли уже две карты. Если да, значит, игрок уже выбрал две карты, но они не совпали. Прежде чем перевернуть следующую карту, эти две карты поворачиваются рубашками вверх.
function clickCard(clip) {
// Проверяем, отображены ли две карты.
if (secondclip != 0) {
// Располагаем эти две карты рубашками вверх.
firstclip.gotoAndStop(1);
secondclip.gotoAndStop(1);
firstClip = 0;
secondClip = 0;
}
// Проверяем, щелкнул ли пользователь дважды
// по одной и той же карте.
if (firstclip == clip) {
// Переворачиваем карту.
firstclip.gotoAndStop(1);
firstclip = 0;
// Выясняем, есть ли хоть одна перевернутая карта.
} else if (firstclip == 0); {
// Переворачиваем первую карту.
clip.gotoAndStop(clip.picture+1);
firstclip = clip;
// Одна карта должна быть перевернута.
} else {
// Переворачиваем вторую карту.
clip.gotoAndStop(clip.picture+1);
secondClip = clip;
// Проверяем, совпадают ли карты.
if (firstclip.picture == secondClip.picture) {
// Удаляем обе карты.
firstClip.removeMovieClip();
secondClip.removeMovieClip();
firstClip = 0;
secondClip = 0;
}
}
}Вот все, что нужно для игры. У кнопки внутри клипа «Cards» только одна строчка кода, которая передает основной временной шкале информацию о том, что по клипу шелкнули.
on (press) {
// Передаем основной временной шкале информацию о щелчке мышью.
_root.clickCard(this);
}
К сведению
Не забудьте вставить команду stop() в первый кадр клипа «Cards». В противном случае во всех картах будут отображаться все картинки.
Другие возможности
Самый простой способ изменить эту игру – добавить фоновый рисунок, который будет отображаться за картами. Картинки на картах могут соответствовать теме фоновой картинки. Вы можете выбрать практически любую тему. Также в первый кадр клипа «Cards» нетрудно добавить картинку для рубашки карты.
Хотя в примере 36 карт, ничто не мешает вам уменьшить или увеличить это число. Просто не забудьте откорректировать размер сетки, а также длину массива в начале игры. Если число карт не будет вписываться в квадратную сетку, вам понадобится изменить код или написать новый, чтобы определить расположение карт.
Еще одна возможность – использовать четыре однотипные карты, а не две. Так будет гораздо проше найти совпадения.
Если вы хотите, чтобы игра определяла, когда найдены все совпадения, добавьте счетчик, который будет увеличиваться при каждом совпадении. Когда счетчик станет равен 18, игра закончится. Затем можно перейти к кадру "you win".Найди картинку
Исходный файл: Fmdthepicture.fla
Эта игра необычная, ее можно найти скорее в книге пазлов, чем на компьютере. Создание Flash-версии этой игры помогает показать несколько полезных приемов.
В игре "Найди картинку" игрок ишет не целую картинку, а ее сегмент. Целиком картинка показана справа, а слева показана ее увеличенная часть. Задача состоит в том, чтобы быстро найти место увеличенного сегмента на целой картинке.
Игра показана на рис. 13.6. Сегмент слева выбран случайно и увеличен в три раза. Игрок должен шелкнуть по соответствуюшему месту большой картинки. В зависимости от того, насколько быстро он нашел правильное место, начисляются дополнительные очки.
Рисунок 13.6. В этой игре ваша задача найти место маленького изображения слева на большом изображении справа
Задача проекта
Чтобы создать эту игру, ваш сценарий должен уметь выбирать случайный сегмент из большой картинки и показывать его рядом с ней. Это требует использования масок. Также ActionScript должен уметь сопоставить сегмент с соответствуюшей областью на большой картинке.
Кроме манипуляций с изображениями, в игру должен быть включен таймер. Таймер начинает с некоего большего числа и производит обратный отсчет. Когда игрок верно угадывает место сегмента на картинке, он получает дополнительные очки в зависимости от показаний таймера.