Статьи

Создайте динамическое меню флеш игры: Аккордеон

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


Посмотрите на меню, которое мы будем строить:

Очевидно, что в полной игре разные экраны меню будут содержать разные кнопки, текст и пункты подменю!


Прежде чем мы узнаем, что такое динамическое меню, мы должны сначала узнать, что такое статическое меню.

Статическое меню можно описать определениями двух слов, из которых оно состоит: «статическое», означающее отсутствие изменений, и «меню», означающее список доступных параметров или вариантов. Поэтому статическое меню имеет интерфейс опций или вариантов, в котором нет изменений.

И наоборот, слово «динамический» означает постоянно вызывать изменения в системе или процессе. Таким образом, в самых простых сроках динамическое меню постоянно обновляет интерфейс заданных опций или вариантов.


Первое, что нам нужно создать, — это новый Flash-файл (ActionScript 3.0), установите его ширину 650 пикселей и высоту 350 пикселей, а количество кадров в секунду — 60. Вместо изменения цвета фона оставьте его белым ; позже в уроке мы создадим фон.

Теперь, когда мы настроили базовый файл Flash, мы можем сохранить его; Вы можете назвать свое как угодно. Я только что назвал мой MenuAccordion.fla.

В следующем разделе мы создадим восемь мувиклипов, необходимых для меню; Вот список всех цветов и их шестнадцатеричных кодов, которые будут использоваться на протяжении всего урока:

  • Белый — #FFFFFF
  • Золото — #E8A317
  • Светло-золотой — #FBB917
  • Синий — #1569C7
  • Голубой — #1389FF
  • Зеленый — #347235
  • Светло-зеленый — #3E8F1B
  • Красный — #990000
  • Светло-красный — #C10202
  • Матовый серый — #222222

Для начала нам нужно создать один основной цвет фона, четыре «бара» мувиклипа (это те, на которых будут щелкать) и четыре фона мувиклипа (они будут выдвигаться после нажатия на панель).

Сначала щелкните правой кнопкой мыши по сцене и выберите « Сетка» , затем выберите « Показать сетку» — по умолчанию она создаст квадратную сетку 10 на 10 пикселей по всей сцене. Чтобы сделать вашу жизнь проще, снова щелкните правой кнопкой мыши и выберите « Привязка»> «Привязать к сетке» . Теперь мы готовы начать рисовать!

Выберите инструмент «Прямоугольник» и нарисуйте матово-серый фон по всей сцене. Назовите слой Background и заблокируйте его. Затем создайте новый слой и назовите его Menu . Ваш график и сцена должны выглядеть примерно так:

первый взгляд на график
первый взгляд на сцену

Далее мы создадим один бар MovieClip; чтобы упростить задачу, мы просто продублируем его, сформировав четыре мувиклипа и изменив цвет каждого из них.

Выберите инструмент прямоугольник еще раз, и нарисуйте прямоугольник 30 на 350 пикселей без обводки. Щелкните правой кнопкой мыши заливку и выберите « Преобразовать в символ …» . Назовите его goldBar , убедитесь, что его тип — MovieClip, а точка регистрации находится в верхнем левом углу . Дважды щелкните мувиклип на сцене, чтобы редактировать его.

Щелкните правой кнопкой мыши первый ключевой кадр на временной шкале и перейдите к действиям , введите простой stop(); команда для предотвращения циклического перемещения мувиклипа по кадрам. Затем щелкните правой кнопкой мыши второй кадр и выберите « Вставить ключевой кадр» . Это зависит от вас, что вы хотели бы написать в каждой заливке; Единственное, что нужно помнить, это то, что если вы пишете под углом 90 градусов, текст может выглядеть невидимым, если у вас установлен динамический текст. Лично я просто разбил текст на части, пока он не стал заполнением, и нарисовал стрелку, указывающую противоположные направления на каждом кадре:

Сравнение кадров золотого слитка

Теперь, когда у нас закончена одна строка, мы можем щелкнуть ее правой кнопкой мыши в библиотеке и выбрать Duplicate Symbol …. Сделайте три копии и назовите их blueBar, greenBar и redBar соответственно. Затем просто измените их цвета заливки и измените текст. Вуаля! У нас есть четыре бара MovieClips.

Теперь мы можем начать на фоне мувиклипов, которые мы будем создавать и дублировать аналогичным образом. Выберите инструмент «Прямоугольник» еще раз и нарисуйте прямоугольник размером 560×350 пикселей . Преобразуйте его в символ, назовите его goldBackground и убедитесь, что типом является MovieClip, а регистрация находится в верхнем левом углу . Затем просто продублируйте его три раза и назовите новые MovieClips blueBackground , greenBackground и redBackground соответственно.

