2016-01-21 37 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);