Как прозрачно обрабатывать mouseEvent в AS3? - PullRequest
4 голосов
/ 09 марта 2012

В верхней части моего интерфейса закреплен DisplayObject, который отображает отладочную информацию (количество кадров в секунду и т. Д.) И является полупрозрачным с альфа-значением 60%.

Я бы хотел взаимодействовать с объектами под этой поверхностью, чтобы при наведении курсора мыши на него уменьшалась до 10% альфа, и события мыши проходили через него к базовым объектам.

Как правило, свойства mouseEnabled и mouseChildren этой панели отладочной информации имеют значение false, поэтому объекты под ним получают события мыши.

Проблема в том, что для того, чтобы скрыть его, когда на него наведет курсор мыши, необходимо, чтобы mouseEnabled было установлено в значение true. Однако, если mouseEnabled имеет значение true, события мыши не обнаруживаются объектами, находящимися под ним.

Насколько я знаю, я не могу выборочно включать mouseEvents, поэтому он либо получит их все, либо ни одного из них. Это означает, что мне пришлось бы обрабатывать и пересылать ВСЕ события, если бы я использовал этот подход.

Мне бы очень хотелось, чтобы свойство mouseEnabled имело режим "peek" или что-то в этом роде, чтобы оно могло получать события, если оно находится сверху, но также позволяло им проходить сквозь объекты под ним.

Ответы [ 6 ]

1 голос
/ 09 марта 2012

Если DisplayObject имеет mouseEnabled=true, это означает, что его события будут отправлены на его container, а не на то, что находится под объектом.Так что это решение не будет работать.Лучшим решением было бы перенаправить события из него вручную, используя getObjectsUnderPoint, как описано здесь .

Я уже несколько лет использую этот подход в приложениях multi-touch.С несколькими точками касания я не вижу никаких накладных расходов процессора.И у вас есть только один курсор.

0 голосов
/ 25 ноября 2013

У меня была такая же проблема .. Я сделал функцию, чтобы проверить, наведен ли курсор на определенный объект:

    public function isMouseOverObject(mPos: Point, pObject:DisplayObject, pContainer:DisplayObjectContainer) {

        var under_objects:Array = pContainer.getObjectsUnderPoint(mPos);
        var is_under:Boolean = false;

        for (var i:int = 0; i < under_objects.length; i++) {
            if (under_objects[i] == pObject) {
                is_under = true;
                break;
            }
        }

        return is_under;
    }
0 голосов
/ 09 марта 2012

Я предполагаю, что у вас есть эта иерархия отображения:

Debug Window
    Debug Control 1
    Debug Control 2
    ...
    Overlay

Почему бы не сделать наложение маской в ​​DebugWindow и не привязать ваши mouseEvents к самому DebugWindow?Смотрите эту страницу для вдохновения: http://blog.shaperstudio.com/2010/11/as3-inverse-mask/

0 голосов
/ 09 марта 2012

Один из подходов, который вы можете использовать, хотя и не идеальный, - это добавить прослушиватель ввода кадра и проверять положение мыши в каждом кадре.что-то вроде:

stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);


private function onEnterFrame(e:Event):void {
    if(mouseX > width || mouseY > height){
        //hide stats
    }
}
0 голосов
/ 09 марта 2012

Я чувствую твою боль.К сожалению, я не знаю, как включить / отключить определенные события мыши.Вы можете проявить творческий подход с решением, хотя.Например, возможно, попробуйте добавить слушатель MOUSE_MOVE на вашу сцену и отслеживать координаты мыши.Затем, если stageX,stageY мыши находится в области вашей панели, установите видимость.Вы также можете использовать getObjectsUnderPoint(), чтобы определить, какие объекты находятся под мышью.Но я предполагаю, что процессор будет немного интенсивнее запускать его на каждой итерации кадра.

0 голосов
/ 09 марта 2012

Мне кажется, вы ищете mouseEnabled = false
Но еще одна последняя попытка рва, которую вы можете сделать, это навести курсор мыши на другую сторону экрана.

...