Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
материал. часть2 / Розенцвейг_Adobe_Flash_Создание аркад, головоломок и других игр с помощью ActionScript.rtf
Скачиваний:
52
Добавлен:
11.02.2016
Размер:
9.87 Mб
Скачать

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

В клипе «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;

if (color != solution[i]) {

if (temp[color] > 0) {

numRightColor++;

temp[color]–;

}

}

}

(5) → // Создаем белые камешки.

level = row*10+5;

x = rightColLoc;

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

attachMovie("rock","white rock"+level,level);

clip = _root["white rock"+level];

clip.gotoAndStop("white");

clip._x = x;

clip._y = topRowLoc + row*vertSpace;

level++

x+=horizSpace;

}

// Создаем черные камешки.

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

attachMovie("rock","black rock"+level,level);

clip = _root["black rock"+level];

clip.gotoAndStop("black");

clip._x = x;

clip._y = topRowLoc + row*vertSpace;

level++;

x+=horizSpace;

}

(6) → // Удаляем кнопку Done.

done.removeMovieClip();

(7) → // Выясняем, выиграл ли игрок.

if (numRightSpot == 5) {

gotoAndPlay("win");

} else {

row++;

// Проверяем, проиграл ли игрок.

if (row >= 10) {

showSolution();

gotoAndPlay("lose");

} else {

createRow();

}

}

}

Когда игрок проигрывает, функция 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);

}

}

Соседние файлы в папке материал. часть2