我的 startDrag 矩形不在我设置的位置

My startDrag rectangle isn't where I set it to be

我制作了一个矩形、一个矩形精灵和一个圆形精灵。矩形精灵与我的矩形具有完全相同的属性,我将我的圆圈设置在舞台中央,也就是这两个矩形的中间。

跟踪矩形的值后,我可以肯定地说矩形与矩形精灵相同。那么当然,如果我想围绕矩形拖动圆圈,它应该保持在它的范围内,对吧?

stop();
var isDragging:Boolean;
import flash.events.MouseEvent;
import flash.geom.Rectangle;
import flash.display.Sprite;
import flash.geom.Point;


var px:Number = boundingBox.x;
var py:Number = boundingBox.y;
var h:Number = boundingBox.height;
var w:Number = boundingBox.width;
var box:Rectangle = new Rectangle(px,py,w,h);
trace(box);

var blob:Sprite = new Sprite();
blob.graphics.beginFill(0x000000);
blob.graphics.lineStyle(1.2, 0xFFFFFF);
blob.graphics.drawCircle(stage.stageWidth/2, stage.stageHeight/2, 18);
blob.graphics.endFill();
addChild(blob);

var box2:Sprite = new Sprite();
box2.graphics.lineStyle(1, 0xFFCC00);
box2.graphics.drawRect(px,py,w,h);
addChild(box2);

blob.addEventListener(MouseEvent.MOUSE_DOWN, drag);

function drag(event:MouseEvent):void {
   event.target.startDrag(false, box);
   isDragging = true

}

好吧,情况似乎并非如此。也许我只是一个菜鸟,但我不知道发生了什么。 当我运行现场时,一切看起来都很正常。

orange/dotted行是我制作的两个矩形,一个是我用来设置我在AS3中制作的矩形属性的影片剪辑(虚线),橙色是AS3 sprite。

圆圈在舞台中间,看起来完全符合我想要的编程方式。

但是我一点它,它就传送到这里来了。

当我尝试拖动它时,似乎盒子的左上角一直向下平移到那个点,它只在舞台的右下象限中拖动,并且甚至拖离屏幕更远。

我不确定我放入 startDrag 函数的矩形是否与实际矩形有某种变形。

我不知道为什么会这样,因为当我尝试使用我添加到舞台上的影片剪辑来执行此操作时,一切正常。但是,一旦我尝试以编程方式执行此操作,一切都会顺利进行。

对于为什么这不起作用,我将不胜感激。感谢阅读。

这是你的问题:

blob.graphics.drawCircle(stage.stageWidth/2, stage.stageHeight/2, 18);

你画这个圆,好像只关心这个圆:

if I wanted to drag the circle around the rectangle, it should stay within the bounds of it, right?

没有。仅仅因为你向 .graphics 添加了一些东西并不意味着 As3 自动知道这是应该留在传递给 startDrag().

的边界 Rectangle 内的东西

留在边界Rectangle内的东西是Sprite的注册点。那个注册点不是 你画圆的地方。实际上,它在您的第一张图片中仍处于默认位置 0/0。我在blob的注册点加了一颗绿星。我还添加了一个连接注册点和您的点的红色矩形。把它想象成你的圆圈和注册点都卡在里面的果冻。这应该有助于说明,仅仅因为你在某处画了一个圆圈并不意味着你只处理那个圆圈:

But as soon as I click on it, it teleports over here.

一点击,startDrag()的移动限制就会生效。注册点必须在您指定的 Rectangle 中,这正是发生的情况。整个红色果冻 blob 移过去,这样绿星就在 Rectangle:

要解决这个问题,首先以合理的方式创建您的 blob,这意味着在 0/0 处围绕注册点绘制圆圈,然后在需要时移动 Sprite 对象将圆圈放在另一个位置。这样,就没有红色的果冻,绿色的星星就在圆的中心。我添加的视觉助手变得多余,因为你对情况的看法现在与实际情况相符。

const RADIUS:Number = 18;
var blob:Sprite = new Sprite();
blob.graphics.beginFill(0x000000);
blob.graphics.lineStyle(1.2, 0xFFFFFF);
blob.graphics.drawCircle(0, 0, RADIUS);
blob.x = stage.stageWidth/2;
blob.y = stage.stageHeight/2;
blob.graphics.endFill();
addChild(blob);

这将使 blob 大部分保持在边界内,或者更准确地说:它的中心点。如果要将整个圆保持在边界内,则必须从边界中减去圆 Rectangle Minkowski-style。貂皮-what?是的...错误,这是一种奇特的说法:使边界 Rectangle 变小半径,这样较小的边界可以应用于半径的中心,以确保整个圆保持在较大的范围内原边界.

在你的情况下 Rectangleinflate() 应该这样做:

var px:Number = boundingBox.x;
var py:Number = boundingBox.y;
var h:Number = boundingBox.height;
var w:Number = boundingBox.width;
var box:Rectangle = new Rectangle(px,py,w,h);
box.inflate(-RADIUS, -RADIUS);
trace(box);