Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как использовать один обработчик для разных объектов? (http://www.flasher.ru/forum/showthread.php?t=148564)

artarx 05.01.2011 19:53

Как использовать один обработчик для разных объектов?
 
Пишу крестики нолики..(учусь).
Возникла проблема, что для каждого клипа(ячейки) при

Код AS3:

Cell1.addEventListener(MouseEvent.CLICK,Step);

нужно писать функцию типа

Код AS3:

function Step(e:Event) 
{
      if (Player==1 && Cells[1]==0)
      {
        Cell1.gotoAndStop(2);
        Player=2;
        Cells[1]=1;
        stage.addEventListener(Event.ENTER_FRAME,proverka);
      }
 
    if (Player==2 && Cells[1]==0)
    {
      Cell1.gotoAndStop(3);
      Player=1;
      Cells[1]=2;
      stage.addEventListener(Event.ENTER_FRAME,proverka);
    }
}

а нельзя как бы сделать одну функцию для каждой ячейки?
наверное что бы функция смотрела кто её вызвал и срабатывала для той ячейки.??

surlac 05.01.2011 20:10

используйте Event.target, чтобы узнать кто вызвал событие (т.е. для доступа к Cell). Подробнее тут.
Должно получиться что-то вроде:
Код AS3:

function Step(e:Event) 
{
// ...
    MovieClip(e.target).gotoAndStop(2);
// ...
}


GemiBillyBob 05.01.2011 20:16

В обработчике события (функции Step) проверяем e.target — это ссылка на нажатый клип.
Пробуйте что-то такое, или вариации:
Код AS3:

function Step(e:Event)
{
    if(e.target==Cell1){
      if (Player==1 && Cells[1]==0)
      {
        Cell1.gotoAndStop(2);
        Player=2;
        Cells[1]=1;
        stage.addEventListener(Event.ENTER_FRAME,proverka);
      }
 
    if (Player==2 && Cells[1]==0)
    {
      Cell1.gotoAndStop(3);
      Player=1;
      Cells[1]=2;
      stage.addEventListener(Event.ENTER_FRAME,proverka);
      }
    }
}

Тему надо было назвать хотя бы "Как сделать одну функцию мышки на разные клипы??? Нид хелп ребята гляньте плиз"

passertm 05.01.2011 20:29

Выйдите в раздел Форум Flasher.ru > Flash > ActionScript 3.0

И зайдите в тему "Важно: Слушатель с параметром"

andrew911 05.01.2011 23:32

Цитата:

Сообщение от passertm (Сообщение 962257)
Выйдите в раздел Форум Flasher.ru > Flash > ActionScript 3.0

И зайдите в тему "Важно: Слушатель с параметром"

Параметры в данном случае не нужны.
Хватит e.target, как написали выше

artarx 06.01.2011 00:13

Решилось так!

Код AS3:

 function Step(e:Event) 
                      {
                        if (Player==1 && Cells[1]==0)
                              {
                                MovieClip(e.target).gotoAndStop(2);
                            Player=2;
                                Cells[1]=1;
                                    stage.addEventListener(Event.ENTER_FRAME,proverka);
                              }
 
                              if (Player==2 && Cells[1]==0)
                              {
                                MovieClip(e.target).gotoAndStop(3);
                            Player=1;
                                Cells[1]=2;
                                    stage.addEventListener(Event.ENTER_FRAME,proverka);
                              }
                          }

Все работает СПС)) Но опять проблема! Есть массив Cells[i] , i - номер ячейки. То есть при нажатии на Cells1 заполняеться Cells[1]..
можно как нибудь в эту функцию передать переменную i?

surlac 06.01.2011 00:26

Вот теперь Вам точно в тему "Важно: Слушатель с параметром" :)
Если не нравится слушатель с параметром, можно создать Dictionary.

Код AS3:

var cells:Dictionary = new Dictionary();
 
function Step(e:Event)
{
        if (Player==1 && cells[e.target] != null && cells[e.target] == 0)
        {
            MovieClip(e.target).gotoAndStop(2);
            Player=2;
            cells[e.target]=1;
            stage.addEventListener(Event.ENTER_FRAME,proverka);
        }
 
        if (Player==2 && cells[e.target] != null && cells[e.target] == 0)
        {
            MovieClip(e.target).gotoAndStop(3);
            Player=1;
            cells[e.target]=2;
            stage.addEventListener(Event.ENTER_FRAME,proverka);
        }
}


