Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Event у перекрываюшихся DisplayObject (http://www.flasher.ru/forum/showthread.php?t=186576)

AleXXX 05.11.2012 21:38

Event у перекрываюшихся DisplayObject
 
Привет всем. Стала задача сделать "прослушку" MouseClick 2-х (в общем случае N) частично перекрывающихся наследников DisplayObject, чтобы при клике в области перекрытия Event словил не только верхний, но и все кто под ним.
Сейчас сделал так: прослушку повесил на общий контейнер, потом через getObjectsUnderPoint() получаю список всех DisplayObject под точкой клика, и уже проходя по массиву возвращенных объектов вызываю желаемый метод.

Можно ли как-то обойтись прослушкой в самих DisplayObject, чтобы оно "прошило" всех до самого нижнего?

Krusty 05.11.2012 22:00

Отношение дети-родители имеются у объектов между собой?

AleXXX 05.11.2012 22:19

нет, иначе бы вопрос не стоял, событие легко бы прошло ко всей детворе. Объекты соседи, просто частично накладываются друг на друга

Krusty 05.11.2012 23:47

ну тогда, очевидно, нет. Клик всегда чей-то(1 объекта), потом всплывает.

Ну можно немного облагородить, вроде того - повесить на стейдж слушатель, у нужных объектов реализовать интерфейс, и диспатчить клик в выбранные объекты через getObjectsUnderPoint, которые реализуют интерфейс.

AleXXX 06.11.2012 20:17

В общем реализовал так:
Код AS3:

SomeObject.addEventListener(MouseEvent.CLICK,this.onClick,false);
......
private function onClick(e:MouseEvent):void  //Обработчик клика
{
    ......
    var pool:Array = this.getUpperOfLowerUnit(e.stageX,e.stageY);
    ......
 
}
 
private function getUpperOfLowerUnit(x:int,y):Array
{
        var gp:Point = new Point(x,y)
        var TmpPool:Array = this.parent.getObjectsUnderPoint(gp)//Тут получается  список Shape'ов
        var Pool:Array = new Array();
 
        for(var i:int=0;i<TmpPool.length;i++){
 
                var c:DisplayObject =TmpPool[i] as DisplayObject; 
 
                while(c.parent!=c.root ){  //тут пробираемся от Shape'а по списку отображения вверх
                  if(c is Нужный тип){      // пока не встретим нужный тип наследника DisplayObject
                      break;
                  }
                  c=c.parent;
                }
                if(c is  Нужный тип && c!=this){
 
                        if(Pool.indexOf(u)<0) {  //если объект не  добавлен
 
                                Pool.push(u)//добавляем
                        }                                               
                }                       
        }
        return Pool
}


dimarik 06.11.2012 23:41

Если до root проверяете, то может быть есть смысл именно на него повесить единственный слушатель MouseEvent?

AleXXX 07.11.2012 13:16

Цитата:

Если до root проверяете, то может быть есть смысл именно на него повесить единственный слушатель MouseEvent?
Теоретически можно, но рута есть свои "слушатели", чувствую с, так сказать, "маршрутизацией" евента потом запутаюсь


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

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