Подготовка ролика В дополнение
Подготовка ролика
В дополнение к четырем кнопкам (рис 6.15) необходимо создать клип-ячейку. Назовем этот клип "gridbox". Он не должен изначально находиться на рабочем поле, но ему надо присвоить имя в панели Linkage Properties, чтобы можно было создавать его копии с помощью ActionScript.
Клип "gridbox" должен содержать два кадра - один с точкой, а второй - в виде пустой ячейки. Первому кадру назначьте сценарий с командой stop (). В отдельный слой клипа поместите кнопку, чтобы пользователь мог кликать по ячейке.
Наконец, создайте клип "actions", который будет содержать обращение к основной функции нашего кода.
Создание кода
Первая функция создает сетку из 25x15 ячеек и двумерный массив, Каждая строка массива представляет собой столбец (одномерный массив) булевых переменных. Таким образом, для доступа к верхнему левому элементу сетки надо написать grid[0][0], а для доступа к пятому элементу и седьмому сверху - grid[4] [6] (то есть центр координат находится в верхнем левом углу).
function createGridO {
// Создаем клипы и заполняем массив,
grid = new Array();
for(y=0;y
var temp = new ArrayO;
for(x=0; x
me = attachMovie("gridbox", "gridbox "+x+" "+y,y*25+x);
mc._x = x*20+30;
mc._y = y*20+30;
mc.x = x; mc.у = у;
temp.push(false); }
grid.push(temp);
}
}
Функция cycle является центральным моментом нашей программы. Она используется для вычисления правил применительно к каждой ячеке. Обратите внимание, что мы дублируем массив grid. Это делается для того, чтобы при изменении значения какого-нибудь элемента массива grid это не повлияло на дальнейшие вычисления на данном шаге программы. Все вычисления происходят опираясь на значения элементов массива baseGrid.
function cycle() {
// Дублируем массив grid. var baseGrid = duplicateGrid();
// Делаем проход по всем ячейкам,
for(y=0;y
for(x=0;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 и возвращает ее в качестве своего значения.
function duplicateGrid() {
var newGrid = new Array();
for(y=0;y
var temp = new Array();
for(x=0;x
temp.push(grid[y][x]);
}
newGrid.push(temp);
}
return(newGrid);
}
Да, но почему мы должны пользоваться функцией duplicateGrid(), вместо того чтобы просто приравнять массив baseGrid массиву grid? Потому что иначе у нас не было бы реальной копии массива. Вместо этого и grid и baseGrid ссылались бы на один и тоже массив и изменения в массиве grid появлялись бы и в массиве baseGrid.
Клип "actions" содержит обработчик onClipEvent (enterFrame), который вызывает функцию runCicle при каждом обращении к кадру. Эта функция проверяет глобальную переменную running и запускает сусle, если ее значение истинно (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
for(x=0;x
grid[y][x] = 0;
this["gridbox "+x+" "+y].gotoAndStop(1);
}
}
running = false;
}
Осталось только рассмотреть код, который находится на кнопке внутри каждого клипа-ячейки. Этот сценарий определяет состояние ячейки. В функции creatGrid мы определили переменные х и у для каждого клипа. Это позволяет установить соответствие между ячейками и элементами массива и вносить изменения в массив при изменении состояния ячейки.
on (release) {
if (_currentframe == 1) {
gotoAndStop(2);
_parent.grid[y][x] = true;
} else {
gotoAndStop(l);
_parent.grid[y][x] = false;
}
}
Содержание раздела