Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: наследование при обработке событий мыши
Flash Zone Forum > Macromedia Flash > ActionScript
haroldangel
Как добится того, чтобы чайлд перехватывал события мыши, если парент уже обрабатывает такое же событие?

Пример:

attachMovie("objA", "a", 1, {_x:100, _y:100});
a.attachMovie("objB", "b", 2, {_x:0, _y:0});
a.onPress = function(){
trace("in parent!");
}
a.b.onPress = function(){
/* не работает, несмотря на то, что объект "b" находится
в слое, расположенном выше объекта "a" */
trace("in child!");
}
Rohan
Цитата
"b" находится в слое, расположенном выше объекта "a"
как он может находиться выше, если он ВНУТРИ?!! Для таких вещей я пишу свои обработчики нажатия мыши. Например:

Код
class MouseListener {
    
    private var owner:VisualObject;
    private var active:VisualObject;
    
    public function MouseListener(_owner:VisualObject) {
        owner = _owner;
    }
    
    private function getHighest(_owner:VisualObject):VisualObject {
        var highestSprite:VisualObject;
        var currentDepth:Number = -100;
        for(var i in _owner.childList){
            if(_owner.childList[i] instanceof VisualObject
                && _owner.childList[i] != Sheet(owner).sLabels
                && VisualObject(_owner.childList[i]).getDepth()>currentDepth
                && VisualObject(_owner.childList[i]).hitTest(_root._xmouse,_root._ymouse,true)){
                highestSprite = VisualObject(_owner.childList[i]);
                currentDepth = VisualObject(_owner.childList[i]).getDepth();
            }
        }
        return highestSprite;
    }
    
    private function onMouseDown():Void {
        var highest:VisualObject = getHighest(owner);
        var prevHighest:VisualObject = highest;
        while(highest!=undefined){
            prevHighest = highest;
            highest = getHighest(highest);
        }
        active = prevHighest;
        trace(active);
        if(active==undefined && owner.hitTest(_root._xmouse,_root._ymouse,true)){
            active = owner;
        }
        if(active!=undefined)
            active.mousePress();
    }
    
    private function onMouseUp():Void {
        if(active.hitTest(_root._xmouse,_root._ymouse,true))
            active.mouseRelease();
        else
            active.mouseReleaseOutside();
    }
    
}

код довольно специфический, так что можно и не пытаться его у себя юзать =) Но смысл из него выцепить можно.
Добавлю только что в AS3 с событийным аппаратом наконец разобрались и внесли порядок =) С чем, собсна, всех и поздравляю =)
MustLive
Цитата
/* не работает, несмотря на то, что объект "b" находится
в слое, расположенном выше объекта "a" */

haroldangel

С чего ты взял, данное утверждение не верно. Так как ты загружаешь один объект внутрь другого, о слоях тут вообще речи не идёт. Так что ты работаешь сдесь с иерархией, а не со слоями. Потому и не работает.

Цитата
Как добится того, чтобы чайлд перехватывал события мыши, если парент уже обрабатывает такое же событие?

Это будет сложно сделать. В случае иерархии объектов, добраться до вложеного будет сложнее, особенно если уже имеется обработчик данного события на верхнем уровне.

Подобные проблемы (ограничения) имеются во флеше с давних времён, ещё в 5-6 флеше приходилось с подобным сталкиваться. Заюзай 8 флеш и посмотри, что он предлагает в этом плане, может уже улучшена работа с вложенными объектами. Но это речь идёт о вложеных и обробокте событий вложеными объектами. А не о том, чтобы вложеный от нечего делать почувствовал событие, которое парент обрабатывает. Постановка вопроса не совсем коррекнта.

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

P.S.

Или посмотри пример Рохана и заюзай AS3.
Русская версия IP.Board © 2001-2009 IPS, Inc.