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

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

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

Регистрация: Jul 2011
Сообщений: 18
По умолчанию Один обработчик для нескольких кнопок

У меня есть 3 кнопки: Button1, Button2, Button3.
Нужно обрабатывать нажатие на каждую кнопку,
но прикреплять к каждой кнопке сценарий неудобно.
Хочу сделать один обработчик,
который будет по-разному реагировать на кнопки.
К первому кадру ролика я прикрепляю сценарий:
Код AS1/AS2:
Buttons=Array (Button1,Button2,Button3);
for (I=0;I<3;I++)
  Buttons [ I ].onPress=
    function ()
      {trace (I);}
Ожидаемый результат:
при нажатии на кнопку Button1 выведется 0,
при нажатии на кнопку Button2 выведется 1,
при нажатии на кнопку Button3 выведется 2.

На самом деле:
при нажатии на любую кнопку выводится 3.

Почему так происходит?
Потому что создание обработчика - это как бы отложенный вызов функции.
Поэтому переменная I успевает стать равной 3, раньше чем запустится обработчик.
Именно это значение и выводится.

Можно изменить сценарий:
Код AS1/AS2:
Buttons=Array (Button1,Button2,Button3);
for (I=0;I<3;I++)
  Buttons [ I ].onPress=
    function ()
      {trace (I);}
I=12345;
Теперь при нажатии на любую кнопку выводится 12345;

Короче говоря, в обработчик попадает не значение переменной I, а сама переменная.
Оператор trace (I) выводит последнее присвоенное переменной I значение.

Вопрос - как у Чернышевского - что делать?
Как заставить обработчик иметь дело со старыми значениями переменных?
__________________
Kiss my AS!


Последний раз редактировалось brodotsky; 09.08.2011 в 19:06.
Старый 09.08.2011, 19:16
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 2  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
как то так
Код AS1/AS2:
Buttons = Array("Button1", "Button2", "Button3");
for (I=0; I<3; I++) {
	var But:MovieClip = this[Buttons[i]]
	But.id = I
	But.onPress = function() {
		trace(this.id);
	};
}

Старый 13.12.2011, 00:34
brodotsky вне форума Посмотреть профиль Отправить личное сообщение для brodotsky Найти все сообщения от brodotsky
  № 3  
Ответить с цитированием
brodotsky

Регистрация: Jul 2011
Сообщений: 18
Не работает.

Вообще, хотелось бы уметь делать один обработчик для многих кнопок. Для каждой кнопки обработчик должен выполняться по-разному, в зависимости от номера кнопки.
__________________
Kiss my AS!


Последний раз редактировалось brodotsky; 13.12.2011 в 00:38.
Старый 13.12.2011, 01:49
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 4  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Имеем на сцене кнопки btn1, btn2, btn3.
Тогда:

Код AS1/AS2:
for (i = 1; i <= 3; i++)
{
	var btn:MovieClip = this['btn' + i];
          //this - если код в кадре того же таймлайна, что и кнопки
	//если они в контейнере каком-то, то будет cont['btn' + i]
 
	trace(btn); //проверяем, правильно ли сформировали ссылку на кнопку
 
	btn.num = i; //"запоминаем" свой номер внутри самой кнопки
	btn.onRollOver = btnOver;
}
 
function  btnOver()
{
	var num:Number = this.num; //"вспоминаем" свой  номер
	trace(num); //в з-ти от кнопки будет 1, 2, 3
	this._alpha = 100  - num  * 10; //теперь, например, по разному поменяем альфу кнопки
}
Усложняем пример:


Код AS1/AS2:
for (i = 1; i <= 3; i++)
{
	var btn:MovieClip = this['btn' + i];
	btn.num = i;
	btn.onRollOver = btnOver;
	btn.onRollOut = btn.onDragOut = btnOut;
	btn.onRelease = btnRelease;
}
 
function  btnOver()
{
	var num:Number = this.num;
	this._alpha = 100  - num  * 10;
}
 
function  btnOut()
{
	this._alpha = 100;
}
 
function  btnRelease()
{
	var num:Number = this.num; //"вспоминаем" свой  номер
 
	//по нажатию выполним разное действие в завис-ти от номера
	switch (num)
	{
		case 1:
			trace('Действие при нажатии btn1');
		break ;
		case 2:
			trace('Действие при нажатии btn2');
		break ;
		case 3:
			trace('Действие при нажатии btn3');
		break ;				
	}
}
__________________
Идите первым!


Последний раз редактировалось mooncar; 13.12.2011 в 15:53.
Старый 13.12.2011, 03:13
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 5  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Мункар.... однако ФАК писать надобно, я так думаю ))))))
Эт какой-то однака типа ну вобщем теряем былую легкость
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

Старый 14.12.2011, 01:29
brodotsky вне форума Посмотреть профиль Отправить личное сообщение для brodotsky Найти все сообщения от brodotsky
  № 6  
Ответить с цитированием
brodotsky

Регистрация: Jul 2011
Сообщений: 18
А если именно кнопки, а не клипы?
__________________
Kiss my AS!

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
Цитата:
Сообщение от brodotsky Посмотреть сообщение
А если именно кнопки, а не клипы?
Будет работать.
А вообще отучайтесь использовать как кнопки Button, делайте кнопки все на основе MovieClip.
Пригодится, будет меньше проблем, если AS использовать планируете.
(У Button куча недостатков).
__________________
Идите первым!


Последний раз редактировалось mooncar; 14.12.2011 в 03:48.
Создать новую тему Ответ Часовой пояс GMT +4, время: 22:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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