actionscript-3flash-cs5

Flash AS3: Keeping the mouse within certain boundaries


So this one is a tricky one (for me) vital to the development of my project due to the fact that we can't directly modify the position of mouseX and mouseY - they are read-only variables.

Basically, what I want to do is have a player able to move their mouse only within a certain triangular area when a specific instance is active. The latter bit I can manage just fine, however I am having trouble restricting mouse movement -- or apparent mouse movement.

Here's what I have done so far: 1. Assign a library moveclip to the mouseX and mouseY position in the Event.ENTER_FRAME event - although I acknowledge that this should be moved to Mouse.MOUSE_MOVE. (this does not matter yet) 2. Using Corey O'Neils Collision detection kit, do a hit test on the border instances of the area with the crosshair/cursor. 3. Offset the cursor appropriately, and then set a standard Boolean value to false so that the cursor will not keep bouncing back into the cursor over and over.

My problem is, I am not sure what the best way is to go about allowing mouse movement again. Can anyone give me some tips on the best way to do this, or if necessary, point me in another direction where restricting mouse movement is a little easier?

For what it's worth, this is to stop users from aiming in an unrealistic direction with a character in a top-down (ish) shooter.

For those unfamiliar with Corey O'Neil's Collision Detection Kit, I believe it is just a pre-built setup of bitmap (or maybe vector) collision testing - I could be wrong. I'm not sure on the details of how it works, just its basic implementation.

Here is my code regarding mouse movement thus far:

import flash.ui.Mouse;
import flash.events.event
import com.coreyoneil.collision.CollisionList;
Mouse.hide();
var c:crosshair = new crosshair();
addchild(c);
var myCollisionList:CollisionList;
myCollisionList = new CollisionList(c); //sets up detection for the object c
myCollisionList.addItem(mcB); // adds mcB to the list of objects to check c's hittest with

function aim(e:Event) {
    var collisions:Array = myCollisionList.checkCollisions();
    if (collisions.length>0) 
    {
        hashit = true; // tells the program that the mouse has collided with a boundary
        c.x += 1;
        c.y += 1;
    }
    else
    {
        if (hashit == false)
        {
            c.x = mouseX;
            c.y = mouseY;
        }
    }
}

Apologies for the code block, but I figure it is best to show all relevant code -- I'm not sure about the complexity of this issue due to the read-only nature of the mouse's X and Y position.

Also, I'm looking for a possible solution which will not be clunky - that is, as soon as the mouse is back in the area, mouse movement will be smooth as it is originally, and where the cursor will still be matching the mouse position (meaning, the cursor is ALWAYS relevant to the mouse and will not change position should the mouse leave the boundaries).

Could anyone please give me some pointers? Sorry for the long question. I gather there might be a bit to get my head around here, being relatively new to AS3 - but I still feel this is a problem I can get past, if one of you can show me the right direction and help me with both the logic and programming side of things slightly.

Here is a diagram of my stage to clarify the boundary areas etc. A diagram of my stage to clarify further

Thanks very much for any help in advance, I really do appreciate it!

Cheers, Harry.


Solution

  • How about trying getObjectsUnderPoint which returns an array of objects under a certain point. If your triangle object is within the array the cursor must be above it.

    var pt:Point = new Point(c.x, c.y);
    var objects:Array = stage.getObjectsUnderPoint(pt);
    
    if (objects.indexOf(triangleObject) > -1) {
    trace("still within bounds");
    }