Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.09.2009, 04:06
Acrossfy вне форума Посмотреть профиль Отправить личное сообщение для Acrossfy Найти все сообщения от Acrossfy
  № 1  
Ответить с цитированием
Acrossfy
 
Аватар для Acrossfy

Регистрация: Feb 2009
Сообщений: 180
По умолчанию Массив и цикл

Здравствуйте. Задача у меня следующая - есть массив, представляющий собой список городов. У меня в примере их восемь, а будет около 100. Есть муви клип "button" представляющий собой кнопочку(просто фон и динамическое поле "textid"). На сцену добавлен мувиклип "info" предоставляющий информацию о городах, на каждый кадр в нем - свой город.
Далее все просто. Цикл аттачит нужное количество мувиклипов(по длине массива), назначает каждому, а точнее его текстовому полю - значение из массива. На этом этапе все работает замечательно, но дальше я стопорюсь.
При нажатии на какой либо город, я хочу увидеть информацию о нем, сокрытую в мувиклипе "info". Для этого я хотел перейти на нужный кадр в нем по айди нажатой кнопки. То есть город Волгоград в массиве под номером 1. Поэтому смотрим в info второй кадр (i+1). Но увы - трейс по нажатию выдает 8 - сумму элементов массива. Мозг уже замылен, ничего толком придумать и понять уже не могу)

Код AS1/AS2:
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. На всякий случай приложил исходник.
Вложения
Тип файла: rar кнопки2.rar (5.3 Кб, 51 просмотров)

Старый 28.09.2009, 07:27
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
У вас i будет равно всегда количеству проходов цикла, подпадающих под условие цикла (у вас 7 таких проходов) плюс 1, так как будет еще заход на цикл с приращением счетчика «i», но без выполнения кода тела цикла, ибо условие цикла не выполняется.
Итак, имеем 7 валидных проходов и один холостой. Вот тут
Код AS1/AS2:
info.gotoAndStop(i+1);
i будет последовательно меняться от 0 до 7 для всех кнопок, и в конце концов i = 8, итого сумма в скобках = 9.
То есть, после выполнения цикла значение i так и останется = 8, поэтому у всех кнопок для обработчика onPress как бы будет работать одинаковый код: info.gotoAndStop(9);
Почему так? См. тут детали, обращая внимание на сообщения alexcon314.

Решение. Сделайте обработчик для onPress через ссылку на функцию. Вот ваш код из исходника, переделанный, работает как вы задумывали:
1.
Код AS1/AS2:
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);
}
Обратите внимание на эту строчку
Код AS1/AS2:
info.gotoAndStop(this.numb + 1);
внутри функции для onPress. Через this.number мы "добываем" из кнопки ее номер, ее идентификатор, назначенный ранее в цикле:
Код AS1/AS2:
_root["city" + i].numb = i;
Поскольку написать «i» для обработчика мы не имеем право, мы как бы сохраняем внутри кнопки текущее значение i, используя свойство (или переменную) numb.
Сделать мы так можем, поскольку i - это "примитивная" переменная типа Number, и к счастью для нас, при приравнивании numb передается не ссылка на i, а само ее значение.

Можно сделать и без использования ссылки, прямо внутри цикла:
2.
Код AS1/AS2:
_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.
Старый 28.09.2009, 12:39
KiL33 вне форума Посмотреть профиль Отправить личное сообщение для KiL33 Найти все сообщения от KiL33
  № 3  
Ответить с цитированием
KiL33
 
Аватар для KiL33

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
А вы не запаритесь 100 городов в строку записывать. По-моему проще и продуктивнее использовать XML структуру.

Старый 28.09.2009, 15:00
Acrossfy вне форума Посмотреть профиль Отправить личное сообщение для Acrossfy Найти все сообщения от Acrossfy
  № 4  
Ответить с цитированием
Acrossfy
 
Аватар для Acrossfy

Регистрация: Feb 2009
Сообщений: 180
mooncar, огромное спасибо за помощь и объяснение. Это поможет обязательно в будущем.
А название темы, да.. Я знаю здешние правила, но ничего адекватнее в 3 ночи придумать не смог)
KiL33, конечно с xml намного лучше будет, не спорю. Однако вчера нужно было срочно сделать подобную структуру, поэтому второпях просто воспользовался массивом.

Еще раз большое спасибо за внимание и ответы.

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 05:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.