Отправляет email-рассылки с помощью сервиса Sendsay

Flash MX от А до Я

  Все выпуски  

Создание игр на Flash MX


Информационный Канал Subscribe.Ru

Рассылка "Создание игр на Flash MX"
FAQ

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

Итак, сегодня делаем ЗМЕЙКУ!

Обычная змейка... Коих много. Итак. Открыли Флэш, установили размер документа на 360х360 пикселей, цвет фона произвольный. На главной сцене сделали 2 слоя.

В actions 1го фрейма 1го слоя пишем следующее...

// Initialize values
posx = new Array();
posy = new Array();
snakelength = 10;
x = 210;
for (t=0; t<snakelength; t++) {
posx[t] = x;
posy[t] = 190;
x += 10;
}
init = 1;
foods = 0;
score = 0;

В этом фрейме происходит инициализация 2х массивов координат частей змейки, плюс некоторые рабочие переменные, вроде score, init и food. Здесь присваиваются только значения. Более ничего интересного.

Во втором фрейме 1го слоя начинаем рисовать. Рисуем голову змейки. Для этого рисуем круг размером 10х10 пикселей. Рисунок конвертируем в кнопку. В Actions кнопки нужно вписать:

on (keyPress "<Up>") {
if (up==0) {
up = 1;
if (left==1) {
headinhead._rotation = 90
} else {
headinhead._rotation = -90
}
left = 0;
}
}
on (keyPress "<Down>") {
if (up==0) {
up = -1;
left = 0;
}
}
on (keyPress "<Left>") {
if (left==0) {
up = 0;
left = 1;
}
}
on (keyPress "<Right>") {
if (left==0) {
up = 0;
left = -1;
}
}

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

Кнопку конвертируем еще раз, только уже в клип (Movie Clip). Важно! При конвертации не забудь указать регистрацию клипа в верхнем левом углу. Обзываем клип как "head" (в поле Имя вводиться без ковычек). Двойной щелчок по клипу и мы внутри. В Actions единственного фрейма напишем:

up=0;
left=1;

Это придаст голове направление.

Переходим на главную сцену. Выделяем клип head и ставим его точно в точку с координатами (200,190). Так нужно.

Там же, во втором фрейме 1го слоя рисуем еще один кружочек размером 10х10 и конвертируем в клип с регистрацией в верхнем левом углу. В Name пишем "body". Та же самая процедура и для клипа, который назовем "food". Теперь вынесем клипы за рабочую область документа. Почти все готово. В Actions 2го клипа 1го слоя пишем:

// Draw initial body
if (init == 1) {
for (t=0; t<snakelength; t++) {
nn = "body" add t;
duplicateMovieClip ("body", nn, t);
}
init = 0;
}

// move head
if (head.up == 1) {
by = head._y;
bx = head._x;
head._y -= 10;
}
if (head.up == -1) {
by = head._y;
bx = head._x;
head._y += 10;
}
if (head.left == 1) {
by = head._y;
bx = head._x;
head._x -= 10;
}
if (head.left == -1) {
by = head._y;
bx = head._x;
head._x += 10;
}

// move body
for (t=snakelength-1; t>0; t--) {
posx[t] = posx[t-1];
posy[t] = posy[t-1];
}
posx[0] = bx;
posy[0] = by;

// draw body
for (t=0; t<snakelength; t++) {
nn = "body" add t;
setProperty (nn, _x, posx[t]);
setProperty (nn, _y, posy[t]);
}

// Check for border collision
if ((head._x<10) || (head._x>340) || (head._y<50) || (head._y>340)) {
gotoAndStop (4);
}

// Check for body collision
for (t=2; t<snakelength; t++) {
if ((head._x == posx[t]) and (head._y == posy[t])) {
gotoAndStop (4);
}
}

// Check for food collision
if ((food._x == head._x) && (head._y == food._y)) {
foods = 0;
score = Number(score)+9;
duplicateMovieClip("body","body" add snakelength,snakelength);
snakelength += 1;
posx[snakelength-2] = posx[snakelength-3];
posy[snakelength-2] = posy[snakelength-3];
}

// Add food
if (foods != 1) {
x = random(300)+50;
y = random(300)+50;
x /= 10;
y /= 10;
x = int(x);
y = int(y);
x *= 10;
y *= 10;
food._x = x;
food._y = y;
foods = 1;
}

Нехилый код... Я вспоминаю тетрис, там раз в десять длиньше... Ну, ничего, наберетесь опыта, я его напишу.

// Draw initial body - не что иное, как создание тела змейки. Оно осуществляется копированием исходного клипа body. Копии получают имена отличающиеся от оригинала на константу X и имеют имена bodyX.

// move head - в зависимости от переменных up и left осуществляется передвижение головы.

// move body и // draw body - вычисляется и отрисовавается новое положение для каждой части тела змейки.

Дальше - просто. Проверка, не столкнулась ли голова с бордюром:), или с телом или с "едой".

Если переменная food равна 1 то ничего не происходит. Как только голова сталкивается с едой, food становиться 0 и происходит перемещение едя в другое место (случайным образом).

Сейчас несколько подготовительных действий.

У вас должно быть 2 фрейма на слое 1. Первый - пустой, второй - полный. Оба со скриптом. На слое 1 кликаем правой кнопкой мыши на 4ом фрейме. В меню выбираем Вставить Фрейм (Insert Frame).

Поработаем со вторым слоем. В первых 2х фреймах не пишем ничего. 3й фрейм конвертируем в чистый кейфрейм (Convert to Blank Keyframe) и в Actions пишем:

gotoAndPlay(2);

Это зациклит нашу игру.

В четвертом фрейме второго слоя рисуем кнопку (вставляем из библиотеки). В Actions кнопки пишем:

on (press, keyPress "<Enter>") {
for (t=0; t<snakelength; t++) {
nn = "body" add t;
removeMovieClip(nn);
}
gotoAndPlay(1);
}

Если нажата кнопка или клавиша Enter, то осуществляется переход на 1ый фрейм главной сцены. В цикле всего-навсего происходит удаление клипов, которые создались по ходу игры.

Пожалуй, все. Игра готова. Запускай!

Я тут подумал немного... В принципе, если написать в actions клипа head вот так:

onClipEvent (load) {
_x = 210;
_y = 190;
}

То нет необходимости точно позиционировать клип. Он сам встанет на место при загрузке. Но обязательно нужно, чтобы клип находился в точке (210, 190), т.к. расстановка клипов идет по заданным координатам, а не наоборот...

Ну, как вам этот выпуск? Понравился? Нет? Что скажите? Чего не хватает? Может есть предложения по оформлению? Пишите. Я целиком и полностью на вас надеюсь.

Как обычно, исходник змейки лежит вот здесь http://mite.by.ru/snake.rar
Кроме того, вот еще один файлик, который заинтересует тех, кто хочет сделать курсор в виде змейки... Код не особо сложный и если вы разобрались со змейкой, то с курсором и подавно. Это, так сказать, эксклюзив http://mite.by.ru/zmka.rar

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

____________________________________________________________

С уважением, mite.

http://mite.by.ru/
mailto:mitemail@mail.ru
ICQ 168070919

Архив рассылки http://subscribe.ru/archive/comp.soft.prog.makeflashgame/



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное