Чтение онлайн

на главную - закладки

Жанры

Adobe Flash. Создание аркад, головоломок и других игр с помощью ActionScript

Розенцвейг Гэри

Шрифт:

Когда игрок проигрывает, функция showSolution создает пять новых экземпляров клипа и с их помощью отображает правильный вариант. В ролике, размещенном на Web-сайте, это решение располагается в нижней части игрового поля.

function showSolution {

// Размещаем правильный вариант внизу экрана.

for(i=0;i<5;i++) {

attachMovie("rock","solution"+i,1001+i);

clip = _root[“solution”+i];

clip._x = solutionx + i*horizSpace;

clip._y = solutiony;

clip.foroAndStop(solution[i]+2);

}

}

На рис. 14.6 показан фрагмент ролика, когда игра уже проиграна. Функция showSolution поместила правильную последовательность (решение) внизу экрана.

Рисунок 14.6. Игра проиграна, код поместил правильную последовательность решения внизу экрана

Единственный оставшийся фрагмент кода –

небольшой сценарий, прикрепленный к кнопке в каждом клипе «rock». Его задача состоит в том, чтобы переключать цвета один за другим и возвращаться к первому кадру (пустому месту), если пользователь щелкнул определенное число раз. Этот код также проверяет свойство active, чтобы убедиться, что ряд – текущий.

on (press) {

if (active) {

f = _currentFrame+1;

if (f > 6) f = 1;

gotoAndStop(f);

}

}

К сведению

Не забудьте присвоить последним двум кадрам клипа «rock» метки «white» и «black». Также обязательно поместите кнопку Done внутрь клипа «done», которому потом необходимо присвоить имя «done» в панели Linkage Properties. К сожалению, это необходимо, так как ActionScript не может динамически создавать кнопки сами по себе. Считайте, что клип «done» – это просто «обертка» для кнопки Done.

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

Важно помнить о том, что если вы хотите изменить какие – либо элементы игры, надо соответственно подкорректировать константы, представленные в начале кода. Если вы не будете о этом забывать, с игрой можно делать практически что угодно.

Чтобы изменить уровень сложности игры попробуйте изменить количество попыток угадать решение. Также можно увеличить или уменьшить число цветов и мест для них.

Йога

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

Классическая игра "Йога" известна уже тысячи лет. Современные версии сделаны из дешевого пластика. С развитием Web-технологий появился и виртуальный вариант этой игры.

Для игры требуется решетка с отверстиями для колышков (рис. 14.7). Колышки расположены во всех отверстиях, кроме одного. Игрок должен взять один колышек и "перепрыгнуть" через другой, при этом попасть на пустое место. Колышек, через который "перепрыгнули", при этом удаляется. Игра продолжается до тех пор, пока нельзя будет сделать больше ни одного передвижения.

Рисунок 14.7. Наиболее распространенная конфигурация доски с колышками. Вы можете создать свой вариант

Хороший игрок может выиграть, если у него останется только один колышек. При быстрой игре, без раздумий, может остаться примерно от 8 до 12 колышков.

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

Цель проекта – создать компьютерный вариант игры «Йога» (рис. 14.7). Игрок щелкает мышкой и перемещает колышки. Неверный ход сделать нельзя, а правильный автоматически удаляет элемент, через который «перепрыгнули».

Подход

Вся игра происходит в одном кадре. Сначала на рабочем поле нет никаких элементов.

Отверстия и колышки – отдельные клипы, они помещаются на рабочее поле с помощью кода, что избавляет вас от необходимости размещать каждый клип и присваивать ему имя. Вместо вас всю работу выполнит программа.

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

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

Для игры требуется всего два клипа: «peg» и «hole». В клипе «peg» должна быть расположена кнопка, которая сообщает основной временной шкале о щелчке мышью (пользователь нажимает и отпускает ее кнопку).

Так как перед началом ролика на рабочем поле нет ни одного клипа, им необходимо назначить свойства связи. Код обращается к ним по именам "peg" и "hole".

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

Почти весь код находится в одном кадре основной временной шкале. Он начинается с создания экземпляров клипов «peg» и «hole» и их размещения на рабочем поле. С помощью оператора if создаются необходимые для игры отверстия. Также код проверяет, во все ли отверстия, кроме одного в центре, вставлены колышки.

В конце функции переменной maxHole присваивается значение, равное количеству всех отверстиях. Эта переменная будет использоваться в тех функциях, где необходимо выяснить, все ли клипы удовлетворяют определенным условиям.

initGame;

stop;

function initGame {

// Определяем постоянное расположение клипов.

holeSpace = 30;

puzzleLeft = 160;

puzzleTop = 80;

// Просматриваем все отверстия и создаем в них колышки.

i = 0;

for(y=0;y<9;y++) {

for (x=0;x<9;x++) {

// Проверяем, должен ли быть создан колышек.

// Если да, создаем его.

if (((y < 3) or (y > 5)) and ((x < 3) or (x > 5))) continue

// Добавляем и размещаем новое отверстие.

attachMovie("hole", "hole"+i, i);

_root["hole"+i]._x = x*holeSpace + puzzleLeft;

_root["hole"+i]._y = y*holeSpace + puzzleTop;

// Не добавляем колышек в центральное отверстие.

if ((x != 4) or (y != 4)) {

//

Добавляем и размещаем

// новое отверстие.

attachMovie("peg","peg"+i,100+i);

_root["peg"+i]._x = x*holaSpace + puzzleLeft;

_root["peg"+i]._y = y*holaSpace + puzzleTop;

}

i++;

}

}

// Запоминаем количество колышков.

maxHole = i;

}

