PDA

Просмотр полной версии : оптимизация скрипта, однотипные кнопки меню


Маруська
30.06.2013, 22:27
Есть простенькое меню, 5 кнопок и 5 же всплывающих подменю.
Из-за того, необходимо будет на эти всплывающие подменю ставить SetInterval, то скрипт нужен общий на все кнопки.
Пока пусть только будет появление и пропадание по клику(задаём клик переменной k). Bt - кнопка главного меню, submenu - соответственно подменю.
Скрипя мозгами, наваяла это, но, естественно, не работает.

for(i=1; i<=5; i++)
{
["bt"+i]onRelease=function()
{
if(this._name==["bt"+i])
{if (k!=1)
{
for (b=1; b<=5; b++)
{
if(b!=i){["submenu_"+b]gotoAndStop(37);}
else{["submenu_"+b]gotoAndPlay(2);}
}
k=1;
}
}
else
{
["submenu_"+i]gotoAndPlay(21);
k=0;
}
}
}

mooncar
30.06.2013, 22:54
В конце цикла i становится равным 6 и это значение будет использоваться во всех обработчиках.
Нужно так:
for(i=1; i<=5; i++)
{
var item:MovieClip = this['bt'+i];
item.i = i; //"запоминаем" номер
item.onRelease = itemOnRelese; //назначаем обработчк
}

function itemOnRelese()
{
var i:Number = this.i; //извлекаем номер
//дальнейшие действия, используя полученное i
}

Маруська
30.06.2013, 23:38
спасибо. работает =)

А теперь вот так:
stop();
k=0;


for(i=1; i<=5; i++)
{
var item:MovieClip = this['bt'+i];
item.i = i; //"запоминаем" номер
item.onRelease = itemOnRelese; //назначаем обработчк
item.onRollOut = itemOnRollOut;
}

function itemOnRelese()
{
var i:Number = this.i; //извлекаем номер
if (k!=1)
{trace(k);
for (b=1; b<=5; b++)
{
if(b!=i){_root["submenu_"+b].gotoAndStop(37);}
else{
_root["submenu_"+b].gotoAndPlay(2);
timer(i);
trace("return"+inter);
}
k=1;}

}

else
{
trace(k);
timeroff(i, inter);
_root["submenu_"+i].gotoAndPlay(21);
k=0;
}
}

function itemOnRollOut()
{
k=0;
}

function timer(i) { trace (i);
inter = setTimeout(go,5000,i);
return(inter);
}

function timeroff(i, inter){trace(i+" off "+inter);
clearTimeout(inter)}
function go(i){
trace("go");
_root["submenu_"+i].gotoAndPlay(21);
k=0;}


Как-о странно работает. Go вызывает по велению пятки. Что не так?

Маруська
01.07.2013, 12:29
29765
Вот исходник CS4

Маруська
02.07.2013, 19:47
вопрос всё ещё открыт =(

dark256
02.07.2013, 23:27
Мутный код. Сделайте ОДНУ кнопк и ОДНО подменю.
Упростите всё это.
К тому же ваш исходник у меня не открывается.

Маруська
03.07.2013, 11:04
когда одна кнопка и одно подменю - всё работает =)

Добавлено через 29 минут

stop();
k=0; //индикатор нажатия на кнопку. по первому клику на кнопку меню появляется, по повторному - исчезает


for(i=1; i<=5; i++) //кнопок всего 5
{
var item:MovieClip = this['bt'+i];
item.i = i; //"запоминаем" номер
item.onRelease = itemOnRelese; //назначаем обработчик на клик
item.onRollOut = itemOnRollOut; //назначаем обработчик на отведение мыши
}

function itemOnRelese()
{
var i:Number = this.i; //извлекаем номер
if (k!=1) //проверяем, что кнопка нажата впервые
{for (b=1; b<=5; b++) //цикл на выбор субменю
{
if(b!=i){_root["submenu_"+b].gotoAndStop(37);} //закрываем все открытые субменю, не относящиеся к нажатой кнопке
else{ //выполняется для субменю для нажатой кнопки
_root["submenu_"+b].gotoAndPlay(2);
timer(i) //задаём задержку для дальнейшего проигрывания субменю
}
k=1; //меняем индекс - кнопка один раз нажата
}

}

else
{//кнопка нажата повторна
timeroff(i, inter); //удаляем задержку для текущего субменю
_root["submenu_"+i].gotoAndPlay(21);//закрываем субменю
k=0; //возвращаем индикатор - кнопка не нажата
}
}

function itemOnRollOut()
{
k=0;//возвращаем индикатор - кнопка не нажата
}

function timer(i) {
inter = setTimeout(go,5000,i);//вызываем закрытие субменю после задержки
return(inter);
}

function timeroff(i, inter)
{
clearTimeout(inter)
}

function go(i)
{
_root["submenu_"+i].gotoAndPlay(21);
k=0;// после автоматического закрытия меню по задержке, восстанавливаем индикатор - кнопка не нажата
}

Добавлено через 1 час 45 минут
По первому клику на кнопку таймер не срабатывает. после того, как кнопку закрыть и снова открыть кликом - таймер начинает работать. в чём проблема?

Добавлено через 2 часа 6 минут
Вот так чудно работает на одну кнопку.
Но как только добавляю условия на обработку других кнопок - всё кубарем =(


stop();
k=0;

for(i=1; i<=5; i++)
{
var item:MovieClip = this['bt'+i];
item.i = i; //"запоминаем" номер
item.onRelease = itemOnRelese; //назначаем обработчк
}

function itemOnRelese()
{
var i:Number = this.i; //извлекаем номер
if (k!=1)
{
for (b=1; b<=5; b++)
{if (b==i){
_root["submenu_"+b].gotoAndPlay(2);
timer(i);
}
k=1;
}
}
else
{
timeroff(i, inter);
_root["submenu_"+i].gotoAndPlay(21);
k=0;
}
}

function timer(i) {
inter = setTimeout(go,5000,i);
return(inter);
}

function timeroff(i, inter){clearTimeout(inter)}

function go(i){
_root["submenu_"+i].gotoAndPlay(21);
k=0;
}



Добавлено через 3 часа 50 минут
Всем спасибо. Нарисовала блок-схему - выявила проблему. Этот скрипт работает - если вдруг кому-то надо

stop();
k=0;

for(i=1; i<=5; i++)
{
var item:MovieClip = this['bt'+i];
item.i = i; //"запоминаем" номер
item.onRelease = itemOnRelese; //назначаем обработчк
item.onRollOut = itemOnRollOut;
}

function itemOnRelese()
{
var i:Number = this.i; //извлекаем номер
if (k!=1)
{
for (b=1; b<=5; b++)
{if (b==i){
_root["submenu_"+b].gotoAndPlay(2);
timer(i);
}
else {_root["submenu_"+b].gotoAndStop(40);}
k=1;
}
}
else
{
timeroff(i, inter);
_root["submenu_"+i].gotoAndPlay(21);
k=0;
}
}

function timer(i) {
clearTimeout(inter)
inter = setTimeout(go,5000,i);
return(inter);
}

function timeroff(i, inter){clearTimeout(inter)}

function go(i){
_root["submenu_"+i].gotoAndPlay(21);
k=0;
}

function itemOnRollOut()
{
k=0;
}

dark256
04.07.2013, 19:12
Адрес , по которому высылаются эшелоны с ящиками пива можно найти в моем профиле.....

Маруська
05.07.2013, 11:01
был бы повод. Ведь Вы так мне помогли.