Форум 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=194465)

Yulia_V 14.02.2013 20:34

Как записать код с обработчиками событий короче?
 
Здравствуйте. На сцене присутствует некоторое количество мувиклипов. Как сделать их объектами событий Click (с функцией передачи параметра visible = true разным картинкам), не вешая обработчик событий отдельно на каждый мувиклип? Может класс какой есть для этих целей, или ещё что-нибудь?

Chum 14.02.2013 20:47

Может как то так:
Код AS3:

// Заносим мувики в массив
var arr:Array = [mc0, mc1, mc2, mc3];
var arr2:Array = [mc01, mc11, mc21, mc31];
for(var i:int = 0; i < arr.length; i++){
    arr[i].addEventListener(MouseEvent.CLICK, otrabotka);
        function otrabotka(sob:MouseEvent):void{
            drugaiaFunc(i);
        }
}
 
function drugaiaFunc(arg1:int):void{
    arr2[arg1].visible = false;  // или true;
}


Asfel 14.02.2013 20:53

Вешаешь событие на контейнер, а в событии смотришь таргет, и карент таргет ;)

amesqit 14.02.2013 21:08

Не люблю вложнные функции, они как-то запутывают
Код AS3:

var arrButton:Array = [b1, b2, b3, b4];
var arrPicture:Array = [p1, p2, p3, p4];
 
for(var i:int = 0; i < arrButton.length; i++)
{
    arrButton[i].addEventListener(MouseEvent.CLICK, clickListener);
}
 
function clickListener(e:MouseEvent):void
{
    var index :int = arrButton.indexOf(e.currentTarget)
    if(index!=-1)
    {
          arrPicture[index].visible = !arrPicture[index].visible;
    }
}

или если не хочется искать по массиву, по каким-либо соображениям:
Код AS3:

var arrButton:Array = [b1, b2, b3, b4];
var arrPicture:Array = [p1, p2, p3, p4];
var dictinaryButton: Dictionary = new Dictionary()
for(var i:int = 0; i < arrButton.length; i++)
{
    dictinaryButton[arrButton[i]] = arrPicture[i]
    arrButton[i].addEventListener(MouseEvent.CLICK, clickListener);
}
 
function clickListener(e:MouseEvent):void
{
        dictinaryButton[e.currentTarget].visible = !dictinaryButton[e.currentTarget].visible;
}


Asfel 14.02.2013 22:17

Зачем тут вообще массивы какие либо?

Nooob 14.02.2013 23:53

можно просто слушать в родительской контейнере на фазе всплытия

etc 15.02.2013 14:27

bubbling

Yulia_V 15.02.2013 22:37

amesqit Спасибо, в принципе работает! Только вот чего не понимаю: почему я не могу задать свойство visible = false массиву, картинки всё равно видны:
Код AS3:

var arrButton:Array = [platki.pl1, platki.pl2, platki.pl3, platki.pl4];
var arrPicture:Array = [platok_1, platok_2, platok_1, platok_1];
arrPicture.visible = false; // Вот эта строчка
 
for(var i:int = 0; i < arrButton.length; i++)
{
    arrButton[i].addEventListener(MouseEvent.CLICK, clickListener);
}
 
function clickListener(e:MouseEvent):void
{
    var index :int = arrButton.indexOf(e.currentTarget)
    if(index!=-1)
    {
          arrPicture[index].visible = true;
    }


Wolsh 15.02.2013 22:54

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

Yulia_V 15.02.2013 23:07

Wolsh, хорошо. Но почему function clickListener тогда работает?


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

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