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];//возвращаем единственный или верхний (сортированный)
}
}