Статьи

Создайте классическую игру со змеями в ActionScript 2.0

Что ж, мы приближаемся к концу 2009 года, и как всегда, эти последние дни декабря — время для размышлений, воспоминаний и ностальгии. В Activetuts + мы стремимся быть дальновидными, идти в ногу со временем и использовать технологии. Сказав это, также важно, чтобы мы обратились ко всем нашим читателям, поэтому для тех из вас, кто еще не сделал прыжок, давайте закончим год с небольшим количеством ActionScript 2.0!

В этом уроке вы создадите простую игру змей AS2.




Запустите Flash и нажмите « Создать новый: Flash-файл» (Actionscript 2.0) . Вы можете установить размер сцены на то, что вам нравится — я установил мой на 500 х 350. Я советую вам установить частоту кадров 30 кадров в секунду.

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

Первое, что мы создадим, — это яма для змеи, чтобы бродить вокруг. Создайте прямоугольник размером 400 x 250 и превратите его в видеоклип. Обязательно обратите внимание на точку регистрации; сделать это в верхнем левом углу.

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

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

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

Введите «голову» мувиклипа. Оказавшись внутри, добавьте эту строку кода в первый и единственный кадр:

1
stop();

Теперь нарисуйте небольшое лицо на голове змеи, чтобы вы могли отличить его от других частей тела.

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

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

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

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

Поскольку это динамическое текстовое поле, мы должны будем встроить шрифт. Нажмите кнопку внедрения на панели свойств (где вы только что определили переменную и стиль текста).

Вы увидите всплывающее окно, показанное ниже. Убедитесь, что вы выбрали цифры [0..9] .

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

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

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

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

Преобразуйте его в мувиклип и присвойте ему имя экземпляра. Для выравнивания я установил точку регистрации по центру.

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

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

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

Поздравляем, вы создали все визуальные объекты, необходимые для игры в змею. Теперь перейдем к коду!

Прежде чем я добавлю кусок кода в вас, я скажу вам, что с ним делать. Весь код в этом уроке помещается в первый и единственный кадр вашего фильма. Не нужно прикреплять его к кнопкам или чему-либо еще. Теперь взгляните на этот фрагмент ActionScript.

Примечание редактора: извините за эти люди, подсветка синтаксиса кода не хочет отображать этот конкретный кусок ActionScript в FireFox. Посмотрите на код здесь .

Короче говоря, этот фрагмент кода делает следующее. Во-первых, оригинальная часть тела сделана невидимой — мы скоро будем использовать дубликаты. Некоторые значения по умолчанию (пере) установлены, все дубликаты, оставшиеся от предыдущей игры, будут удалены. В цикле do {} while () food и bodypart0 (head) задаются координаты x и y. Если это соответствует (таким образом, они находятся в той же самой точке), им дают новую координату, пока у нас больше нет соответствия. Затем создаются массивы, в которых мы будем содержать координаты x и y частей тела.

В этом фрагменте кода мы создаем объект 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);

Функция здесь большая. Он выполняется на каждом кадре, но на самом деле делает что-то каждые 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++
    }
}

Это приятно и просто. Он выполняет действия, которые необходимо предпринять, когда змея умирает: счет должен быть определен во всплывающем окне, показано всплывающее окно, показано мертвое лицо змеи и переменная игры установлена ​​в 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;
}

Приведенная ниже функция запускается в функции 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
}

Эта функция просто проверяет, соответствуют ли введенные координаты какой-либо из координат частей тела змеи. Если 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;
}

Как последний бит кода; нам все еще нужно добавить функцию выпуска на кнопку внутри всплывающего окна! При нажатии будет активирована функция newgame (), которую мы обсуждали ранее. Помните: весь код этого урока идет в первом и единственном кадре вашего фильма — включая этот бит о кнопке!

1
2
3
popup.againbutton.onRelease = function() {
    newgame()
}

Я уверен, что вы делали это раньше, но сейчас самое время: нажмите Ctrl + Enter (или Cmd + Enter на Mac), чтобы скомпилировать SWF-файл и проверить свою игру. Теперь он должен быть полностью функциональным. Наслаждайтесь!

Если вы сделали это полностью здесь; Поздравляем! Вы создали довольно захватывающую игру, в AS2! Конечно, игра никогда не заканчивается. Всегда есть место для творческого совершенствования.

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

Спасибо за чтение моего урока. Надеюсь, вам понравилось так же, как и мне.