![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2009
Сообщений: 180
|
Здравствуйте. Задача у меня следующая - есть массив, представляющий собой список городов. У меня в примере их восемь, а будет около 100. Есть муви клип "button" представляющий собой кнопочку(просто фон и динамическое поле "textid"). На сцену добавлен мувиклип "info" предоставляющий информацию о городах, на каждый кадр в нем - свой город.
Далее все просто. Цикл аттачит нужное количество мувиклипов(по длине массива), назначает каждому, а точнее его текстовому полю - значение из массива. На этом этапе все работает замечательно, но дальше я стопорюсь. При нажатии на какой либо город, я хочу увидеть информацию о нем, сокрытую в мувиклипе "info". Для этого я хотел перейти на нужный кадр в нем по айди нажатой кнопки. То есть город Волгоград в массиве под номером 1. Поэтому смотрим в info второй кадр (i+1). Но увы - трейс по нажатию выдает 8 - сумму элементов массива. Мозг уже замылен, ничего толком придумать и понять уже не могу) mas=new Array() mas=["Ростов","Волгоград","Самара","Нижний Новгород","Москва","Нефтегорск","Санкт-Петербург","Екатеринбург"] //Массив городов for(i=0;i< mas.length;i++){ attachMovie("button","city"+i,i) //аттач кнопок _root["city"+i]._x=0; _root["city"+i]._y=30*i+100; //дистанция между ними _root["city"+i].textid.text = mas[i]; //назначение кнопкам текстовых значений _root["city"+i].onPress = function(){ info.gotoAndStop(i+1); //вот моя косячная строчка trace(i); } } P.S. На всякий случай приложил исходник. |
|
|||||
|
Модрон-ветеринар
|
У вас i будет равно всегда количеству проходов цикла, подпадающих под условие цикла (у вас 7 таких проходов) плюс 1, так как будет еще заход на цикл с приращением счетчика «i», но без выполнения кода тела цикла, ибо условие цикла не выполняется.
Итак, имеем 7 валидных проходов и один холостой. Вот тут i будет последовательно меняться от 0 до 7 для всех кнопок, и в конце концов i = 8, итого сумма в скобках = 9. То есть, после выполнения цикла значение i так и останется = 8, поэтому у всех кнопок для обработчика onPress как бы будет работать одинаковый код: info.gotoAndStop(9); Почему так? См. тут детали, обращая внимание на сообщения alexcon314. Решение. Сделайте обработчик для onPress через ссылку на функцию. Вот ваш код из исходника, переделанный, работает как вы задумывали: 1. mas = new Array(); mas = ["Ростов","Волгоград","Самара","Нижний Новгород","Москва","Нефтегорск","Санкт-Петербург","Екатеринбург"] //Массив городов for(i=0; i< mas.length; i++){ attachMovie("button", "city"+i,i) //аттач кнопок _root["city" + i]._x = 0; _root["city" + i]._y = 30 * i + 100; //дистанция между ними _root["city" + i].textid.text = mas[i]; //назначение кнопкам текстовых значений _root["city" +i ].onRollOver = function(){ //анимация - подцветание кнопки this.bg.gotoAndPlay(2); } _root["city" + i].onRollOut = function(){ //анимация - отцветание кнопки this.bg.gotoAndPlay(21); } _root["city" + i].numb = i; _root["city" + i].onPress = butCityOnPress; } function butCityOnPress () { for(j=0; j < mas.length; j++){ _root["city" + j].bg2.gotoAndStop(1); //удаляем у всех ранее нажатых кнопок "подсветку" } this.bg2.gotoAndStop(2); // назначаем нажатой кнопке "подстветку" info.gotoAndStop(this.numb + 1); } внутри функции для onPress. Через this.number мы "добываем" из кнопки ее номер, ее идентификатор, назначенный ранее в цикле: Поскольку написать «i» для обработчика мы не имеем право, мы как бы сохраняем внутри кнопки текущее значение i, используя свойство (или переменную) numb. Сделать мы так можем, поскольку i - это "примитивная" переменная типа Number, и к счастью для нас, при приравнивании numb передается не ссылка на i, а само ее значение. Можно сделать и без использования ссылки, прямо внутри цикла: 2. _root["city" + i].numb = i; _root["city" + i].onPress = function () { for(j=0; j < mas.length; j++){ _root["city" + j].bg2.gotoAndStop(1); //удаляем у всех ранее нажатых кнопок "подсветку" } this.bg2.gotoAndStop(2); // назначаем нажатой кнопке "подстветку" info.gotoAndStop(this.numb + 1); }; (Например, вдруг к той же функции butCityOnPress захочется обратиться из другого места). Посмотрите еще вот тут пример я вкладывал: http://www.flasher.ru/forum/showthread.php?t=130009 PS. Поскольку момент действительно непрозрачный, так много всего получилось. И еще. Постарайтесь названия для тем делать более информативными. С такими названиями, как эта, темы закрывают. Например - "Как правильно назначить обработчик для кнопки в цикле?". А "массив" тут вообще - постольку-поскольку. Обидно из-за простого невнимания к оформлению лишиться возможности получить помощь. Последний раз редактировалось mooncar; 28.09.2009 в 10:54. |
|
|||||
|
А вы не запаритесь 100 городов в строку записывать. По-моему проще и продуктивнее использовать XML структуру.
|
|
|||||
|
Регистрация: Feb 2009
Сообщений: 180
|
mooncar, огромное спасибо за помощь и объяснение. Это поможет обязательно в будущем.
А название темы, да.. Я знаю здешние правила, но ничего адекватнее в 3 ночи придумать не смог) KiL33, конечно с xml намного лучше будет, не спорю. Однако вчера нужно было срочно сделать подобную структуру, поэтому второпях просто воспользовался массивом. Еще раз большое спасибо за внимание и ответы. |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|