Ôóòóðèñòè÷íî ìåíþ ñ Flash
 òîçè óðîê ùå âè ïîêàæà êàê äà ñè íàïðàâèòå àòðàêòèâíî ìåíþ îò âúëíîîáðàçíî ïîäðåäåíè òîï÷åòà. Ùå èçïîëçâàìå ìàëêî ìàòåìàòèêà è àêî ñòå çàïîçíàòè ñúñ ñèíóñ ùå âè å ïî-ëåñíî.
Íà òåîðèÿ:
• Ùå ïîäðåäèì 10 òîï÷åòà â ñðåäàòà íà ñöåíàòà. Íàïðàâåòå ñöåíàòà ìàëêî ïî-ãîëÿìà, â çàâèñèìîñò îò ãîëåìèíàòà íà òîï÷åòàòà.
• Çà âñÿêî òîï÷å ùå ïîñî÷èì úãúë. Íà ïðàêòèêà úãúë íå ñúùåñòâóâà (äâå ðàìåíà, åäíà äîïèðíà òî÷êà), íî ùå èïîëçâàìå ñâîéñòâà íà ñèíóñ, òàêà ÷å ùå òðÿáâà äà ðàçäåëèì 360 ãðàäóñà íà áðîÿ íà òîï÷åòàòà, çà äà ñå ðàçëè÷àâà ïîçèöèÿòà íà âñÿêî òîï÷å îò äðóãèòå.
Âåðîÿòíî ñòå âèæäàëè â ó÷åáíèöèòå ïî ìàòåìàòèêà èçîáùðàæåíèå íà òîðòà íàðÿçàíà íà ïàð÷åòà. Òîâà ùå íàïðàâèì è íèå.
• Ùå îáîçíà÷èì òåêóùîòî (ïîñëåäíî ïîñî÷åíîòî) òîï÷å ñ ÷èñëî, ñïîðåä êîåòî "ïàð÷åòàòà íà òîðòàòà" ùå ñå èçìåñòÿò. Òàêà ùå ñå ïîëó÷è, ÷å ïîñî÷åíîòî òîï÷å çàñòàâà ïî-ñðåäàòà, à îñòàíàëèòå ñå ïîäðåæäàò ñïîðåä íåãî.
• Ïîçèöèèòå íà òîï÷åòàòà íå ñå ñìåíÿò ìîìåíòàëíî, à ïëàâíî. Òîâà ñå ïîñòèãà, ÷ðåç åäíà ìàëêà ôîðìóëêà, êîÿòî ùå äîñòèãíå æåëàíèÿ úãúë ïëàâíî. Îùå ïîâå÷å, ÷å ÷åñòîòà íà êàäðèòå ùå çàäàäåì äà áúäå îê. 30 fps.
Íàïðàâåòå ñè åäíî òîï÷å ñ Oval Tool. Îêîëî 30 ïèêñåëà ùå ñà äîñòàòú÷íî. F8 -> MovieClip è ñëîæåòå Registration point â ñðåäàòà. Îùå äîêàòî ãî ïðàâèòå MovieClip íàòèñíåòå Advanced îò ïðîçîð÷åòî (àêî íå ñòå ãî íàòèñíàëè) è èçáåðåòå îòìåòêàòà "Export for ActionScript". Ïîëåòî Identifier âå÷å òðÿáâà äà å àêòèâíî - âúâåäåòå â íåãî btn. ×ðåç òîçè identifier ùå ðàçìíîæèì òîï÷åòàòà, êàòî ãî âèêàìå îò Library. Ñåãà èçòðèéòå òîï÷åòî îò ñöåíàòà. Çàñåãà íÿìà äà íè òðÿáâà.
Òðÿáâà äà íàïðàâèì è áóòîíè, êîèòî âñúùíîñò ùå óëàâÿò äâèæåíèåòî íà ìèøêàòà. Íàïðàâåòå åäèí ïðàâîúãúëíèê ñ äúëæèíà 60 ïèêñåëà è âèñî÷èíà 250 ïèêñåëà. Ïîâòîðåòå ïðîöåäóðàòà ñ òîï÷åòàòà, ñàìî ÷å â ïîëåòî identifier ñëîæåòå btn_back.
Âå÷å ñìå ãîòîâè äà ïðèñòèïèì êúì êîäà. Ïîñî÷åòå ôðåéì è îòâîðåòå Actions ïàíåëà (F9). Íà ïúðâî âðåìå, ïðåäè äà ïèøåòå â ïàíåëà âèæòå äàëè íà íåãî ïèøå "Actions - frame". Àêî ôðåéìîâåòå âè ñà ïîâå÷å îò åäèí ñëîæåòå stop(); òàì êúäå ùå ïèøåòå, àêî âè å åäèí åäèíñòâåí ôðåéì - ìîæåì äà çàïî÷íåì ïèñàíåòî.
Êàòî çà íà÷àëî, ùå îòáåëåæèì ñöåíàòà ñ ïðîìåíëèâà - äîñòà óäîáíà òåõíèêà - ñëåä ìàëêî ùå ïðèêà÷èì òîï÷åòàòà è ïðàâîúãúëíèöèòå íà ñöåíàòà, òàêà ÷å êàòî ïèøåì êîäà, Flash ùå ðàçïîçíàå ìåòîäèòå íà ïðîìåíëèâà è ùå âèæäàòå Code Hints.
var home:MovieClip = this;
Íåùî ìíîãî âàæíî - ùå äåôèíèðàìå ïðîìåíëèâà, êîÿòî ùå ïðåäñòàâëÿâà áðîÿ íà òîï÷åòàòà (ñúîòâåòíî íà ïðàâîúãúëíèöèòå). Àêî ÷åòåòå îò XML, ùå ÿ äåôèíèðàòå ïî-êúñíî, íî çà ñåãà ùå ãî íàïðàâèì ñòàòè÷åí:
var num:Number = 10;
(Äåñåò òîï÷åòà.)
Îñòàâåòå 5-6 ðåäà ïðàçíè - ðàçäåëåòå ñè êîäà òàêà - íàé-îòãîðå ïðîìåíëèâè, à íàäîëó ôóíêöèè è ïðî÷åå.
Ùå çàïî÷íåì ñ öèêúë for, îò 0 äî 9 èëè îò 1 äî 10, ïî ïðèíöèï íÿìà çíà÷åíèå, íî å äîáðå äà çàïî÷âàòå îò 0 (èëè ñïîðåä ñëó÷àÿ), çà äà íå ñå áúðêàòå.
for(var i:Number=0; i
Äåôèíèðàìå ïðîìåíëèâà btn ñ êîÿòî ùå îïåðèðàìå ïî-ëåñíî. Ïîñî÷âàìå identifier-a, êîÿòî âå÷å çàäàäîõìå â Library. Èçáèðàìå è instance name çà âñÿêî òîï÷å, çàùîòî ïîñëå ùå íè å íóæíî äà ãî íàìèðàìå. i+num+2 - òîâà áóêâàëíî å äúëáî÷èíàòà íà âñÿêî òîï÷å, 0 - òîâà å äúëáî÷èíàòà íà ñöåíàòà (home), íå ìîæå äà èìà äâà îáåêòà íà åäíà è ñúùà äúëáî÷èíà, à èñêàìå ïðàâîúãúëíèöèòå äà ñà çàä òîï÷åòàòà. Çàòîâà ïðèáàâÿìå num.
var btn:MovieClip = home.attachMovie("btn", "btn"+i, i+num+2);
Òîâà å åäíà îò êëþ÷îâèòå òî÷êè â êîäà. angle å ñâîéñòâî çà âñÿêî òîï÷å, êîåòî íèå äåôèíèðàìå (ÎÎÏ). Òóê ñè "ðàçðÿçâàìå òîðòàòà" íà ïàð÷åòà. Òúé êàòî ôóíêöèÿòà ñèíóñ âúâ ôëàø î÷àêâà ðàäèàíè, à íå ãðàäóñè, íàïðàâî ùå ðàáîòèì ñ ðàäèàíè. 360 ãðàäóñà, ò.å. åäèí ïúëåí êðúã å ðàâåí íà Ïè óìíîæåíî ïî 2 ðàäèàíà (3.14 * 2). 3.14 å ïðåêàëåíî íåòî÷íî, çàòîâà ùå èïîëçâàìå Math.PI, êîåòî ùå ãî èçâåäå äîñòà ïî-ïðåöèçíî. Ðàçäåëÿìå öÿëàòà "òîðòà" íà áðîÿ òîï÷åòà è ïîëó÷àâàìå ïàð÷åòàòà. Óìíîæàâàìå ïî íàðàñòâàùîòî i îò öèêúëà, êîåòî ùå íàïðàâè ïàð÷åòàòà íà ðàâíè ðàçñòîÿíèÿ. Ò.å. (â ãðàäóñè) - ïúðâîòî òîï÷å ùå èìà úãúë 0 ãðàäóñà (i çàïî÷âà îò 0), âòîðîòî ïàð÷å 36 ãðàäóñà, òðåòîòî 72 è ò.í.
btn.angle = i*((Math.PI*2)/num);
Åäíà òåõíèêà, êîÿòî îáè÷àì äà ïðèëàãàì - èç÷èñëÿâàì, êîëêî å ðàçòîÿíèåòî äî ïúðâîòî òîï÷å îò íà÷àëîòî íà ñöåíàòà. Ùå ïîäðåäèì òîï÷åòàòà åäíî äî äðóãî ñ 10 ïèêñåëà ðàçòîÿíèå ïîìæåäó èì, à àç çíàì êîëêî òîï÷åòà ùå èìà (num).
var k:Number = Stage.width/2 - (btn._width*num + 10*(num-1))/2;
Çàäàâàìå õîðèçîíòàëíàòà ïîçèöèÿ è öåíòðèðàìå ñ k.
btn._x = btn._width*i + 10*i + k;
Òóê ùå èïîëçâàìå âå÷å çàäàäåíèÿ "úãúë", êîéòî êàêòî âå÷å îáÿñíèõ ñúùåñòâóâà ñàìî íà òåîðèÿ. Ïðèáàâÿìå è Stage.height/2, êîåòî âèíàãè å ñðåäàòà íà ñöåíàòà. Âúðíåòå ñå ãîðå ïðè ïðîìåíëèâèòå è äåôèíèðàéòå r - ðàäèóñ, êîéòî ùå èçïîëçâàìå. Íàïðàâèõìå áóòîíèòå-ïðàâîúãúëíèöè 250 ïèêñåëà, íî çà ðàäóèñ òîâà å ìíîãî, òàêà ÷å çàäàéòå îêîëî 80:
var r:Number = 80;
Çàåëåæåòå êàê àäðåñèðàìå úãúëà íà âñåêè áóòîí (ÎÎÏ). Ñòîéíîñòèòå, êîèòî âðúùà ñèíóñ ñà â èíòåðâàë îò -1 äî 1, à íàøèòå úãëè ñà â ðàâíè èòåðâàëè îò 0 ãðàäóñà äî 360 (ò.å. îò 0 äî PI*2). Àêî òåñòâàòå ñåãà ùå âèäèòå, ÷å òîï÷åòàòà ñà ïîäðåäåíè â ñðåäàòà íà ñöåíàòà è ñà îáðàçóâàëè åäíà ñèíóñîèäà.
btn._y = Stage.height/2 + Math.sin(btn.angle)*r;
Êîìåíòàðè (5)