我的 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
变小半径,这样较小的边界可以应用于半径的中心,以确保整个圆保持在较大的范围内原边界.
在你的情况下 Rectangle
的 inflate()
应该这样做:
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);
我制作了一个矩形、一个矩形精灵和一个圆形精灵。矩形精灵与我的矩形具有完全相同的属性,我将我的圆圈设置在舞台中央,也就是这两个矩形的中间。
跟踪矩形的值后,我可以肯定地说矩形与矩形精灵相同。那么当然,如果我想围绕矩形拖动圆圈,它应该保持在它的范围内,对吧?
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
变小半径,这样较小的边界可以应用于半径的中心,以确保整个圆保持在较大的范围内原边界.
在你的情况下 Rectangle
的 inflate()
应该这样做:
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);