Иллюстрированный самоучитель по Flash-games

       

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


Весь сценарий прикреплен к клипу "actions", расположенному за пределами рабочего поля. Он начинается с обработчика событий onClipEvent (mouseDown), который реагирует на щелчок мыши по рабочему полю.
Этот код просто просматривает элементы картинки и определяет, находится ли один из них под курсором, а также является ли элемент полностью непрозрачным, то есть размещен ли на своем месте.
Если элемент найден, программе Flash сообщается, что теперь он подвижный и может перемещаться с помощью команды startDrag. Затем программа завершается.

Команда startDrag - основное действие, позволяющее пользователю перетаскивать клип. Оно не такое универсальное, как методы перетаскивания, рассмотренные ранее, но в простых случаях работает хорошо. Команда stopDrag останавливает перетаскивание.

onClipEvent(mouseDown) {

// Определяем положение курсора.
mx = _root._xmouse;

my = _root._ymouse;

// Просматриваем все элементы картинки,

for (x=0;x

for(y=0;y

piece = _root[x+"-"+y];

// Выясняем, находится ли элемент под курсором

// и не находится ли он уже на своем месте?

if (piece.hitTest(mx,my) and (piece._alpha < 100)){

// Пользователь щелкнул по элементу.



piece.startDrag();

// Выходим из циклов.
х = 6 ;

У = 4;

break;
}}
}}

Когда пользователь отпускает кнопку мыши, элемент фиксируется, Код проверяет расстояние от центра элемента до центра контура: если оно не превышает 10. пикселов, элемент перемешается точно в свое положение и становится полностью непрозрачным, так что пользователь видит: элемент находится на своем месте.

onClipEvent(mouseUp) {

// Прекращаем перемещение элемента.

stopDrag();

// Измеряем расстояние от центра элемента до центра контура.

dx = _root.outline._x - piece._x;

dy = _root.outline._x - piece._y;
dist = Math.sqrt(dx*dy+dy*dy);

// Если расстояние меньше 10 пикселов,
// элемент помещается на свое место,

if (dist < 10) {

piece._x = _root.outline._x;

piece. _y = _root.outline._y;

// Делаем элемент полностью непрозрачным,

piece._alpha = 100;

}
}


Большая часть кода находится в основной временной шкале. Он начинается с выравнивания элементов на расстоянии точно в 54 пиксела, затем 100 раз выполняется цикл, перемещающий случайно выбранный элемент на пустую позицию.

function initGame() {

// Устанавливаем горизонтальное и вертикальное расстояние

// между элементами.

tileDist = 54;

// Помещаем все элементы на свои места,

for (x=l;x

for (y=0;y

tile = х+у*4;

_root["tile"+tile];

_x = x*tileDist;

_root["tile"+tile];

_y = y*tileDist+tileDist;
}}

// Совершаем 100 произвольных перемещений,

for(tilenum=0;tilenum

do {

// Выбираем элемент случайным образом.

tile = "tile"+(random(15)+1);

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

emptySpace = findEmpty(tile);

// Цикл продолжается до тех пор, пока не будет найден

// элемент, рядом с которым расположен свободный квадрат.

} while (emptySpace == "none");

// Перемещаем элемент на свободное место.

moveTile(tile,findEmpty(tile));

}}

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

// Проверяем, есть ли свободное место около данного элемента,

function findEmpty (tile) {

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

tilex = _root[tile]._x;

tiley = _root[tile]._y;

// Проверяем, есть ли элемент мозаики слева,

if (tilex > tileDist) {

if (!tileThere(tilex-tileDist, tiley)) {

return("left");

}}

// Проверяем, есть ли элемент мозаики справа,

if (tilex > tileDistM) {

if (!tileThere(tilex+tileDist, tiley)) {

return("right");

}} // Проверяем, есть ли элемент мозаики сверху. if (tiley > tileDist) { if (!tileThere(tilex, tiley-tileDist)) { return)"above");

}}

// Проверяем, есть ли элемент мозаики снизу,