Ваши прямоугольники должны выглядеть очень просто, например так:

Золотой фон

Я обещаю, что нужно создать еще один мувиклип! Перейдите в меню « Вставка» и выберите « Новый символ» ; назовите его menuAccordionMC , установите тип MovieClip и поместите точку регистрации в верхнем левом углу (потому что это было и в наших последних MovieClip). Затем установите флажок « Экспорт для ActionScript» : имя класса должно быть MenuAccordionMC с заглавной буквой в начале.


В предыдущем разделе мы создали все необходимые мувиклипы, и теперь нам нужно их расположить!

Удалите любые MovieClips на сцене, если они все еще там. Откройте ваше меню AcordionMC из библиотеки и создайте еще семь слоев на его временной шкале. Теперь назовите их в следующем порядке сверху вниз:

  • слиток золота
  • blueBar
  • greenBar
  • redBar
  • goldBackground
  • blueBackground
  • greenBackground
  • redBackground

Теперь перетащите каждый мувиклип из библиотеки на соответствующий слой. Самый простой способ расположить все это — заблокировать все слои, кроме того, с помощью мувиклипа, который вы в данный момент размещаете.

Начните с goldBar и установите его координаты x и y равными (0,0). Затем синяя полоса с координатами (30,0), затем зеленая полоса с (60,0) и, наконец, красная полоса с (90,0).

Время для фонов: координаты goldBackground (-530,0), координаты blueBackground (-500,0), координаты greenBackground (-470,0) и координаты redBackground (-440,0).

Ваш мувиклип должен выглядеть следующим образом, а координата (0,0) должна находиться в верхнем левом углу мувиклипа goldBar, где на изображении присутствует белый плюс:

Что вы должны увидеть в меню AccordionMC

Прежде чем мы сможем начать кодирование, нам нужно сделать еще одну вещь: дать восемь внутренних имен экземпляров MovieClips.

Откройте меню menuAccordionMC в последний раз, затем выберите каждый мувиклип и сделайте так, чтобы имя его экземпляра совпадало с именем мувиклипа. Таким образом, имя экземпляра goldBar будет goldBar, имя экземпляра greenBackground будет greenBackground и так далее. После того, как это сделано, мы можем начать кодирование, которое довольно легко понять!


Перейдите в свойства вашего Flash-файла и назовите класс документа MenuAccordion . Теперь создайте новый файл ActionScript 3.0, поместите в него следующий код и сохраните файл как MenuAccordion :

01
02
03
04
05
06
07
08
09
10
11
package {
    import flash.display.MovieClip;
    import flash.events.Event;
 
    public class MenuAccordion extends MovieClip {
        public var menuAccordionMC:MenuAccordionMC = new MenuAccordionMC();
        public function MenuAccordion() {
            addChild(menuAccordionMC);
        }
    }
}

Здесь мы сначала импортируем то, что нам нужно (в данном случае только классы MovieClip и Event). Затем мы добавляем переменную для нашего menuAccordionMC, затем в конструкторе добавляем MovieClip к сцене в точке (0,0).

Это весь код, который нам понадобится для класса документа; Теперь давайте создадим новый файл ActionScript 3.0 для MovieClip и сохраним его как MenuAccordionMC.as .

Чтобы настроить класс MenuAccordionMC, введите следующий код — я вскоре объясню переменные и прослушиватели событий:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
     
    public class MenuAccordionMC extends MovieClip{
        public var activeColor:String = new String();
        public var speed:Number = new Number();
         
        public function MenuAccordionMC(){
            activeColor = «none»;
            speed = 10;
             
            addEventListener(MouseEvent.CLICK, accordionClick);
            addEventListener(Event.ENTER_FRAME, accordionMove);
        }
    }
}

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

Первый прослушиватель событий предназначен для MouseEvent.CLICK и будет вызывать функцию accordionClick, когда в любом месте нашего меню щелкают. Слушатель второго события добавляет функцию accordionMove и будет вызываться каждый кадр.

Теперь мы создадим две функции для слушателей событий. Поместите следующий код сразу после закрывающей фигурной скобки для конструктора.

1
2
3
4
5
6
public function accordionClick(event:MouseEvent):void {
 
}
public function accordionMove(event:Event):void {
             
}

Два класса теперь настроены, так что пора начинать помещать код в эти функции!


Эта функция относительно проста и содержит только оператор if, else . Начните с записи следующего в функции:

1
2
3
4
5
if(event.target.currentFrame==1){
 
}else{
 
}

Многие люди не знакомы с event.target , поэтому я кратко объясню это. В двух словах, он просто направляет код к цели события — поэтому, если щелкнуть blueBar, event.target будет равен blueBar .

Это означает, что оператор if проверяет, равен ли currentFrame бара 1, и если да, то он выполняет этот код; если нет, он выполнит код во вторых фигурных скобках. Теперь мы можем продолжить и изменить выражение if, else на следующее:

1
2
3
4
5
6
7
if(event.target.currentFrame==1){
    event.target.gotoAndStop(2);
    activeColor = event.target.name;
}else{
    event.target.gotoAndStop(1);
    activeColor = «none»;
}

Новые строки очень просты : currentFrame цели изменяется на второй или первый кадр, а переменной activeColor задается имя цели или «none». Вот и весь код, необходимый для функции accordionClick.


Хорошо, вот где происходит вся магия! Это эндшпиль, и он длится долго до финиша, но если вы будете правильно следовать последним инструкциям, у вас будет рабочее меню для аккордеона!

Первое, что нам нужно добавить в функцию — это регистр переключателя , который в конечном итоге будет включать все операторы if, необходимые для бесперебойной работы:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
switch (activeColor){
    case «none»:
                     
    break;
    case «goldBar»:
                     
    break;
    case «blueBar»:
                     
    break;
    case «greenBar»:
                     
    break;
    case «redBar»:
                     
    break;
}

Этот случай переключения соответствует переменной activeColor, которая устанавливается во время функции accordionClick. Теперь давайте начнем с самой простой части этого оператора case , case: none :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
if(this.goldBackground.x>=-530){
    this.goldBackground.x-=speed;
}
if(this.blueBackground.x>=-500){
    this.blueBackground.x-=speed;
}
if(this.greenBackground.x>=-470){
    this.greenBackground.x-=speed;
}
if(this.redBackground.x>=-440){
    this.redBackground.x-=speed;
}
if(this.blueBar.x>30){
    this.blueBar.x-=speed;
}
if(this.greenBar.x>60){
    this.greenBar.x-=speed;
}
if(this.redBar.x>90){
    this.redBar.x-=speed;
}

( Примечание редактора: вы можете утверждать, что этот код недостаточно удобен для практического использования. См. Комментарии к другому руководству в этой серии для обсуждения этого вопроса!)

Все, что ни в одном случае не делает, это проверяет, больше ли какие-либо из x-позиций MovieClips по сравнению с их исходными, если они таковы, он перемещает их влево до тех пор, пока они больше не будут больше, чем их исходные x-позиции.

Следующий случай, goldBar , делает нечто подобное. Он перемещает все остальные бары, которые находятся на правой стороне от него, к правой стороне сцены, а фоны к предыдущим x-позициям баров. Затем он просто переключает свойства currentFrame всех других баров на 1 (так, чтобы стрелки указывали в противоположном направлении):

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
if(this.goldBackground.x<0){
    //Moves The Bars & Backgrounds
    this.goldBackground.x+=speed;
 
    if(this.blueBar.x<560){
        this.blueBar.x+=speed;
    }
    if(this.blueBackground.x<30){
        this.blueBackground.x+=speed;
    }
    if(this.greenBar.x<590){
        this.greenBar.x+=speed;
    }
    if(this.greenBackground.x<60){
        this.greenBackground.x+=speed;
    }
    if(this.redBar.x<620){
        this.redBar.x+=speed;
    }
    if(this.redBackground.x<90){
        this.redBackground.x+=speed;
    }
    //Checks if any other bar’s currentFrame is 2, if it is it switches it to 1
    if(this.blueBar.currentFrame==2){
        this.blueBar.gotoAndStop(1);
    }else if(this.greenBar.currentFrame==2){
        this.greenBar.gotoAndStop(1);
    }else if(this.redBar.currentFrame==2){
        this.redBar.gotoAndStop(1);
    }
}

Хорошо, у нас есть два из пяти дел завершены. Следующие три случая работают так же, как goldBar — с одним исключением. Они перемещают любые фоны, открытые слева от них, обратно в исходное положение и возвращаются в исходное положение.

Вот случай blueBar :

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
if(this.blueBackground.x<30){
    this.blueBackground.x+=speed;
    if(this.greenBar.x<590){
        this.greenBar.x+=speed;
    }
    if(this.greenBackground.x<60){
        this.greenBackground.x+=speed;
    }
    if(this.redBar.x<620){
        this.redBar.x+=speed;
    }
    if(this.redBackground.x<90){
        this.redBackground.x+=speed;
    }
    if(this.goldBar.currentFrame==2){
        this.goldBar.gotoAndStop(1);
    }else if(this.greenBar.currentFrame==2){
        this.greenBar.gotoAndStop(1);
    }else if(this.redBar.currentFrame==2){
        this.redBar.gotoAndStop(1);
    }
}
if(this.blueBar.x>30){
    this.blueBar.x-=speed;
    if(this.goldBackground.x>-530){
        this.goldBackground.x-=speed;
    }
    if(this.greenBar.x<590){
        this.greenBar.x+=speed;
    }
    if(this.greenBackground.x<60){
        this.greenBackground.x+=speed;
    }
    if(this.redBar.x<620){
        this.redBar.x+=speed;
    }
    if(this.redBackground.x<90){
        this.redBackground.x+=speed;
    }
    if(this.goldBar.currentFrame==2){
        this.goldBar.gotoAndStop(1);
    }else if(this.greenBar.currentFrame==2){
        this.greenBar.gotoAndStop(1);
    }else if(this.redBar.currentFrame==2){
        this.redBar.gotoAndStop(1);
    }
}

Единственное, что нового в этом случае — это второе главное утверждение if; это для того, когда другой фон уже был открыт, он проверяет, какой из них, а затем перемещает его назад, как в случае «нет», затем он меняет кадры на другой панели MovieClips.

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

Вот последние два случая:

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
if(this.greenBackground.x<60){
    this.greenBackground.x+=speed;
    if(this.redBar.x<620){
        this.redBar.x+=speed;
    }
    if(this.redBackground.x<90){
        this.redBackground.x+=speed;
    }
    if(this.goldBar.currentFrame==2){
        this.goldBar.gotoAndStop(1);
    }else if(this.blueBar.currentFrame==2){
        this.blueBar.gotoAndStop(1);
    }else if(this.redBar.currentFrame==2){
        this.redBar.gotoAndStop(1);
    }
}
if(this.greenBar.x>60){
    this.greenBar.x-=speed;
    if(this.goldBackground.x>-530){
        this.goldBackground.x-=speed;
    }
    if(this.blueBar.x>30){
        this.blueBar.x-=speed;
    }
    if(this.blueBackground.x>=-500){
        this.blueBackground.x-=speed;
    }
    if(this.redBar.x<620){
        this.redBar.x+=speed;
    }
    if(this.redBackground.x<90){
        this.redBackground.x+=speed;
    }
    if(this.goldBar.currentFrame==2){
    this.goldBar.gotoAndStop(1);
    }else if(this.blueBar.currentFrame==2){
        this.blueBar.gotoAndStop(1);
    }else if(this.redBar.currentFrame==2){
        this.redBar.gotoAndStop(1);
    }
}
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
if(this.redBackground.x<90){
    this.redBackground.x+=speed;
    if(this.goldBar.currentFrame==2){
        this.goldBar.gotoAndStop(1);
    }else if(this.blueBar.currentFrame==2){
        this.blueBar.gotoAndStop(1);
    }else if(this.greenBar.currentFrame==2){
        this.greenBar.gotoAndStop(1);
    }
}
if(this.redBar.x>90){
    this.redBar.x-=speed;
    if(this.goldBackground.x>-530){
        this.goldBackground.x-=speed;
    }
    if(this.blueBar.x>30){
        this.blueBar.x-=speed;
    }
    if(this.blueBackground.x>=-500){
        this.blueBackground.x-=speed;
    }
    if(this.greenBar.x>60){
        this.greenBar.x-=speed;
    }
    if(this.greenBackground.x>=-470){
        this.greenBackground.x-=speed;
    }
    if(this.goldBar.currentFrame==2){
        this.goldBar.gotoAndStop(1);
    }else if(this.blueBar.currentFrame==2){
        this.blueBar.gotoAndStop(1);
    }else if(this.greenBar.currentFrame==2){
        this.greenBar.gotoAndStop(1);
    }
}

И с этим все кодирование завершено для аккордеона!


Прямо сейчас вы должны восхищаться своей тяжелой работой и ее великолепным результатом, но если вам интересно, как вывести аккордеон на следующий уровень и добавить больше тактов, просто запомните следующее:

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

Спасибо, что нашли время, чтобы прочитать эту статью, я надеюсь, вам понравилось!