andrew911 06.01.2011 00:30

Cells[int(String(e.target.name).substr(5))] = ....

artarx 06.01.2011 00:33

ни чего не происходит((

andrew911 06.01.2011 00:37

Цитата:

Сообщение от artarx (Сообщение 962318)
ни чего не происходит((

То есть при нажатии на Cells1 заполняеться Cells[1]..

Cells1 или Cell1 все-таки?
если Cell1, то
Cells[int(String(e.target.name).substr(4))] = ....

artarx 06.01.2011 00:45

Цитата:

ни чего не происходит((
цитата к
Цитата:

Код AS3:

var cells:Dictionary = new Dictionary();
 
function Step(e:Event)
{
        if (Player==1 && cells[e.target] != null && cells[e.target] == 0)
        {
            MovieClip(e.target).gotoAndStop(2);
            Player=2;
            cells[e.target]=1;
            stage.addEventListener(Event.ENTER_FRAME,proverka);
        }
 
        if (Player==2 && cells[e.target] != null && cells[e.target] == 0)
        {
            MovieClip(e.target).gotoAndStop(3);
            Player=1;
            cells[e.target]=2;
            stage.addEventListener(Event.ENTER_FRAME,proverka);
        }
}


на счет этого
Код AS3:

Cells[int(String(e.target.name).substr(5))] = ....

я понял что она делает и я опечатался у меня Cell1)))
А куда ее вставлять я не понял

Добавлено через 2 минуты
У меня Cell1

Цитата:

Cells[int(String(e.target.name).substr(4))] = ....
куда это вставлять?

andrew911 06.01.2011 00:49

Понятно.

Вам надо, чтобы при нажатии на Cells1 заполнялось Cells[1]..
Вставляйте там, где ловите нажатие.
Так вы определяете индекс Cells - int(String(e.target.name).substr(4))

artarx 06.01.2011 01:20

Спасибо!! Заработало!

Gaen 06.01.2011 10:40

Цитата:

Cells[int(String(e.target.name).substr(4))]...
Никогда так не делайте.

Почему? Попробуйте разобраться, что делает следующая конструкция, построенная по такой же технологии:

Код AS1/AS2:

this._parent._parent.registerTip(this._parent._parent['area'+this._parent.txtTarget._name.charAt(3)], this.txt.text);


passertm 06.01.2011 13:23

Народ я чегото не совсем вас понимаю. Говоря "Слушатель с параметром" не обязательно идет речь о каком то необычным параметре. e.target тоже параметр. И в это теме первая же ссылка указывает как можно использовать e.target для определения на что именно нажато.
А гдето в теме было написано что можно в e.target добавить своство чтобы его можно было использовать при обработке. Вообщем ИМХО все что нужно товаришу он там нашел бы:)

Добавлено через 5 минут
Вот вместо этого я бы советовал как раз добавить новое поле.
Код AS3:

int(String(e.target.name).substr(4))




а если в массиве те самые елементы на которые нажимают то лучше сделать
Код AS3:

var n:int=array.indexOf(e.target)


andrew911 06.01.2011 16:27

Цитата:

Сообщение от GAIKER (Сообщение 962393)
Никогда так не делайте.

Почему? Попробуйте разобраться, что делает следующая конструкция, построенная по такой же технологии:

Код AS1/AS2:

this._parent._parent.registerTip(this._parent._parent['area'+this._parent.txtTarget._name.charAt(3)], this.txt.text);


Вынесите это в функцию с понятным именем. И тут нету нагромождения парентов, которые все совсем запутывают.


Цитата:

Сообщение от passertm (Сообщение 962414)
Народ я чегото не совсем вас понимаю. Говоря "Слушатель с параметром" не обязательно идет речь о каком то необычным параметре. e.target тоже параметр.

e.target это стандартное свойство. Под слушателем с параметром же имеется в виду передавать новые, нестандартные параметры.


По делу: согласен int(String(e.target.name).substr(4)) это не совсем хорошо, тут проблема в проектировании приложения - если подумать можно все сделать прозрачнее и однозначнее, без кучи Cell1 ... Celln.

Но для новичка, если он понимает, что делает та функция, подойдет. Потом он столкнется с неудобствами, связанными с такой архитектурой, сделает выводы и сделает лучше.


PS Например в коде создавать и размещать клетки, заносить их в массив, потом работать с ним.


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

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