PDA

Просмотр полной версии : Movieclip'ы в роли кнопок. Если их много?


Дмитрий Шкаричев
21.06.2005, 15:04
Есть около 20-30 movieclip'ов, выполняющих роль кнопки. Текст для них задается вот так
_root.clip1.textfield=text1;
А при наведении, клике и прочем делается что-то:
clip1.onRollOver=function(){clip1.gotoAndPlay(2);}
clip1.onPress=function(){getURL(...);}

Причем у всех одинаково за исключением ссылки, на которую эти кнопки ведут. Как избежать многократного повторения кода для всех этих клипов?

Nirth
21.06.2005, 15:14
если кнопоки имеют похожие имена(clip1,clip2,clip3) то через цикл

for(i=1;i<21;i++) {
_root["clip"+i].textField.text=_root["text"+i];
_root["clip"+i].onRollOver = function .....
_root["clip"+i].onPress = functon ......

Если имена разные то есть еще два варианта, занести предварительно кнопки в массив

var but_array:Array = new Array(_root.but1,_root.menu.but2, ...и так далее);

после чего аналогичным способом через цикл for прогнать их, плюсы в том что нам даже всеравно где они находяться.

Третий способ, если кнопки находяться в одном мувике, и кроме них ничего там нету, то делаем через цикл for in

for(var but:String in menu_mc) {
menu_mc[but].onPress = function (){}
}

Дмитрий Шкаричев
21.06.2005, 15:33
спасибо большое!

Captain Crocus
21.06.2005, 15:39
Есть еще способ. Создай класс, где описан общий код, там же задай метод для принятия индивидуальных параметров и динамического создания ролловера и пресса, затем зарегистририруй через Object.registerClass, все создаваемые кнопки, будут иметь общий код, а потом передавай данные методам экземпляров, примерно как указал Nirth.

Nirth
21.06.2005, 15:43
и в правду че это я забыл о классах =)

Дмитрий Шкаричев
22.06.2005, 17:08
если кнопоки имеют похожие имена(clip1,clip2,clip3) то через цикл

for(i=1;i<21;i++) {
_root["clip"+i].textField.text=_root["text"+i];
_root["clip"+i].onRollOver = function .....
_root["clip"+i].onPress = functon ......



странно. но работает только для последней кнопки. По видимому цикл проигрывается, и запоминает только последние указания.. Что делать?
Код стоит просто в root.

Greben
22.06.2005, 17:13
по видимому цикл проигрывается, и запоминает только последние указания.
не могет такого быть!
может у тебя где-нибудь косяк с кнопками? ты их как создаешь?

Greben
22.06.2005, 17:16
Причем у всех одинаково за исключением ссылки
а почему не воткнуть в сам клип this.onRollover и т.д.?

Captain Crocus
22.06.2005, 17:17
проверь имена всех клипов на сцене. или положи код.

Дмитрий Шкаричев
22.06.2005, 17:23
не могет такого быть!
может у тебя где-нибудь косяк с кнопками? ты их как создаешь?
Создаю так:
- клип с прямоугольником и сверху текстовое поле. имя ему clip1 и txt
- в роот.е пишу:


_root.clip1.txt=название кнопки;

clip1.onRollOver=function(){
clip1.gotoAndPlay(2);
}
clip1.onPress=function(){getURL(link1);}
clip1.onRollOut=function(){
clip1.gotoAndPlay(11);
}

И так повторяю до 20 кнопок, и работает. Почему то через цикл, как сказал Nirth не получается.

Captain Crocus
22.06.2005, 17:28
Нет, ты нигде не ошибся, у тебя, наверное, просто флэш поломался ;)
Названия клипов, надеюсь, у тебя clip1-clip20 на сцене, а не в библиотеке.

