World Architect
26.05.2006, 23:43
Ситуация: нарисовано три мувика. Один внизу, два поверх первого. Ну типа двух объектов на столе. Так вот эти объекты, что на столе не получают события от мыши. Как мне сделать чтоб работало?
Silin.fatal.ru->AS2->AtMouseEvent (http://silin.fatal.ru/AS2/realmouse/index.html)
а вообще тема обсуждалась за последний месяц на форуме 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];//возвращаем единственный или верхний (сортированный)
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.