Что ж, мы приближаемся к концу 2009 года, и как всегда, эти последние дни декабря — время для размышлений, воспоминаний и ностальгии. В Activetuts + мы стремимся быть дальновидными, идти в ногу со временем и использовать технологии. Сказав это, также важно, чтобы мы обратились ко всем нашим читателям, поэтому для тех из вас, кто еще не сделал прыжок, давайте закончим год с небольшим количеством ActionScript 2.0!
В этом уроке вы создадите простую игру змей AS2.
Шаг 1: Настройка файла
Запустите Flash и нажмите « Создать новый: Flash-файл» (Actionscript 2.0) . Вы можете установить размер сцены на то, что вам нравится — я установил мой на 500 х 350. Я советую вам установить частоту кадров 30 кадров в секунду.

Теперь вы можете либо решить выполнить этот шаг и самостоятельно нарисовать необходимые видеоклипы, либо пропустить и использовать созданные мной. Если вы хотите использовать те, которые я создал, вы можете найти их в исходном файле . Просто добавьте их в библиотеку и перетащите на сцену. Если вы собираетесь рисовать самостоятельно: вам не нужно буквально рисовать так же, как я, но убедитесь, что вы придерживаетесь размеров.
Шаг 2: Создайте Яму Змеи
Первое, что мы создадим, — это яма для змеи, чтобы бродить вокруг. Создайте прямоугольник размером 400 x 250 и превратите его в видеоклип. Обязательно обратите внимание на точку регистрации; сделать это в верхнем левом углу.

Удостоверьтесь, что вы называете «змеиную яму» имя экземпляра «змеиная яма» и выравниваете его немного выше центра сцены (чтобы мы могли добавить текст под ним позже, не портя эстетику).

Шаг 3: Создай голову змеи
Нарисуйте квадрат (возможно, с закругленными углами) без рамки (размер 25 х 25) и скопируйте его, чтобы у вас было 2 абсолютно одинаковых. Конвертируйте один из них в видеоклип. Опять же, обратите внимание на регистрацию в верхнем левом углу.

Убедитесь, что вы дали ему имя экземпляра bodypart0 и дважды проверьте, что его размер составляет 25 x 25.

Шаг 4: Голова Змеи ActionScript
Введите «голову» мувиклипа. Оказавшись внутри, добавьте эту строку кода в первый и единственный кадр:
|
1
|
stop();
|
Теперь нарисуйте небольшое лицо на голове змеи, чтобы вы могли отличить его от других частей тела.

Шаг 5: Дополнительное лицо
Добавьте второй кадр в видеоклип «Голова», и на этом кадре нарисуйте грустное или мертвое лицо.

Шаг 6: Создайте другие части тела
Помните дубликат квадрата, который вы создали на шаге 3? Мы собираемся преобразовать его в видеоклип сейчас. Обратите внимание на точку регистрации еще раз.

Убедитесь, что вы дали ему имя экземпляра bodypart .

Шаг 7: Создайте поле счета
Создайте динамическое текстовое поле под правым углом змеиной ямы. Убедитесь, что вы установили переменную для оценки . Также убедитесь, что поле достаточно широкое для нескольких символов и выровнено вправо. Остальные настройки можно настроить в соответствии со своим стилем — я использовал Tahoma 24 Bold.

Шаг 8: встраивание шрифта
Поскольку это динамическое текстовое поле, мы должны будем встроить шрифт. Нажмите кнопку внедрения на панели свойств (где вы только что определили переменную и стиль текста).
Вы увидите всплывающее окно, показанное ниже. Убедитесь, что вы выбрали цифры [0..9] .

Шаг 9: создать еду
Нарисуйте синий круг без рамки, размером 25 x 25, а затем сотрите центр, используя инструмент ластик. Теперь выберите оставшийся круг и преобразуйте его в видеоклип. Кроме того, вы можете создать для себя кусок пищи, если он остается 25 х 25.

Шаг 10: имя пищевого экземпляра
Дайте еде удивительное название еды . Дважды проверьте, что его размер составляет 25 х 25.

Шаг 11: Добавление инструкций
Слева внизу яма со змеей казалась хорошим местом для установки указателей. Просто введите статический текст «Используйте клавиши со стрелками для перемещения» здесь. Я знаю, клавиши со стрелками еще не работают, но мы скоро к этому вернемся. Я обещаю!