if (tiley > tileDistM) {

if (!tileThere(tilex, tiley+tileDist)) {




Почти весь код этой игры находится в основной временной шкале. Ролик начинается с вызова функции initGame, которая создает список 18 пар карт, случайным образом выбирает карты из первого списка, а затем помешает их во второй список, чтобы перемешать колоду карт.
Потом функция создает 36 карт. Каждый клип автоматически начинается с того, что карта помещается рубашкой вверх, а свойству клипа ("picture") присваивается номер картинки, которую карта будет представлять.

initGame();

stop();

function initGame() {

// Создаем отсортированный список карт.
cardsListOrdered = [];

cardsListOrdered.push(i,i);
}

// Список перемешанных карт.

cardsListSorted = [];

while (cardsListOrdered.length > 0) {

r = int(Math.random()*cardsListOrdered.length);

cardsListSorted.push(cardsListOrdered[r]};

cardsListOrdered.splice(r,1);}

// Создаем клипы карт и определяем их положение и картинки,
х = 0; У = 'О; for(i=0;i

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

_root["card"+i].picture = cardsListSorted[i];

_root["card"+i]._x = x*60+200;

_root["card"+i]._y = y*60+50;

// Переходим к следующей карт

х++;

if (х > 5) {

х = 0;

У++;
}}

// Располагаем эти две карты рубашками вверх,

firstclip.gotoAndStop(1);

secondclip.gotoAndStop(1);

firstclip = 0; secondclip = 0;

firstdip = 0;
}

Обратите внимание, что с помощью команды push в массив можно добавить сразу более одного элемента, Например, выражение myArray.push(7,12) добавит в массив myArray числа 7 и 12.

Функция initGame заканчивается тем, что обнуляется переменная firstclip. В этой переменной содержится ссылка на карту, по которой щелкнули первой. Когда щелкают по клипу, кнопка внутри этого клипа отреагирует и на основную временную шкалу с помощью функции clickCard будет добавлена ссылка к клипу.
Функция clickCard может выполнить одну из 3-х функций. Если значение переменной firstclip равно 0, ей присваивается клип, по которому щелкнули, карта переворачивается, то есть программа переходит к кадру, содержащему соответствующую картинку.
Если в переменной firstclip хранится ссылка на некий клип, значит, одна карта уже перевернута. В этом случае программа пepeвopaчивает и вторую карту, присваивает переменной secondclip значение клипа и сравнивает два клипа. Если они совпадают, оба клипа удаляются.
Третье условие, которое, на самом деле, проверяется до двух первых, возникает тогда, когда игрок щелкает по одной и той же карте дважды. В таком случае значение переменной clip будет равно firstclip. Карта просто снова переворачивается и значение firstclip обнуляется.
Прежде чем проверить эти три условия, функция clickCard определяет, перевернуты ли уже две карты. Если да, значит, игрок уже выбрал две карты, но они не совпали. Прежде чем перевернуть следующую карту, эти две карты поворачиваются рубашками вверх




В начале ролика задаются функции roundNum и score. Переменная roundNum содержит номер картинки, которая должна появиться.

// Начинаем с первой картинки.
roundNum = 1;
score = 0;
stop();

Игра начинается, когда пользователь нажимает кнопку в первом кадре. Все коды содержатся на главной временной шкале, в первом слое. Нажатие кнопки вызывает функцию setUpRound.
После того как функция отправляет ролик к кадру "Play", она определяет два клипа. Содержащийся в каждом из них клип "picture" устанавливается в кадр, определяемый переменной roundNum.
После этого выбирается случайное место на картинке. Это происходит с учетом того, что площадь сегмента 36x36, таким образом, это случайное место должно быть не ближе 18 пикселов от края изображения.
В клипе "maskedPicture" положение картинки изменяется таким образом, что случайное место располагается в позиции (0,0), на которой располагается квадрат-маска. Таким образом, если сегмент выбрана из позиции (100, 150), то увеличенная картинка должна быть сдвинута на -100 пикселов по горизонтали и на -150 - по вертикали.
В клипе "fullPicture" картинка остается неподвижной, а движется клип "button", пока не займет нужное положение. Свойство _alpha равно 0, чтобы кнопка была невидимой.

Вместо того, чтобы задавать свойство _alpha клипа равным 0, попробуйте задать его равным 25 во время отладки программы. Поскольку клип будет видимым, вам будет легче понять, что игра работает.

function setUpRound(pictureNum) {

// Переходим к кадру игры. gotoAndStop("Play");

// Выбираем картинку в обоих клипах.

fullPicture.picture.gotoAndStop(pictureNum);

maskedPicture.picture.gotoAndStop(pictureNum);

// Задаем случайное положение картинки.

w = fullPicture._width;

h = fullPicture._height;

x = Math.random()*(w-36)+18;

у = Math.random))*(h-36)+18;

// Передвигаем картинку под маской в это положение.

maskedPicture.picture._x = -х;

maskedPicture.picture. _y = -у;

// Задаем координаты кнопки.
fullPicture.button._x = х;



Содержание раздела