2016-01-21 55 views
0

我制作了一个矩形,一个矩形精灵和一个圆形精灵。矩形精灵具有与我的矩形完全相同的属性,并且我将我的圆定位在舞台的中心,这是这两个矩形的中间。我的startDrag矩形不是我设置的位置

在追踪矩形的值后,我可以放心地说矩形与矩形精灵一样。那么当然,如果我想拖动矩形周围的圆,它应该保持在它的范围内,对吧?

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 

} 

那么这似乎并非如此。也许我只是一个noob,但我不知道发生了什么。 当我运行场景时,一切看起来都很正常。

Preclick

橙色/虚线是两个矩形我提出,一种是我用于设置我在AS3(虚线)制成的矩形的属性的影片剪辑和橙色是AS3精灵。

圆圈处于舞台中间,它看起来完全像我想要编程的样子。

但是,只要我点击它,它就会在这里传送。

pls fix

当我试图拖动它,它看来,如果框的左上角已经被翻译到该点一路下跌那里,它只是拖在右下象限各地这个舞台,甚至还在屏幕外进一步拖延。

我不确定是否将我放入startDrag函数的矩形与实际矩形扭曲。

我不知道为什么会发生这种情况,因为当我试图使用我添加到舞台上的影片剪辑来做到这一点时,一切正常。但只要我尝试以编程的方式来完成,一切都会顺利进行。

我很感激为什么这不起作用的一些帮助。谢谢阅读。

回答

1

有你的问题:

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

你画这个圈,似乎只关心圆:

,如果我想拖周围的矩形,它应该保持在它的范围内,对吗?仅仅因为你补上一到.graphics并不意味着AS3

号自动地知道,这是我应该保持这种真实传递给startDrag()边界Rectangle内。

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

image 1 with guides

但是,只要我点击它,它就会在这里传送。

只要您点击,将应用startDrag()的移动限制。注册点必须位于您指定的Rectangle,这正是发生的情况。整个红色果冻blob上移动,使绿星是在Rectangle

image 2 with guides

为了解决这个问题,首先是在一个合理的方式创建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大部分或者更准确地说:其中心点。如果要将整个圆圈保留在边界内,则必须从边界上减去闵可夫斯基风格的圆圈。水貂-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);