Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript
Шрифт:
_root.onMouseDown = function {
var card = undefined;
(18) → // Смотрим, был ли щелчок по одной из карт пирамиды.
for(var i=27;i>=0;i–) {
if (_root["card"+i].hitTest(_xmouse,_ymouse)) {
var card = _root["card"+i];
break;
}
}
(19) → // Если был, закрывают ли эту карту другие карты?
if (card != undefined) {
if (cardPresent(card.row+1,card.col) or cardPresent(card.row+1,card.col+1)) {
card = undefined;
}
}
(20) → // Был ли щелчок по стопке карт, лежащих мастью вверх?
if (card == undefined) {
if (stack1.hitTest(_xmouse,_ymouse)) {
card = stack1;
}
}
// Проверяем, выбрана ли еще одна карта.
if (card != undefined) {
(21) → //
if (firstCard == undefined) {
firstCard = card;
// Игнорируем второй щелчок по той же карте.
} else if (firstCard == card) {
(22) → // Если выбраны две карты и их сумма равна 13.
} else if (cardValue(firstCard) + cardValue(card) == 13) {
// Удаляем обе карты.
removeCard(card);
removeCard(firstCard);
firstCard = undefined;
// В противном случае считаем, что это первая выбранная карта.
} else {
firstCard = card;
}
}
(23) → // Если выбрана одна карта, и это «король».
if (cardValue(firstCard) == 13) {
removeCard(firstcard);
firstCard = undefined;
}
(24) → // Если щелкнули по колоде закрытых карт, переворачиваем очередную карту.
if (stack0.hitTest(_xmouse,_ymouse)) {
stack1.value = deck.pop;
stack1.gotoAndStop(stack1.value);
stack.push(stack1.value);
// Когда закрытая колода кончается, удаляем ее.
if (deck.length == 0) {
stack0.removeMovieClip;
}
}
(25) → // Помещаем рамку около выделенной карты.
if (firstCard != undefined) {
outline._x = firstCard._x;
outline._y = firstCard._y;
} else {
outline._x = -1000;
}
(26) → // Если удалена первая карта в пирамиде, значит игрок выиграл.
if (_root["card0"] == undefined) {
gotoAndStop("game over");
}
}Осталось рассмотреть несколько полезных функций. Первая, removeCard, удаляет карту из колоды открытых карт или из пирамиды. Чтобы удалить карту из открытой колоды, она должна просто отправить клип «stack1» к кадру, который представляет предыдущую карту. Именно в этом месте оказывается полезным массив stack. Каждая карта, положенная мастью вверх, добавляется к stack. Чтобы достать карту опять, вам нужно удалить последнюю карту из массива stack и затем обратиться к последниму члену этого массива. Если карта оказалась из пирамиды, то клип просто удаляется.
function removeCard(thisCard) {
if (thisCard == stack1) {
// Удаляем карту из открытой колоды.
stack1.gotoAndStop(1);
stack.pop;
stack1.value = stack[stack.length-1];
stack1.gotoAndStop(stack1.value);
} else {
// Удаляем карту из пирамиды.
thisCard.removeMovieClip;
}
}Следующая функция, cardPresent, проверяет в цикле все карты, чтобы определить, существует ли карта в позиции, определенной аргументами вызова данной функции.
function cardPresent(row, col) {
// Проверяем, существует ли в пирамиде данная карта.
for(var i=0;i<28;i++) {
thisCard = _root["card"+i];
if ((thisCard.row == row) and(thisCard.col == col)) {
return (true);
}
}
return(false);
}Функция cardValue берет свойство value клипа карты, отбрасывает первый символ и возвращает численное значение. Например, если значение value карты равно c9, возвращается число 9.
function cardValue(card) {
// Удаляем первый символ из значения value.
n = card.value;
n = parseInt(n.substr(1,2));
return(n);
}Последняя функция проходит в цикле по всем картам пирамиды и удаляет все оставшиеся карты. Также она удаляет «stackO» и «stack1». Это очищает рабочее поле для подготовки к следующему раунду.
function clearGame {
// Удаляем карты из пирамиды.
for(var i=0;i<28;i++) {
_root["card"+i].removeMovieClip;
}
// Удаляем обе колоды.
stack0.removeMovieClip;
stack1.removeMovieClip;
}К сведению
Кнопка New на экране имеет простой
сценарий и сначала вызывает clearGame, а потом startGame. Это перезапускает игру в любой удобный пользователю момент.on (press) {
clearGame;
startGame;
}
Другие возможности
Игру можно сделать значительно проще, если вы разрешите игроку переворачивать колоду уже открытых карт и смотреть карты столько раз, сколько он захочет. Вы можете сделать это, опознавая, когда массив deck пуст, и помещая каждую карту из массива stack обратно в массив deck.
Кроме этого пасьянса вы можете создать много других. В моей коллекции более 200 вариантов подобных игр. Большинство из них требует вытаскивания карт и перекладывания из стопки в стопку. Это делает код гораздо более сложным, но не невозможным для опытного программиста.Глава 16 Аркады
• Космический бой
• Астероиды
• Погоня в лабиринте
• Луноход
• Платформенный скроллер
Большинство людей, думая о компьютерных играх, имеют в виду классические аркады, например «Space invaders» (Космические захватчики), «Asteroids» (Астероиды), «Pac-Man», «Centipede» (Сороконожка) и «Lunar Lander» (Луноход). В этой главе рассматриваются игры именно такого типа. Сначала вы создадите игру космического боя, в которой нужно стрелять по объектам, летящим на ваш корабль. Затем вашему вниманию будет предложена похожая игра, "Space Rocks" (Астероиды). Следующая игра этой главы – погоня по лабиринту, затем игра под названием "Moon Lander" (Луноход). И закончим главу более сложной аркадной игрой под названием "Платформенный скроллер".
Космический бой
Исходный файл: Spacecombat.fla
Аркады иногда называют играми на реакцию, так как единственные необходимые здесь навыки – умение быстро регировать. Это особенно верно для первой игры, "Космический бой".
На рис. 16.1 показан фрагмент ролика Spacecombat.fla, размещенного на Web-сайте: игрок как бы находится внутри космического корабля, навстречу которому летят астероиды.
Рисунок 16.1. В игре «Космический бой» вы – пилот космического корабля, который пытается пролететь сквозь поле астероидов
Задача проекта
В этой игре можно стрелять по летящим астероидам небольшими пулями. Если пули попадают по объекту, он взрывается, не причиняя вреда кораблю. Однако если астероид не будет сбит, он может столкнуться с кораблем игрока и повредить его.
В игре подсчитывается число разрушенных астероидов и число астероидов, ударившихся о корабль. Некоторые астероиды могут пролететь сверху, снизу, справа или слева от корабля, не причиняя никакого вреда. Игра заканчивается тогда, когда произойдет 20 столкновений.
Подход
В игре есть два активных элемента – астероиды и пули. Астероиды появляются около центра экрана и движутся к точке в области, которая по размеру больше экрана. Если астероид вылетает за пределы экрана, считается, что он пролетел мимо корабля. Если конечная точка движения астероида находится в области экрана, то астероид может столкнуться с кораблем и повредить его. При движении астероид увеличивается в размере, создавая иллюзию трехмерного пространства.
Пули вылетают из нижнего правого и нижнего левого углов экрана, они летят к точке, обозначенной положением курсора в момент выстрела. Когда пули достигают своей цели, они разрушают астероид, если он находится в этой точке.
Разрушая астероид, вы не только набираете очки, но и предотвращаете столкновение астероида с кораблем. Поэтому надо концентрировать свое внимание на тех астероидах, которые летят непосредственно на корабль.
Подготовка ролика
В этом ролике не так много библиотечных элементов. На переднем плане сверху и снизу расположены элементы (см. рис. 16.1), представляющие собой интерьер вашего корабля. Все элементы переднего плана, включая текстовые области подсчета очков и повреждений внизу экрана, находятся в клипе «foreground». Благодаря этому можно легко поместить весь клип на передний план относительно пуль и астероидов.