AS3无法理解矩形交点

时间:2014-06-03 07:35:35

标签: actionscript-3 flash air intersection

我正在尝试使用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));

}

1 个答案:

答案 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

获得界限的方法很少,但这也有效并且显示了这个想法。

希望有所帮助! :)