crooksy88
crooksy88

Reputation: 3851

AS3 Having trouble understanding Rectangle Intersection

I'm trying to get Rectangle.intersection to provide me with the rectangle of the intersection area of 2 overlapping shapes but not having much success.

The code below is simply 2 shapes the same size. The top most shape is draggable. When the drag is stopped I perform a bottomRect.intersection(topRect) call but this always returns the full size of the rect, not the intersection size.

(the code can be copied and pasted into a new ActionScript file on the first frame and run.)

Does anyone have an idea where I'm going wrong?

Thanks

import flash.geom.Rectangle;
import flash.display.Sprite;

var bottomSprite:Sprite = new Sprite();
addChild(bottomSprite);

var bottomRect:Shape = new Shape;
bottomRect.graphics.beginFill(0xFF0000);
bottomRect.graphics.drawRect(0, 0, 320,480);
bottomRect.graphics.endFill();
bottomSprite.addChild(bottomRect);

var topSprite:Sprite = new Sprite();
addChild(topSprite);

var topRect:Shape = new Shape;
topRect.graphics.beginFill(0x000033);
topRect.graphics.drawRect(0, 0, 320,480);
topRect.graphics.endFill();
topSprite.addChild(topRect);

var bottomBoundsRect:Rectangle = stage.getBounds(bottomSprite);
trace("START: bottomBoundsRect ", bottomBoundsRect);

var topBoundsRect:Rectangle = stage.getBounds(topSprite);
trace("START: topBoundsRect ", topBoundsRect);

topSprite.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
topSprite.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);

function mouseDownHandler(evt:MouseEvent):void{

topSprite.startDrag();

}


function mouseUpHandler(evt:MouseEvent):void{

topSprite.stopDrag();

topBoundsRect = stage.getBounds(topSprite);

trace("INTERSECTION RECT", bottomBoundsRect.intersection(topBoundsRect));

}

Upvotes: 1

Views: 1004

Answers (1)

Andrey Popov
Andrey Popov

Reputation: 7520

The problem is because of wrong toIntersect property that you pass:

topBoundsRect = stage.getBounds(topSprite);
trace("INTERSECTION RECT", bottomBoundsRect.intersection(topBoundsRect));

What you do is that you get the bounds of the topSprite agains the Stage. If you trace it, it will give you something like this:

(x=-62, y=-41, w=382, h=521)

So you have a bounds that start at 0,0 and have bigger width/height, because you move the topSprite - here I've moved it 62 pixels to the right (382 - 320 [width]), and 41 pixels down (521 - 480 [height]).

The actual intersection of this rectangle against the bottom one, is exactly the size of the bottom one.

What you should do is something similar to this:

// somehow get the rectangle of the bottom sprite
var br:Rectangle = new Rectangle(bottomSprite.x, bottomSprite.y, bottomSprite.width, bottomSprite.height);
// somehow get the rectangle of the top sprite
var tr:Rectangle = new Rectangle(topSprite.x, topSprite.y, topSprite.width, topSprite.height);
trace (br.intersection(tr)); // intersect them

There are few ways to get the bounds, but this is also working and shows the idea.

Hope that helps! :)

Upvotes: 6

Related Questions