Шаг 12: Создание всплывающего окна
Нарисуйте белый квадрат (пока что за пределами сцены) и добавьте текст «Ты умер!» к этому. Это всплывающее окно, которое мы отобразим после того, как кто-то проиграл игру.
Преобразуйте его в мувиклип и присвойте ему имя экземпляра. Для выравнивания я установил точку регистрации по центру.


Шаг 13: Оценка
Дважды щелкните по всплывающему окну, которое вы только что создали, чтобы войти в него. Оказавшись внутри, создайте динамическое текстовое поле (переменная = оценка ) и кнопку, читающую текст Play Again .

Кнопка должна получить имя экземпляра снова .

Внутри кнопки вы можете создать немного более темное состояние «Вверх» и еще более темное «Вниз».

Поздравляем, вы создали все визуальные объекты, необходимые для игры в змею. Теперь перейдем к коду!
Шаг 14: Функция Newgame
Прежде чем я добавлю кусок кода в вас, я скажу вам, что с ним делать. Весь код в этом уроке помещается в первый и единственный кадр вашего фильма. Не нужно прикреплять его к кнопкам или чему-либо еще. Теперь взгляните на этот фрагмент ActionScript.
Примечание редактора: извините за эти люди, подсветка синтаксиса кода не хочет отображать этот конкретный кусок ActionScript в FireFox. Посмотрите на код здесь .
Короче говоря, этот фрагмент кода делает следующее. Во-первых, оригинальная часть тела сделана невидимой — мы скоро будем использовать дубликаты. Некоторые значения по умолчанию (пере) установлены, все дубликаты, оставшиеся от предыдущей игры, будут удалены. В цикле do {} while () food и bodypart0 (head) задаются координаты x и y. Если это соответствует (таким образом, они находятся в той же самой точке), им дают новую координату, пока у нас больше нет соответствия. Затем создаются массивы, в которых мы будем содержать координаты x и y частей тела.
Шаг 15: захват направления
В этом фрагменте кода мы создаем объект keyListener, который мы прикрепляем к Key, который представляет клавиатуру. Всякий раз, когда нажимается клавиша, запускается функция onKeyDown. Из функции getCode () мы получим, какая клавиша была нажата, а затем определим направление в соответствии с этим. Мы сохраним это в переменной direction для дальнейшего использования. Помните: весь код этого урока идет в первом и единственном кадре вашего фильма.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
keyListener = new Object();
keyListener.onKeyDown = function () {
keycode = Key.getCode()
if (keycode == 37) {
direction = ‘left’
}
else if (keycode == 38) {
direction = ‘up’
}
else if (keycode == 39) {
direction = ‘right’
}
else if (keycode == 40) {
direction = ‘down’
}
};
Key.addListener(keyListener);
|
Шаг 16: функция onEnterFrame
Функция здесь большая. Он выполняется на каждом кадре, но на самом деле делает что-то каждые 5 кадров. Он проверяет, не выходит ли змея за пределы коробки, а затем перемещает все части тела в их новое положение. Затем он проверяет, есть ли еда, и затем ест ее, используя функцию eat (), о которой мы поговорим позже. Затем он проверяет, врезается ли змея в стену, и, наконец, проверяет, кусает ли себя змея в хвосте. Все эти функции будут добавлены в ближайшее время (insideSnake (), dead () и так далее). Помните: весь код этого урока идет в первом и единственном кадре вашего фильма.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
this.onEnterFrame = function () {
if (game) {
if (framecount/5 == Math.ceil(framecount/5)) {
if (!(bodypart0._y <= snakepit._y && direction == ‘up’) && !(bodypart0._y+bodypart0._height >= snakepit._y+snakepit._height-2 && direction==’down’) && !(bodypart0._x+bodypart0._width >= snakepit._x+snakepit._width — 2 && direction ==’right’) && !(bodypart0._x <= snakepit._x && direction == ‘left’))
{
bodypartsy[0] = bodypart0._y;
bodypartsx[0] = bodypart0._x;
for (i=bodypartsy.length-1;i > 0; i—) {
eval(‘bodypart’+i)._y = bodypartsy[(i-1)]
eval(‘bodypart’+i)._x = bodypartsx[(i-1)]
bodypartsy[i] = eval(‘bodypart’+i)._y
bodypartsx[i] = eval(‘bodypart’+i)._x
}
}
if (food._x == bodypart0._x && food._y == bodypart0._y) {
eat()
}
if (direction) {
if (direction == ‘up’) {
if (bodypart0._y <= snakepit._y) {
dead()
}
else {
bodypart0._y-= bodypart0._width
}
}
else if (direction == ‘down’) {
if (bodypart0._y+bodypart0._height >= snakepit._y+snakepit._height-2) {
dead()
}
else {
bodypart0._y+= bodypart0._width
}
}
else if (direction == ‘right’) {
if (bodypart0._x+bodypart0._width >= snakepit._x+snakepit._width — 2) {
dead()
}
else {
bodypart0._x+= bodypart0._width
}
}
else if (direction == ‘left’) {
if (bodypart0._x <= snakepit._x) {
dead()
}
else {
bodypart0._x-= bodypart0._width
}
}
}
if (game) {
if (insideSnake(bodypart0._x,bodypart0._y,true)) {
dead()
}
}
}
framecount++
}
}
|
Шаг 17: функция dead ()
Это приятно и просто. Он выполняет действия, которые необходимо предпринять, когда змея умирает: счет должен быть определен во всплывающем окне, показано всплывающее окно, показано мертвое лицо змеи и переменная игры установлена в false (по окончании игры).
|
1
2
3
4
5
6
7
|
function dead() {
popup.score = ‘score: ‘+(bodypartsx.length-1)
popup.swapDepths(this.getNextHighestDepth())
popup._visible = true
bodypart0.gotoAndStop(2)
game = false;
}
|
Шаг 18: функция eat ()
Приведенная ниже функция запускается в функции onEnterFrame, которую мы обсуждали ранее, когда еду собирают. Сначала он дублирует часть тела змеи, а затем размещает ее на месте последней части тела (так, чтобы она соединялась в строке в следующем кадре). Его координаты добавляются к координатам, содержащим массивы, и пища перемещается (где-то не внутри змеи!). Также счет обновляется.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
function eat() {
duplicateMovieClip(bodypart,’bodypart’+bodypartsy.length,this.getNextHighestDepth())
bodypart0.swapDepths(this.getNextHighestDepth())
eval(‘bodypart’+bodypartsy.length)._y = eval(‘bodypart’+(bodypartsy.length-1))._y
eval(‘bodypart’+bodypartsx.length)._x = eval(‘bodypart’+(bodypartsy.length-1))._x
bodypartsy.push(eval(‘bodypart’+bodypartsy.length)._y)
bodypartsx.push(eval(‘bodypart’+bodypartsx.length)._x)
do {
food._x = snakepit._x + Math.floor(((snakepit._width-food._width)/food._width)*Math.random())*food._width
food._y = snakepit._y + Math.floor(((snakepit._height-food._height)/food._height)*Math.random())*food._height
} while(insideSnake(food._x,food._y));
score = bodypartsx.length-1
}
|
Шаг 19: функция insideSnake ()
Эта функция просто проверяет, соответствуют ли введенные координаты какой-либо из координат частей тела змеи. Если skiphead установлен в true, ему разрешено совпадать с координатами головы (при проверке, кусает ли голова хвост, это удобно).
|
01
02
03
04
05
06
07
08
09
10
11
12
|
function insideSnake(xneedle, yneedle,skiphead) {
if (skiphead) { startat = 1;
else { startat = 0;
for (q=startat; q<bodypartsx.length; q++) {
if (bodypartsx[q] == xneedle) {
if (bodypartsy[q] == yneedle) {
return true;
}
}
}
return false;
}
|
Шаг 20: всплывающая кнопка
Как последний бит кода; нам все еще нужно добавить функцию выпуска на кнопку внутри всплывающего окна! При нажатии будет активирована функция newgame (), которую мы обсуждали ранее. Помните: весь код этого урока идет в первом и единственном кадре вашего фильма — включая этот бит о кнопке!
|
1
2
3
|
popup.againbutton.onRelease = function() {
newgame()
}
|
Шаг 21: Завершение всего этого
Я уверен, что вы делали это раньше, но сейчас самое время: нажмите Ctrl + Enter (или Cmd + Enter на Mac), чтобы скомпилировать SWF-файл и проверить свою игру. Теперь он должен быть полностью функциональным. Наслаждайтесь!
Вывод
Если вы сделали это полностью здесь; Поздравляем! Вы создали довольно захватывающую игру, в AS2! Конечно, игра никогда не заканчивается. Всегда есть место для творческого совершенствования.
Если у вас есть какие-либо вопросы или предложения, не стесняйтесь комментировать ниже. Кроме того, мне очень любопытно увидеть файлы, созданные в результате этого урока — я хотел бы видеть ссылку в комментариях!
Спасибо за чтение моего урока. Надеюсь, вам понравилось так же, как и мне.

