Даже если игрок перемещает колышек через одно отверстие, помещает его в пустое место, ход засчитывается только в том случае, если он "перепрыгивает" через другой колышек. Следующий фрагмент кода проверяет, есть ли такой "серединный" колышек (13). Если да, код его удаляет и указывает, что перемещаемый колышек теперь находится в новом месте.
Если одно из этих условий не выполняется, значит, ход неверен. Значение переменной
placedостается равным false, оно проверяется в конце функции
(14). И колышек возвращается на свое исходное место.
function dropDrag(peg) {
(8) → // Клип с колышком больше не перемещается.
stopDrag();
// По умолчанию ход неверен.
placed = false;
overole = false;
(9) → // Определяем местоположение отверстия, над которым
// находится курсор.
for(i=0;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
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
peg = _root["peg"+i];
if ((peg._x == x) and (peg._y == y)) {
return true;
}
}
return false;
}
Во время игры внизу экрана все время находится кнопка Restart Game (Начать заново), которая позволяет заново начать игру, когда больше нельзя сделать ни одного действия или когда пользователь понимает, что плохо начал игру. Эта кнопка должна не только вызывать функцию initGame,но и очищать оставшиеся клипы «peg» и «hole».
function restartGame() {
// Удаляем все клипы.
for (i=0;i
_root["peg"+i].removeMovieClip();
_root["hole"+i].removeMovieClip();
}
// Начинаем новую игру.
initGame();
}
Код, прикрепленный к кнопке, расположенной внутри клипа «peg», очень прост. Все, что он делает, это передает функциям действия press и release.
on (press) {
_root.dragPeg(this);
}
on (release) {
_root.dropPeg(this);
}
Другие возможности
Главный способ изменения игры – создание другой доски. Существует множество вариантов, например, колышек можно перемещать не только по вертикали и горизонтали, но и по диагонали. В данном случае нужно переписать код.
Еще одно изменение – создать колышек, который по цвету отличается от других. Таким образом можно усложнить игру: последним нужно оставить именно этот колышек.
Исходный файл: Blocks.fla
Я встречал эту игру в разных вариациях под разными названиями. Основная идея ее в том, что экран заполнен большой решеткой, состоящей из цветных блоков. Игрок может нажать на блок, чтобы удалить его из решетки. Но чтобы удаление блока стало возможным, он должен иметь сверху, снизу или рядом соседний блок того же цвета.
Когда игрок нажимает на доступный для удаления блок, он убирается. К тому же, убирается и соседний блок того же цвета. Все соседи одного цвета с удаленным блоком удаляются тоже. Таким образом, связанная область блоков одного цвета может быть удалена нажатием на любой из блоков этой области.
После удаления группы блоков их верхние соседи спускаются вниз на освободившиеся места. Если какая-нибудь колонка блоков оказывается совершенно пустой, решетка сдвигается влево, чтобы заполнить свободные места.
На рис. 14.8 показано начало игры. В добавление к одному из четырех цветов я поместил на каждый блок маленький рисунок, соответствующий цвету блока. Это облегчает распознавание блоков на черно-белом рисунке. Единственный способ действительно понять игру – это сыграть в нее, поэтому сделайте это прямо сейчас, прежде чем продолжать читать дальше.
Читать дальше
Конец ознакомительного отрывка
Купить книгу