Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   FAQ (http://www.flasher.ru/forum/forumdisplay.php?f=86)
-   -   Перекрытие событий мышки, во вложеных мувиклипах (http://www.flasher.ru/forum/showthread.php?t=80360)

World Architect 26.05.2006 23:43

Перекрытие событий мышки, во вложеных мувиклипах
 
Ситуация: нарисовано три мувика. Один внизу, два поверх первого. Ну типа двух объектов на столе. Так вот эти объекты, что на столе не получают события от мыши. Как мне сделать чтоб работало?

Nirth 27.05.2006 00:06

Silin.fatal.ru->AS2->AtMouseEvent
а вообще тема обсуждалась за последний месяц на форуме 4 раза.

Код:

class AtMouseEvent{
    var po:Object,oo:Object;//ссылки на текущий и нажатый объект
    public function AtMouseEvent(){
        Mouse.addListener(this);
    }
    private function onMouseUp(){
        //если текущий объект тот же, что и нажатый, то atRelease
        //иначе atReleaseOutside
        po[po==getObject() ? "atRelease" : "atReleaseOutside"]();
        po=null;//нет нажатого
    }
    private function onMouseDown(){
        //ставим ссылку на нажатый, вызываем atPress()
        (po=getObject()).atPress();
    }
    /*private function onMouseMove(){
        var co:Object=getObject();
        //если объект сменился, то для старого atDragOut/atRollOut
        //для нового atDragOver/atRollOver в зависимости от кнопки мыши
        if(co!=oo){
            co[Key.isDown(1) ? "atDragOver" : "atRollOver"]();
            oo[Key.isDown(1) ? "atDragOut" : "atRollOut"]();
        }
        oo=co;
    }*/
    //вычисляет верхний их всех объектов под мышью (null, если никого..
    private function getObject():Object{
        if(!_root.hitTest(_xmouse,_ymouse,true))return null;
        var _array=[];//массив, куда сложим все объекты, находящиеся под мышью
        var getObj=function(o){
            for(var i in o)if(_root.hitTest.call(o[i],_xmouse,_ymouse,true)){
                _array.push(o[i]);
                if(typeof o[i]=='movieclip') getObj(o[i]);
            }
        }
        getObj(_root);//находим все объекты с которыми есть хиттест,
       
        ////////функции для сортировки пересекающихся мувиков////////////
        var isParent=function (a,b){//является ли a потомком b ?
            while((a=a._parent)!=_root) if(a==b) return true;
            return false;
        }
        var getParentDepth=function(a,p){//глубина контейнера a в предке p
            while(a._parent!=p) a=a._parent;
            return  a.getDepth();
        }
        var getGeneric=function(a,b){//ближайший общий родитель
            while (!isParent(a,b) && b!=_root)b=b._parent;
            return b
        }
        var order=function(a,b){//функция для сортировки
            //если родство по прямой, то дети всегда выше  родителей
            if(isParent(a,b))return -1;
            if(isParent(b,a))return  1;
            //для двоюродных меряемся предками
            var p=getGeneric(a,b);//ближайший общий родитель
            return getParentDepth(a,p) < getParentDepth(b,p);//глубины контейнеров в ближайшем общем родителе
        }
        ///////////////////////////////////////
        return _array.length==1 ? _array[0] : _array.sort(order)[0];//возвращаем единственный или верхний (сортированный)
    }
}



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

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