Greben
22.06.2005, 17:35
Значит так, ))), делаешь 1 клип и в linkage ставишь "new_Clip_or_whatever"
внутри этого клипа: this.onRollOver=function(){
this.gotoAndPlay(2);
}
this.onPress=function(){getURL(link1);}
this.onRollOut=function(){
this.gotoAndPlay(11);
}
а в руте делашь цикл:
for (i=1;i<20;i++){
this.createEmptyMovieClip("newClip"+i;i);
this["newClip"+i].attachMovie("new_Clip_or_whatever","newClip"+i;i);
this["newClip"+i].txt=название кнопки;
}

Дмитрий Шкаричев
22.06.2005, 17:36
Нет, ты нигде не ошибся, у тебя, наверное, просто флэш поломался ;)
Названия клипов, надеюсь, у тебя clip1-clip20 на сцене, а не в библиотеке.
flash mx. не 2004
вообще названия клипов m1- m20, и они в другом клипе - px
Может это из-за того что они в другом клипе еще?

_root.px["m"+i].onRollOver=function(){
_root.px["m"+i].gotoAndPlay(2);
}

Greben
22.06.2005, 17:41
я вот одного не понимаю: на фига тебе эти свойства вешать на клипы снаружи? или ты их меняешь по ходу файла?

Дмитрий Шкаричев
22.06.2005, 17:43
Значит так, ))), делаешь 1 клип и в linkage ставишь "new_Clip_or_whatever"
внутри этого клипа: this.onRollOver=function(){
this.gotoAndPlay(2);
}
this.onPress=function(){getURL(link1);}
this.onRollOut=function(){
this.gotoAndPlay(11);
}

А как, чтобы потом ссылки различались у разных кнопок?
И вообще мне хочется обойтись без attach и дубликатов.
Символы я сам расставлю как нужно, но вот код хочется упростить (не повторять для всех кнопок)

Captain Crocus
22.06.2005, 17:58
если ты запихнешь все это в клас и зарегистрируешь за клипом, можешь не аттачить и просто бросать на сцену, куда тебе захочется.
но параметры тебе все равно придется передавать циклом

Greben
22.06.2005, 17:59
А как, чтобы потом ссылки различались у разных кнопок?
Делаешь массив этих адресов, а потом тем же манером в цикле пишешь this["newClip"+i].newLink=this.linksArray(i)
код хочется упростить (не повторять для всех кнопок)
ну Nirth работающий код дал

Дмитрий Шкаричев
22.06.2005, 18:39
ну Nirth работающий код дал
ну не работает у меня. выкладываю исходник.

Greben
22.06.2005, 18:49
гы! и правда не работает )) вот:

Дмитрий Шкаричев
23.06.2005, 10:21
гы! и правда не работает )) вот:
а как же текст и ссылки?..

Captain Crocus
23.06.2005, 10:38
И не будет работать, так как вы запутались в именах переменных и в относительных и абсолютных путях

В первом файле работает, причем по перебору в цикле, как и предлагалось Nirth'ом.

Во-втором - работает без цикла, каждый мувик - наследник класса, со всеми св-вами, а данные для себя динамически создает в конструкторе, забирая параметром массивы, которые являются статическими для всех экз. класса; это будет делать любой экземпляр, который создан по принципу m1, m2, mn. Лично мне не нравится во-втором варианте только явная ссылка на конструктор.

Дмитрий Шкаричев
23.06.2005, 11:17
[QUOTE=Captain Crocus]И не будет работать, так как вы запутались в именах переменных и в относительных и абсолютных путях

В первом файле работает, причем по перебору в цикле, как и предлагалось Nirth'ом.
[QUOTE]

Спасибо! Классно получилось! Работает. Но, вопрос! А полностью так как предлагал Nirth можно сделать? Чтобы в цикле были не только тексты и ссылки а и функции для onRollOver, onRelease, onRollOut..

KUZEN
23.06.2005, 11:42
Nirth же всё написал ...
stop();
var txt_array = new Array("название1", "название2", "название3", "название4");
var link_array = new Array("html1.html", "html2.html", "html3.html", "html4.html");
for (i=0; i<txt_array.length; i++) {
var mm = _root["m"+(i+1)];
mm.menu1.textfield = txt_array[i];
mm.link = link_array[i];
mm.onPress = function() {
getURL(this.link);
};
}

