2014-09-05 75 views
1

我想製作一個可拖動的movieclip目標另一個movieclip(放置目標)。簡單的拖放到目標as3

它不需要有一個可重用的函數(即event.target不是必需的),它不需要是數組的一部分。

我看不到爲什麼下面的代碼不起作用。我試過在地方使用賦值符號(=)而不是等號(==),但這沒有什麼區別。

任何反饋非常讚賞。

//Creating variables to store original x/y position of draggable movieclip (my_mc2): 
var startX:Number; 
var startY:Number; 

//Enabling hand cursor over draggable mc: 
my_mc2.buttonMode = true; 

//Adding event listeners for mouse up and mouse down. 
my_mc2.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
my_mc2.addEventListener(MouseEvent.MOUSE_UP, drop); 

//Drag function (mouse down): 
function drag(event:MouseEvent):void { 
startX = my_mc2.x; 
startY = my_mc2.y; 
my_mc2.startDrag(); 
} 

//Drop function (mouse up): 
function drop(event:MouseEvent):void { 
my_mc2.stopDrag(); 
if (my_mc2.x == target_mc2.x && my_mc2.y == target_mc2.y) { 
    my_mc2.removeEventListener(MouseEvent.MOUSE_DOWN, drag); 
    } else { 
    my_mc2.x == startX; 
    my_mc2.y == startY; 
    } 
} 

回答

1

你想target_mc2my_mc2目標。 my_mc2target_mc2獲得完全相同的座標的可能性很小。因此,您應該決定圍繞target_mc2的區域。

my_mc2.buttonMode = true; 
var startX:int = my_mc2.x; 
var startY:int = my_mc2.y; 
const D:int = 20; 

function drag(e:MouseEvent):void { 
    e.target.startDrag(); 
} 

function drop(e:MouseEvent):void { 
    stopDrag(); 
    if (my_mc2.x > target_mc2.x - D && my_mc2.x < target_mc2.x + D && my_mc2.y > target_mc2.y - D && my_mc2.y < target_mc2.y + D) { 
     my_mc2.x = target_mc2.x; 
     my_mc2.y = target_mc2.y; 
    } else { 
     my_mc2.x = startX; 
     my_mc2.y = startY; 
    } 
} 

my_mc2.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
addEventListener(MouseEvent.MOUSE_UP, drop); 
+0

對不起,看起來代碼出現在調試窗口中,作爲錯誤原因1009正在出現,作爲成功的drop函數的一部分,我的時間線跳轉(gotoAndPlay)。從那時起,任何時候我點擊SWF中的舞臺(或其上的任何東西),輸出告訴我我有錯誤1009,並指向調試控制檯指向特定的行,在你的代碼示例中上面是'if'行。說實話,我在另一個文件中看到了這個,所以我決定重新開始。任何意見讚賞。 – hangoJango 2014-09-08 13:19:44

+0

順便說一句,我已經追蹤了該功能的'如果'部分的所有內容。沒有什麼是空的。 – hangoJango 2014-09-08 13:32:25

+0

耶!找到了答案(但我不知道它背後的理論)。我需要在時間軸中擴展拖放對象(上例中爲my_mc2和target_mc2),以便稍後單擊此階段時它們仍然存在。爲了解決這個問題,我只是將他們的可見屬性設置爲false。這是一條學習曲線! – hangoJango 2014-09-08 13:42:32

0

我回答我自己的問題與替代代碼 - 雖然它仍然不清楚爲什麼以前的代碼將無法正常工作。我猜這跟這兩者中的任何一個有關: if(my_mc2.x == target_mc2.x & & my_mc2.y == target_mc2.y).... my_mc2.x == startX; my_mc2.y == startY;

無論如何,對於任何其他AS3新手尋找一個簡單的解決方法,這對我有用。 (是的,這是一個可重複使用的功能,更好的做法。)

circleMC.addEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
circleMC.addEventListener(MouseEvent.MOUSE_UP, dropIt); 
circleMC.startX = circleMC.x; 
circleMC.startY = circleMC.y; 
circleMC.buttonMode = true; 

function pickUp(event:MouseEvent):void{ 
// no longer need to keep track of startX & startY here as already been done above 
event.target.startDrag(true); 
} 

function dropIt(event:MouseEvent):void{ 
event.target.stopDrag(); 
// check to see if the event target is touching target_mc using hitTestObject 
if(event.target.hitTestObject(target_mc)){ 
    event.target.buttonMode = false; 
    event.target.removeEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
    } 
    else 
    // move back to original position 
    { 
    circleMC.x = circleMC.startX; 
    circleMC.y = circleMC.startY; 
    } 
} 
+0

對於任何閱讀後,我去與helloflash的建議,但也不得不創建一個邊界框,並確保我的拖放對象在時間線的其餘部分擴展,否則文件會出現問題,請參見上面的註釋 – hangoJango 2014-09-08 13:45:15

0

再次感謝helloflash爲您的答案。

只是想更新這個主題爲別人想出來....

當你測試它,如果你拖動對象關閉(或觸摸)舞臺的邊緣,它不再重新定位自身到其原始座標。

爲了解決這個問題,創建一個邊界框來限制它可以被拖動的位置。這個盒子會比舞臺小。確切的尺寸將需要一些試驗和錯誤,以適應您的項目。儘管如此,這很容易。在的startDrag第二個屬性(假,新的Rectangle(startx的,starty,rectanglewidth,rectangleheight)中添加一個新的長方形,就像這樣:

function drag(e:MouseEvent):void { 
e.target.startDrag(false, new Rectangle (200, 200, 600, 300)); 
}