Вот думал я, что бы такое сделать... Поглядел свои старые запасы исходников...
Совсем не для новичков. Но, к счастью, попалась одна игрушка...
Итак, сегодня делаем ЗМЕЙКУ!
Обычная змейка... Коих много. Итак. Открыли Флэш, установили размер документа
на 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;
}
// 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 недели у меня все-же получиться. Если
нет... Не отписывайтесь... Всего месяц и вы не пожалеете. Если есть предложения
какие, рассмотрю с удовольствием.