Triynko
Triynko

Reputation: 19204

How to handle mouseEvent transparently in AS3?

I have a DisplayObject docked at the top of my interface that displays debug information (frames per second, etc.) and is translucent with an alpha of 60%.

I would like to interact with items under this surface, such that when the mouse rolls over it, it dims to 10% alpha, and mouse events pass through it to the underlying objects.

Normally, I have this debug info panel's mouseEnabled and mouseChildren properties set to false, so objects under it receive mouse events.

The problem is that in order to hide it when the mouse rolls over it, it needs to have mouseEnabled set to true. However, if mouseEnabled is true, the mouse events are not picked up by objects underneath it.

As far as I know, I can't selectively enable mouseEvents, so it's either going to receive them all or none of them. That means that I'd have to handle and forward ALL events, if I took that approach.

I really wish the mouseEnabled property had a "peek" mode or something, so that it could receive the events if it is on top, but also allow them to pass through to objects underneath.

Upvotes: 4

Views: 4336

Answers (6)

Hardy
Hardy

Reputation: 5631

I had this same problem.. i made function to check is mouse over certain object:

    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;
    }

Upvotes: 0

Valentin Simonov
Valentin Simonov

Reputation: 1768

If a DisplayObject has mouseEnabled=true it means that its events will be sent to its container not to whateve is underneath the object. So this solution will not work. The best solution would be to reroute events from it manually using getObjectsUnderPoint as described here.

I've been using this approach for years in multi-touch apps. With multiple touch points I don't see any processor overhead. And you got only one cursor.

Upvotes: 1

Glenn
Glenn

Reputation: 5342

I'm assuming you have this display hierarchy:

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

Why not make the overlay a mask on DebugWindow and have your mouseEvents attached to DebugWindow itself? See this page for some inspiration: http://blog.shaperstudio.com/2010/11/as3-inverse-mask/

Upvotes: 0

mbaker3
mbaker3

Reputation: 1173

One approach you can take, although not ideal, is to add an enter frame listener and check the mouse position every frame. something along the lines of:

stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);


private function onEnterFrame(e:Event):void {
    if(mouseX > width || mouseY > height){
        //hide stats
    }
}

Upvotes: 0

The_asMan
The_asMan

Reputation: 6402

I believe you are looking for mouseEnabled = false
But another last ditch attempt you can do is on mouse over move it to the other side of the screen.

Upvotes: 0

Corey
Corey

Reputation: 5818

I feel your pain. Unfortunately, I don't know of a way to enable/disable specific mouse events. You could get creative with the solution though. For instance, maybe try adding a MOUSE_MOVE listener to your stage and track the coordinates of the mouse. Then, if the stageX,stageY of the mouse is in the area of your panel, set the visibility. You might also be able to use getObjectsUnderPoint() to determine which objects are under the mouse. But, my guess is that it would get a little intense on the processor to run that on each frame iteration.

Upvotes: 0

Related Questions