我正在尝试使用Rectangle.intersection为我提供2个重叠形状的交叉区域的矩形,但没有取得多大成功。
下面的代码只是两个相同大小的形状。最顶级的形状是可拖动的。 当拖动停止时,我执行bottomRect.intersection(topRect)调用,但这总是返回rect的完整大小,而不是交集大小。
(可以将代码复制并粘贴到第一帧的新ActionScript文件中并运行。)
有没有人知道我哪里出错?
由于
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));
}
答案 0 :(得分:6)
问题是由于您传递的toIntersect
属性错误:
topBoundsRect = stage.getBounds(topSprite);
trace("INTERSECTION RECT", bottomBoundsRect.intersection(topBoundsRect));
您所做的就是获得topSprite
再次舞台的界限。如果你追踪它,它会给你这样的东西:
(x=-62, y=-41, w=382, h=521)
所以你的边界从0,0开始并且有更大的宽度/高度,因为你移动了topSprite - 这里我把它移动了62个像素到右边(382 - 320 [宽度]),和41个像素向下(521 - 480 [身高])。
此矩形与底部矩形的实际交点正好是底部矩形的大小。
你应该做的是类似的事情:
// 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
获得界限的方法很少,但这也有效并且显示了这个想法。
希望有所帮助! :)