![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
|
Вот мне всегда было интересно, например у меня есть много дублированных МС на каждом код, дак вот на каждый клип при наведении нужно разное описание в "самодельном" всплывающем окне. Я это выполнял с помощью присвоения определеного id (он являетя в принципе просто именем МС) при создании, а затем, при наведении, по этому id из "базы" на клипе брал всю нужную инфу:
function skillBASE(id) { switch (id) { case "skill1" : _root.basee = "магия"; _root.skillname = "Комета"; _root.sklv = 1; _root.ifTwoElems = "+"; _root.element1 = "огонь"; _root.element2 = "земля"; _root.description = "блаблабла"; _root.dmgbase = 100; _root.elemDmg1 = 30; _root.elemDmg2 = 20; _root.mpcost = 10; break; case "skill2" : _root.basee = "магия"; _root.skillname = "Инферно"; _root.sklv = 1; _root.ifTwoElems = "+"; _root.element1 = "огонь"; _root.element2 = "воздух"; _root.description = "блаблабла"; _root.dmgbase = 80; _root.elemDmg1 = 30; _root.elemDmg2 = 30; _root.mpcost = 15; break; ETC... p.s насчет root знаю что не совсем правильно, просто пытался) Последний раз редактировалось Dalass13; 05.11.2010 в 06:53. |
|
|||||
|
Модрон-ветеринар
|
Вариант 1. Храните эту инфу о мувике в самом мувике:
skill1.basee = 'магия'; skill1.skillname = 'Комета'; skill2.basee = 'магия'; skill2.skillname = 'Инферно'; var skillsTotal:Number = 50; for (i = 1; i <= skillsTotal; i++) //назначаем обработчики { var mc:MovieClip = _root['skills' + i]; mc.onRollOver = skillRollOver; .... } function skillRollOver() { trace(this.basee ); //магия trace(this.skillname ); //Комета - если навели на мувик skill1, 'Инферно' - если навели на skill2 } ... var skills:Array = new Array(); var skillsTotal:Number = 50; for (i = 1; i <= skillsTotal; i++) { skills[i] = new Array(); //организовываем "двумерный" массив по номерам в роли индексов //далее можно задать обработчики для мувиков скилов } .... //задаем: skills[1]['basee'] = 'магия'; skills[1]['skillname'] = 'Комета'; skills[2]['basee'] = 'магия'; skills[2]['skillname'] = 'Инферно'; Вариант 2.2 Можно использовать массивы 2: var skills:Array = new Array(); var skillsTotal:Number = 50; for (i = 1; i <= skillsTotal; i++) { var mc:MovieClip = _root['skills' + i]; skills[mc]] = new Array(); //организовываем "двумерный" массив с самими мувиками в роли индексов mc.onRollOver = skillRollOver; } ... //задаем: skills[skill1]['basee'] = 'магия'; skills[skill1]['skillname'] = 'Комета'; skills[skill2]['basee'] = 'магия'; skills[skill2]['skillname'] = 'Инферно'; .... function skillRollOver() { trace(skills[this]['basee']); //магия trace(skills[this]['skillname']); //Комета - если навели на мувик skill1, 'Инферно' - если навели на skill2 } ... Какой вариант использовать, зависит от конкретной логики разработки. Кто-нибудь еще, думаю, предложит варианты.
__________________
Идите первым! Последний раз редактировалось mooncar; 05.11.2010 в 11:01. |
|
|||||
|
Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
|
ну логика у меня в принципе такая. На МС скилла стоит код:
onClipEvent (load) { id = this._name.slice(5, 7); gotoAndStop(id); zabito = 0; zabitoC = 0; guardX = _x;//исходное guardY = _y;//положение lockMenu = false; checks = true; } on (rollOver) { if (lockMenu == false) { _root.skillBASE(this._name);// берет инфу о скилле _root.menuCheck(_x, _y, _width);//проверяет, чтобы самодельное окно не выходило за пределы экрана } } on (press) { this.swapDepths(100); startDrag(this); _root.information._visible = false; lockMenu = true; } //теперь очень громоздкий код который мне ОЧЕНь хотелось бы оптимизировать, но мозг не рабоает что-то on (release) { for (i=1; i<=3; i++) {//идет перебор 3 слотов экипировки скиллов if (this.hitTest(_root["slot"+i])) { if (_root.a[i] == 1) {//условие проверяет забит ли i-тый слот другим скиллом, если 1 то забит и МС возвращается на своё guard место i = 3; _root.a[zabito] = 0;//изначально все скиллы находятся в нулевом слоте a[0] trace("a["+zabito+"]="+_root.a[zabito]); trace("ВЫШЕЛ ИЗ СЛОТА: "+zabito); _x = guardX; _y = guardY; _width = 38; _height = 38; this.shine.gotoAndStop(1); break; } else { _x = _root["slot"+i]._x;//далее естественно описывается вхождение в выбранный слот при свободном слоте _y = _root["slot"+i]._y; _width = _root["slot"+i]._width; _height = _root["slot"+i]._height; if (i<>zabito) { trace("ВЫШЕЛ ИЗ СЛОТА "+zabito); _root.a[zabito] = 0; trace("a["+zabito+"]="+_root.a[zabito]); } trace("ВОШЕЛ В СЛОТ "+i); _root.a[i] = 1; trace("a["+i+"]="+_root.a[i]); zabito = i; this.shine.gotoAndStop(2); break; } } else { if (i == 3) {//а здесь описывается что происходит если hittest не "почувствовал" ни одного слота _root.a[zabito] = 0; trace("a["+zabito+"]="+_root.a[zabito]); trace("ВЫШЕЛ ИЗ СЛОТА: "+zabito); _x = guardX; _y = guardY; _width = 38; _height = 38; this.shine.gotoAndStop(1); } }//и вот сейчас начинается АД if (this.hitTest(_root["comboslot"+i])) {//теперь проверяем еще 2 слота, но другие по функционалу, то есть не экипировк, а комбинирования if (_root.b[i] == 1) {//естественно коды аналогичны i = 2; _root.b[zabitoC] = 0; trace("b["+zabitoC+"]="+_root.b[zabitoC]); trace("ВЫШЕЛ ИЗ СЛОТА: "+zabitoC); _x = guardX; _y = guardY; _width = 38; _height = 38; this.shine.gotoAndStop(1); break; } else { _x = _root["comboslot"+i]._x; _y = _root["comboslot"+i]._y; _width = _root["comboslot"+i]._width; _height = _root["comboslot"+i]._height; if (i<>zabitoC) { trace("ВЫШЕЛ ИЗ СЛОТА "+zabitoC); _root.b[zabitoC] = 0; trace("b["+zabitoC+"]="+_root.b[zabitoC]); } trace("ВОШЕЛ В СЛОТ "+i); _root.b[i] = 1; trace("b["+i+"]="+_root.b[i]); zabitoC = i; if (i == 1) { _root.part1 = id; trace(_root.part1); } else { _root.part2 = id; trace(_root.part2); } this.shine.gotoAndStop(2); break; } } else { if (i == 2) { _root.b[zabitoC] = 0; trace("b["+zabitoC+"]="+_root.b[zabitoC]); trace("ВЫШЕЛ ИЗ СЛОТА: "+zabitoC); _x = guardX; _y = guardY; _width = 38; _height = 38; this.shine.gotoAndStop(1); } } } stopDrag(); this.swapDepths(0); lockMenu = false; } on (rollOut) { _root.information._visible = false;//скрывает самодельное окно с инфой } 1) В 3ий слот экипировки не может попасть скилл, который находился в слоте комбо. 2) Всё видно на этом скриншоте В общем всё состоит из 3 слотов экипировки и двух слотов для комбинирования скиллов. Я думал сделать их однотипными, то есть не делить на slot и comboslot, а slot1-slot5. Что думаете по этому поводу. Прекрасно понимаю, что безумно избыточно, но лучше ничего к сожалению не придумал и то, что ВСЁ ЭТО на мувике меня тоже безумно напрягает, если учитывать что это всё дублируется на 50 аналогичных МС. Вот такие пироги Если, что-то непонятно в коде спрашивайте Последний раз редактировалось Dalass13; 05.11.2010 в 15:43. |
|
|||||
|
Модрон-ветеринар
|
Для начала перестаньте писать на клипах.
Посмотрите, как организовать задание свойств (например, обработичики) для нескольких мувиков в цикле, я же привел примеры.
__________________
Идите первым! |
|
|||||
|
Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
|
я понять не могу как написать обработчик для 50ти МС с разными именами? Если с помощью процедуры в которой будет for(i==0;i<=50;i++) то всё равно, кто вызывать то эту процедуру будет?
|
|
|||||
|
Модрон-ветеринар
|
Конечно, с помощью цикла, как же еще. У вас ведь имена мувиков номерные, что может быть проще?
var skillnames:Array = ['Первый скилл', 'Второй скилл', ...] for (i = 1; i <= 50; i++) { var mc:MovieClip = _root['skills' + i]; mc.n = i; mc.skillname = skillnames[i - 1]; mc.onRollOver = skillRollOver; //и т. д. - обработчики, какие-то свойства... } ... function skillRollOver() { trace(this); // сам мувик, по которому "прошлась мышь" trace(this.n); //выведет номер, который присвоили в цикле trace(this.skillname); //выведет "Первый скилл", "Второй скилл" -.... в зависимости от того, по которому "прошлась мышь" }
__________________
Идите первым! Последний раз редактировалось mooncar; 05.11.2010 в 21:14. |
|
|||||
|
Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
|
я всё равно не допонимаю как вызываться будет этот обработчик
вообще я сначала дублирую МС и сразу присваиваю имена function fillUpSkills() { fixY = skill._y+18; k = 0; for (i=1; i<=11; i++) { for (j=1; j<=5; j++) { k += 1; if (_root.skillMas[k] == 1) { duplicateMovieClip(skill, "skill"+k, k); _root["skill"+k]._x = 42*j+skill._x; _root["skill"+k]._y = fixY; } } fixY += 42; } _root.skillMas[_root.enable] = 0;//определяет, что на данный момент этот скилл заблокирован } И еще проблема в том что на кадре уже 300 строк кода -________- Последний раз редактировалось Dalass13; 05.11.2010 в 21:22. |
|
|||||
|
Модрон-ветеринар
|
пример сейчас накидаю
__________________
Идите первым! |
|
|||||
|
Модрон-ветеринар
|
300 строк кода - это не проблема. Проблема, это когда вы накодите уже 3000 строк и поймете, что использовали в корне неверный подход.
См. пример. Если что, там использован attachMovie, мувик из библиотеки, а не дублирование.
__________________
Идите первым! |
|
|||||
|
Регистрация: Oct 2010
Адрес: Свердловск
Сообщений: 77
|
у меня 8 флэш(
не понимает формат Последний раз редактировалось Dalass13; 05.11.2010 в 21:47. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:49. |
|
|
« Предыдущая тема | Следующая тема » |
|
|