Когда игрок щелкает по колышку, на самом деле он щелкает по кнопке, расположенной внутри клипа. Оба действия, «press» и «release», передаются функциям в основной временной шкале. Функция dragPeg вызывается действием «press». Эта функция сохраняет положение колышка в переменных pegx и pegy, а затем разрешает перемещать колышек. Также она использует функцию swapDepths, чтобы колышек отображался поверх всех остальных.

function dragPeg(peg) {

// Запоминаем исходное положение колышка.

pegx = peg._x;

pegy = peg._y;

// Размещаем колышек поверх остальных.

peg.swapDepths(2000);

// Разрешаем программе Flash перемещать клип.

startDrag(peg, true);

}

Функция dropDrag вызывается тогда, когда игрок отпускает кнопку мыши при перетаскивании. Сначала клип прекращает перемещение (8) . Затем с помощью функции dropDrag выясняется, находится ли какое-нибудь отверстие под курсором (9) .

Если курсор мыши расположен над дыркой, следующий шаг – определить, пустое ли отверстие или нет (10) . Затем код проверяет отверстия во всех четырех направлениях, чтобы выяснить, из какой дырки мог быть перемещен колышек. Для определения относительного положения отверстия используются переменные dx и dy (11) . Например, если игрок перемещает колышек вправо. dx присваивается 1, а dy – 0. Если вверх, то dy будет равняться -1, а dx – 0. Если отверстие, куда игрок перемещает колышек, не расположено через одну дырку вправо, влево, вверх или вниз, значения dx и dy становятся равными 0 (12) .

Даже если игрок перемещает колышек через одно отверстие, помещает его в пустое место, ход засчитывается только в том случае, если он "перепрыгивает" через другой колышек. Следующий фрагмент кода проверяет, есть ли такой "серединный" колышек (13) . Если да, код его удаляет и указывает, что перемещаемый колышек теперь находится в новом месте.

Если одно из этих условий не выполняется, значит, ход неверен. Значение переменной placed остается равным false, оно проверяется в конце функции (14) . И колышек возвращается на свое исходное место.

function dropDrag(peg) {

(8) →  // Клип с колышком больше не перемещается.

stopDrag;

// По умолчанию ход неверен.

placed = false;

overole = false;

(9) →  // Определяем местоположение отверстия, над которым

// находится курсор.

for(i=0;i<maxHole;i++) {

hole = _root["hole"+i];

if (hole.hitTest(_xmouse, _ymouse)) {

overeHole = true;

break;

}

}

(10) → // Выясняем, свободно ли отверстие.

if (!pegThere(hole._x, hole._y)) {

(11) → // Определяем различие между исходным и конечным

// положениями.

dx = 0;

dy = 0;

if ((pegx == hole._x) and (pegy-holeSpace*2 == hole._y)) {

// сверху

dy = -1;

} else if (pegx==hole._x) and (pegy+holeSpace*2==hole._y)) {

// внизу

dy = 1;

} else if (pegy==hole._y) and (pegx-holeSpace*2==hole._x)) {

// слева

dx = -1;

} else if (pegy==hole._y) and (pegx+holeSpace*2==hole._x)) {

// справа

dx = 1;

}

(12) → // Значения dx и dy будут равны 0, если целевое отверстие

// не находится на необходимом расстоянии.

if ((dx != 0) or (dy != 0)) {

(13) → // Выясняем, есть ли колышек посередине.

midThere = false;

for(i=0;i<maxHole;i++) {

mid = _root["peg"+i];

if ((mid._x == pegx + dx*holeSpace) and (mid._y == pegy + dy*holeSpace)) {

// Раз колышек здесь находится,

// значит, ход верный.

// Указываем новое положение колышка.

peg._x = hole._x;

peg._y = hole._y;

// Удаляем колышек посередине.

mid.removeMovieClip;

// Запоминаем, что ход верен.

placed = true;

break;

}

}

}

}

(14) → // Проверяем, верный ли ход был сделан, и если нет,

// восстанавливаем исходное положение колышка.

if (placed) {

peg._x = pegx;

peg._y = pegy;

}

}

Функция dropPeg использует полезную функцию pegThere, которой передается расположение отверстия и которая возвращает значение true, если именно в этом месте обнаружен клип peg.

function pegThere(x.y) {

// Выясняем, находится ли в этом месте колышек.

for (i=0;i<maxHole;i++) {

peg = _root["peg"+i];

if ((peg._x == x) and (peg._y == y)) {

return true;

}

}

return false;

}

Во время игры внизу экрана все время находится кнопка Restart Game (Начать заново), которая позволяет заново начать игру, когда больше нельзя сделать ни одного действия или когда пользователь понимает, что плохо начал игру. Эта кнопка должна не только вызывать функцию initGame, но и очищать оставшиеся клипы «peg» и «hole».

Поделиться:
Популярные книги

Сын Тишайшего

Яманов Александр
1. Царь Федя
Фантастика:
попаданцы
альтернативная история
фэнтези
5.20
рейтинг книги
Сын Тишайшего

"Искажающие реальность" Компиляция. Книги 1-14

Атаманов Михаил Александрович
Искажающие реальность
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
рпг
5.00
рейтинг книги
Искажающие реальность Компиляция. Книги 1-14

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Невеста на откуп

Белецкая Наталья
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Невеста на откуп

Убивать чтобы жить 2

Бор Жорж
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 2

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Аргумент барона Бронина 4

Ковальчук Олег Валентинович
4. Аргумент барона Бронина
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Аргумент барона Бронина 4

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Измена. Право на обман

Арская Арина
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на обман

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Жаба с кошельком

Донцова Дарья
19. Любительница частного сыска Даша Васильева
Детективы:
иронические детективы
8.26
рейтинг книги
Жаба с кошельком

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Академия чаросвет. Тень

Ярошинская Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Академия чаросвет. Тень

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4