Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Один обработчик для нескольких кнопок (http://www.flasher.ru/forum/showthread.php?t=163598)

brodotsky 09.08.2011 19:00

Один обработчик для нескольких кнопок
 
У меня есть 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 значение.

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

lexa2000lexa 09.08.2011 19:16

как то так
Код 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);
        };
}


brodotsky 13.12.2011 00:34

Не работает.

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

mooncar 13.12.2011 01:49

Имеем на сцене кнопки 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 ;                               
        }
}


dark256 13.12.2011 03:13

Мункар.... однако ФАК писать надобно, я так думаю :)))))))
Эт какой-то однака типа ну вобщем теряем былую легкость :)

brodotsky 14.12.2011 01:29

А если именно кнопки, а не клипы?

mooncar 14.12.2011 03:44

Цитата:

Сообщение от brodotsky (Сообщение 1051297)
А если именно кнопки, а не клипы?

Будет работать.
А вообще отучайтесь использовать как кнопки Button, делайте кнопки все на основе MovieClip.
Пригодится, будет меньше проблем, если AS использовать планируете.
(У Button куча недостатков).


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

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