Дмитрий Шкаричев
23.06.2005, 12:31
Nirth же всё написал ...
stop();
var txt_array = new Array("название1", "название2", "название3", "название4");
var link_array = new Array("html1.html", "html2.html", "html3.html", "html4.html");
for (i=0; i<txt_array.length; i++) {
var mm = _root["m"+(i+1)];
mm.menu1.textfield = txt_array[i];
mm.link = link_array[i];
mm.onPress = function() {
getURL(this.link);
};
}
Спасибо все работает. Видимо я не знал что-то про пути.. Объясните почему нужно так:

_root["m"+(i+1)].onRollOver = function(){
this.gotoAndPlay(2);
}

а не
_root["m"+(i+1)].gotoAndPlay(2); ?

Nirth
23.06.2005, 12:32
Ты перешел в другой мувик, тоесть this теперь ссылаеться на _root["m"+(i+1)]
Update: это называеться области видимости (scope)

Captain Crocus
23.06.2005, 12:35
потому что будет сразу срабатывать переход, а так ты задаешь обработчик, который при событии выполняет переход.

Дмитрий Шкаричев
23.06.2005, 12:44
Ты перешел в другой мувик, тоесть this теперь ссылаеться на _root["m"+(i+1)]
Update: это называеться области видимости (scope)

А почему нельзя абсолютный путь указать? _root... ?
А если нужно что-то сделать с другим мувиком?

Nirth
23.06.2005, 12:46
Можно указать абсолютный, но согласись this короче чем _root[бубубубу] =)

Дмитрий Шкаричев
23.06.2005, 12:53
Можно указать абсолютный, но согласись this короче чем _root[бубубубу] =)

Так вот в том и дело, что если указывать абсолютный то не работает!!!

Nirth
23.06.2005, 12:57
давай исходник....

Captain Crocus
23.06.2005, 13:10
и еще, абсолютные ссылки ухудшают мобильность (переносимость) кода.

KUZEN
23.06.2005, 13:13
не работает всё по той же причине ... пути у тя не правильные наверняка ...

Дмитрий Шкаричев
23.06.2005, 13:19
давай исходник....
исходник. с this все работает нормально.

Nirth
23.06.2005, 13:29
stop();
var txt_array = new Array("название1", "название2", "название3", "название4");
var link_array = new Array("html1.html", "html2.html", "html3.html", "html4.html");
for (i = 0; i < txt_array.length; i++) {
var mm = _root["m" + (i + 1)];
_root["m" + (i + 1)].index = i + 1;
mm.menu1.textfield = txt_array[i];
mm.link = link_array[i];
mm.onPress = function() {
getURL(this.link);
};
_root["m" + (i + 1)].onRollOver = function() {
_root["m" + this.index].gotoAndPlay(2);
};
_root["m" + (i + 1)].onRollOut = function() {
_root["m" + this.index].gotoAndPlay(11);
};
}

Дмитрий Шкаричев
23.06.2005, 14:32
То есть когда начинается function() {
то как бы переменные все из этого мувика действуют, и в нем нет переменной i, и для этого ты создал переменную index внутри мувика?

Nirth
23.06.2005, 14:50
в конце цикла, i = 4, тоесть, при вызове события onRollOver/onRollOut получаеться слейдующее

_root.["m"+(4+1).gotoAndPlay();

Дмитрий Шкаричев
23.06.2005, 14:57
Я не про то спросил. Вообщем, почему именно так:

_root["m" + (i + 1)].onRollOver = function() {
_root["m" + this.index].gotoAndPlay(2);
};

а не вот так:

_root["m" + (i + 1)].onRollOver = function() {
_root["m" + (i + 1)].gotoAndPlay(2);
};

Nirth
23.06.2005, 14:57
Для ежиков поясняю.
потому что когда ты вызываешь обработчик onRollOver , i = 4 .
а переменная index равна, i на момент выдачи обработчиков(тоесть от 1 до 4)