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

ЖАНРЫ

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

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

Шрифт:

Вот и все правила, которые вам нужны. Результаты могут оказаться удивительными. Попробуйте запустить исходный файл. Создайте колонию точек подобно изображенным на рис. 6.15 и нажмите кнопку Run.

Рисунок 6.15. В игре «Жизнь» живут и умирают маленькие красные точки

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

Программа создает сетку, заполняющую экран. Каждая ячейка может содержать или не содержать точку. Щелкнув по ячейке, пользователь может изменить ее состояние.

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

меняется.

Пользователь может нажать кнопку Stop для остановки игры. Имеются также кнопка пошагового исполнения алгоритма (Step) и кнопка очистки игрового поля (Clear).

Подход

Ролик начинается с создания сетки, состоящей из клипов (ячеек). Также создается двумерный массив булевых переменных. Каждый элемент массива соответствует определенной ячейке и указывает, в каком кадре находится этот клип-ячейка (то есть находится ли в данной ячейке жилец).

Основная функция ролика просматривает все ячейки и вычисляет изменения в них. Выполнение этой функции представляет собой один шаг игры. Если пользователь нажимает кнопку Run, ролик выполняет эти шаги непрерывно. При выборе кнопки Step исполняется только один шаг.

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

В дополнение к четырем кнопкам (рис 6.15) необходимо создать клип-ячейку. Назовем этот клип «gridbox». Он не должен изначально находиться на рабочем поле, но ему надо присвоить имя в панели Linkage Properties, чтобы можно было создавать его копии с помощью ActionScript.

Клип "gridbox" должен содержать два кадра – один с точкой, а второй – в виде пустой ячейки. Первому кадру назначьте сценарий с командой stop. В отдельный слой клипа поместите кнопку, чтобы пользователь мог кликать по ячейке.

Наконец, создайте клип "actions", который будет содержать обращение к основной функции нашего кода.

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

Первая функция создает сетку из 25x15 ячеек и двумерный массив. Каждая строка массива представляет собой столбец (одномерный массив) булевых переменных. Таким образом, для доступа к верхнему левому элементу сетки надо написать grid[0][0] , а для доступа к пятому слева и седьмому сверху – grid[4][6] (то есть центр координат находится в верхнем левом углу).

function createGrid {

// Создаем клипы и заполняем массив.

grid = new Array;

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

var temp = new Array;

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

mc = attachMovie("gridbox", "gridbox "+x+" "+y,y*25+x);

mc._x = x*20+30;

mc._y = y*20+30;

mc.x = x;

mc.y = y;

temp.push(false);

}

grid.push(temp);

}

}

Функция cycle является центральным моментом нашей программы. Она используется для вычисления правил применительно к каждой ячейке. Обратите внимание, что мы дублируем массив grid. Это делается для того, чтобы при изменении значения какого-нибудь элемента массива grid это не повлияло на дальнейшие вычисления на данном шаге программы. Все вычисления происходят опираясь на значения элементов массива baseGrid.

function cycle {

// Дублируем массив grid.

var baseGrid = duplicateGrid;

// Делаем проход по всем ячейкам.

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

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

thisBox = baseGrid[y][x];

mc = this["gridbox "+x+" "+y];

// Вычисляем количество "заселенных" ячеек вокруг

// данной.

n = 0;

n += baseGrid[y-1][x-1];

n += baseGrid[y-1][x];

n += baseGrid[y-1][x+1];

n += baseGrid[y][x-1];

n += baseGrid[y][x+1];

n += baseGrid[y+1][x-1];

n += baseGrid[y+1][x];

n += baseGrid[y+1][x+1];

// Если в этой ячейке уже была точка и если количество

// "жильцов" вокруг равно 2 или 3, то точка остается.

if (thisBox) {

if ((n == 2) or (n == 3)) {

newValue = true;

} else {

newValue = false;

}

// Новая точка "рождается", если ячейка была пуста

// и если в смежных ячейках находится ровно 3 точки.

} else {

if (n == 3) {

newValue = true;

} else {

newValue = false;

}

}

// Меняем текущий кадр клипа mc.

grid[y][x] = newValue;

if (newValue) {

mc.gotoAndStop(2);

} else {

mc.gotoAndStop(1);

}

}

}

}

Функция duplicateGrid создает копию массива grid и возвращает ее в качестве своего значения.

// Создаем копию массива grid.

function duplicateGrid {

var newGrid = new Array;

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

var temp = new Array;

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

temp.push(grid[y][x]);

}

newGrid.push(temp);

}

return(newGrid);

}

Да,

но почему мы должны пользоваться функцией duplicateGrid , вместо того чтобы просто приравнять массив baseGrid массиву grid? Потому что иначе у нас не было бы реальной копии массива. Вместо этого и grid и baseGrid ссылались бы на один и тоже массив и изменения в массиве grid появлялись бы и в массиве baseGrid. Клип "actions" содержит обработчик onClipEvent (enterFrame), который вызывает функцию runCicle при каждом обращении к кадру. Эта функция проверяет глобальную переменную running и запускает cycle, если ее значение истинно (true).

function runCycle {

if (running) {

cycle;

}

}

Рассмотрим теперь сценарии кнопок. Каждая кнопка содержит обработчик вида on(release), который вызывает одну из следующих функций. Первая (кнопка Run) задает глобальной переменной running значение true.

function startCycle {

running = true;

}

Если же пользователь нажмет кнопку Step, то функция cycle будет вызвана лишь один раз и переменная running не изменит своего значения.

function stepCycle {

cycle;

}

При нажатии кнопки Stop переменной running присваивается значение false.

function stopCycle {

running = false;

}

И наконец, нажатие кнопки Clear очищает массив grid и все ячейки сетки.

function clear {

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

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

grid[y][x] = 0;

this["gridbox "+x+" "+y].gotoAndStop(1);

}

}

running = false;

}

Осталось только рассмотреть код, который находится на кнопке внутри каждого клипа-ячейки. Этот сценарий определяет состояние ячейки. В функции creatGri d мы определили переменные x и y для каждого клипа. Это позволяет установить соответствие между ячейками и элементами массива и вносить изменения в массив при изменении состояния ячейки.

on (release) {

if (_currentframe == 1) {

gotoAndStop(2);

_parent.grid[y][x] = true;

} else {

gotoAndStop(1);

_parent.grid[y][x] = false;

}

}

К сведению

Кроме рассмотренных функций в сценарии кадра имеется код, вызывающий функцию creatGrid, и команда stop. Возможна также другая реализация. Дело в том, что игра нуждается в получении определенных данных для запуска. Ведь если вы нажмете кнопку Run при пустом игровом поле, то ничего не произойдет. Поиграйте с колонией, изображенной на рис 6.15. Ее называют «маленький взрыв». Программисты, впервые реализовавшие игру «Жизнь», придумали имена некоторым таким «цивилизациям».

Попробуйте создать свои колонии или поищите в Интернете уже существующие. Поиск по ключу "game of life" откроет вам множество страниц с самыми разнообразными конфигурациями.

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

Дополнительно вы можете добавить в игру кнопки для загрузки каких-то уже существующих колоний. Это избавит вас от необходимости каждый раз создавать их заново.

Глава 7 Игрушки-конструкторы

• Составь лису методом «Перетащи и положи»

• Создай лису методом "Нажми и измени"

• Альбом для рисования

• Музыкальный миксер

• Танцующая лиса

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

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

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

Поделиться с друзьями: