Вече, реално имаме списък (Array) с песните от xml-a, време е да направим някои и друг бутон за управление. Най-простичкия от тях ще е бутона за спиране за звука. Изберете слоя buttons, направете си една проста форма, нарисувайте си бутон с някоя програма или просто използвайте текст с шрифта Webdings (с < се прави квадратче). Маркирайте го и го модифицирайте в Movie Clip - Modify --> Convert to Symbol или с клавиш F8. След това му сложете Instance Name – stop_mc, за да знаете какво е и за да не съвпада със запазената дума stop. Върнете се на слоя actions и запишете следния код в Action Panel:
stop_mc.onRelease = function(){
my_snd.stop();
}
Адресираме stop_mc (нашия бутон за спиране) и щом се натисне и отпусне бутона звука my_snd ще спре. Ако няма звук няма да стане нищо. И това е бутона за спиране.
Сега ще напишем една функция за пускане на песента за по-лесно (по-нататък ще видите защо):
function playTrack(){
my_snd.loadSound(songArray[current_track], true);
}
Какво направихме – зареждаме в my_snd променливата звук. Избираме списъка ни с индекс current_track (т.е. songArray[current_track]), което означава, че ако е натиснат за пръв път бутона ще избере първия елемент от писъка, не забравяйте, че декларирахме current_track със стойност 0. Също така, избрахме и песента да се стриймва (true).
За да не стават размесвания, бутона за пускна на песента при повторно натискане докато се възпроизвежда песен ще пусне песента от начало, тъй като current_track не се променя, за сега. Сега да направим и бутона – изберете пак слоя buttons. Ако имате бутон просто го сложете на сцената, ако работите с текст с шрифт Webdings – натиснете 4. Направете го Movie Clip и сложете Instance Name – play_mc, за да не съвпада със запазена дума. Сега се върнете на слоя actions и запишете:
play_mc.onRelease = function(){
playTrack();
}
При натискане и отпускане на Movie Clip-a ще извика функцията, която написахме за възпроизвеждане на песента – playTrack();.
Нека да направим и бутон за следваща песен. На слоя buttons си сложете бутона (Webdings: 8), модифицирайте го в Movie Clip и му сложете Instance Name – next_mc. Върнете се на слоя actions и ще направим фунцията за следваща песен и си спомете, че зададохме, че когато песента свъши ще се извика тази фунция nextTrack:
function nextTrack(){
current_track ++;
playTrack();
}
На първия ред от блока прибавихме единица (1) към променливата за текуща песен, така че връщайки се при playTrack (втория ред), текущата песен няма да е същата. По този начин при всяко натискане на бутона ще прибавяме по единица към текущата песен.
Тук възниква проблема – какво става когато свърши последната песен... или по-важното - коя е последната песен. Все още сме на слоя actions, най-добре ще е да „пресичаме това в зародиш”, т.е. ще тръгнем от основната фунция playTrack. В общи линии – трябва да сравним текущата песен с дължината на списъка и от там да направим текущата песен равна на 0, в случай че е последна. Нека се върнем и да пренапишем playTrack:
function playTrack(){
if(current_track == songArray.length){
current_track = 0;
my_snd.loadSound(songArray[current_track], true);
}
else{
my_snd.loadSound(songArray[current_track], true);
}
}
Виждате условието в if – current_track == songArray.length, което означава, че ще е вярно когато текущата песен е последна + 1. Защо „+1”? Защото length връща броя на елементите, но започва от 1, а всъщност първия елемент е 0. Аз сложих три песни в xml, което означава, че имаме дължина (length) 3 и елементи 0, 1 и 2. Ако сложим условие за последна песен (songArray.length-1), то тя няма да с изпълни защото условието ще е вярно и текущата песен ще се нулира. Така че, следваща песен след последната ще е 0, дефакто първия елемент от списъка. Ако с trace изведем текущата песен и дължината на списъка ще получаваме следните резултати:
songArray: 3
current_track:0, 1 или 2.
Така направихме един затворен цикъл (0, 1, 2, (3)0, 1, 2, (3)0...)
Какво направихме до тук – направихме 3 бутона, направихме и три действия към бутоните – спиране, пускане и следваща песен. Също така се справихме и с последната песен в слисъка.
Сега нека да направим и бутон за предишна песен от списъка. Направете бутона по вече описаната процедура (ако използвате Webdings - клавиш от клавиатурата 7). Направете го Movie Clip и сложете Instance Name – prev_mc.
Сега отидете на слоя actions и нека добавим код за бутона:
prev_mc.onRelease = function(){
prevTrack();
}
Когато Movie Clip-a prev_mc се натисне и отпусне ще се извика фунцията prevTrack. Нека напишем и фунцията:
function prevTrack(){
if(current_track == 0){
current_track = songArray.length-1;
playTrack();
}
else{
current_track --;
playTrack();
}
}
Първо вижте блока else – аналогично на фунцията за следваща песен с тази разлика, че вадим едница (1) от променливата за текуща песен current_track-- . Но нека да помислим логично, ако случайно се натисне бутона преди да е стартирана песен... или ако се натисне когато текущата песен е първата... тогава излиза, че трябва да се задейства песен -1, каквато очевидно не може да има. Погледнете и блока if, за условие сме посочили, че текущата песен е 0, т.е. или prev_mc е натиснат преди бутона play_mc или prev_mc е натискан няколко пъти и е достигнал първата песен (дефакто, елемент 0). Ако си спомняте цикъла, които направихме във фунцията playTrack(), ще се досетите, че последната+1 песен направихме първа. Логично е тук да направим същия цикъл, но този път ще трябва да адресираме директно последната песен, т.е. songArray.length-1. Ако направим грешката да присвоим songArray.length, както е по-логично и връщайки се в playTrack ще видите, че там в блока if ще е верен (true) и текущата песен ще се нулира. В крайна сметка получаваме цикъл (0, 2, 1, 0, 2…).
Време е да направим и един бутон за пауза. Интересното тук е, че във флаш има запазена дума pause, но подобна фунция няма. Затова ние трябва да си направим – ще направим една променлива, за която ще присвоим текущата позиция. Нека първо да направим бутона – ако имате готов нарисуван – чудесно, ако ползвате текст с шрифт Webdings – натиснете клавиша за точка и запетая ( ; ). Превърнете го в Movie Clip (F8) и му сложете Instance Name – pause_mc. Само че този път натиснете два пъти върху Movie Clip-a за да влезете в Edit Mode. Сложете още един фрейм. На двата фрейма сложете Action Script:
stop();

Може да промените например цвета на бутона на втория фрейм, защото при натискане ще изпратим там анимацията, за да се вижда, че плеъра е поставен на пауза. Върнете се обратно на Сцената и да сложим малко код на слоя actions.
Тактиката е такава, че при натискане на паузата ще запазим позицията на песента в една променлива и анимцията в бутона пауза ще отиде на втори фрейм.
Първо, да декларираме променлива на която ще присвоим текущата позиция:
var current_position:Number;
Този път ще спестим малко код и директно ще направим функцията в събитието при натискане на pause_mc:
pause_mc.onRelease = function(){
if(this._currentframe == 1){
my_snd.stop();
current_position = my_snd.position;
this.gotoAndPlay("2");
}
else{
my_snd.start(current_position/1000);
this.gotoAndPlay("1");
}
}
Пътрвия ред е ясен – при натискане и отпускане на pause_mc да се извършат действията в блока. На втория ред виждате проверката с if за текущ фрейм. Особеното тук е, че this, всъщност е pause_mc, защото this се намира в блока и адресира старшия обект. Та, условието за този блок е текущия фрейм в pause_mc е фрейм 1, а в pause_mc направихме 2 фрейм, като на всеки от тях сложихме stop, т.е. без да е афектирано по някакъв начин текущия фрейм ще е 1. Така проверката за сега е със стойност true и се изпълнява блока. Виждате, че спираме звука, това една от задачите на паузата. Виждате, за променливата current_position присвояваме позицията на песента в момента на натискане на бутона. Следващото действие е, анимацията в този Movie Clip – pause_mc е да се придвижи на фрейм 2. По този начин, при посвторно натискане няма да отговаря на условието в if и ще премине към блока else. В този блок, стартираме пак песента. Спомнете си, че фунцията Sound.start(); имаше един основен параметър и това е от коя секунда да започне песента. Знаем къде е спряна песента от current_position, нека да я използваме. Но също така си споменте, че свойството position връща данни в милисекунди, а параметъра в start() е в секунди, следователно ще разделим на 1000. След като песента вече е стартирана от нужната позиция да не забравяме, че паузата е премахната и за да може при следващото натискане на pause_mc да отговаря на условието трябва да се върнем пак на фрейм 1.