2013-03-12 29 views
3

example of what I'm aiming forFlash AS3 - 將多個對象拖放到一個目標上?

標題或多或少是不言自明的,我一直在通過許多不同的教程,我對AS3不太好,完全誠實。 (上圖顯示了我的目標)

無論如何,我在大多數在線教程中看到的拖放教程都基於一個對象到一個目標或多個對象到多個目標,所以我想知道是否有人能夠幫助我,並解釋如何讓多個對象連接到一個目標。

而且,如果可能使其可切換,例如,如果物體1已經就位於目標上,當我拖動物體2時,則物體1返回其原始位置,物體2代替它。

一個更簡單的方法來解釋這是說,我試圖創建一個遊戲,有三個雕像,用戶可以選擇三個之一放置在設定的目標區域。

我很抱歉,如果我說的沒有多大意義,如果這會導致混淆,將清理任何東西。這是我目前使用的AS3代碼。

var startX:int; 
var startY:int; 

circle1_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
circle1_mc.addEventListener(MouseEvent.MOUSE_UP, dropIt); 
circle2_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
circle2_mc.addEventListener(MouseEvent.MOUSE_UP, dropIt); 
circle3_mc.addEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
circle3_mc.addEventListener(MouseEvent.MOUSE_UP, dropIt); 

function pickUp(event:MouseEvent):void { 
    startX = event.target.x; 
    startY = event.target.y; 
    event.target.startDrag(true); 
    event.target.parent.addChild(event.target); 

} 

function dropIt(event:MouseEvent):void { 
    event.target.stopDrag(); 

    var theTargetName:String = "target" + event.target.name; 
    var theTarget:DisplayObject = getChildByName(theTargetName); 
    if (event.target.dropTarget != null && event.target.dropTarget.parent == theTarget){  
     event.target.buttonMode = false; 
     event.target.x = theTarget.x; 
     event.target.y = theTarget.y; 
    } 

else{ 

    event.target.x = startX; 
    event.target.y = startY; 

circle1_mc.buttonMode = true; 
circle2_mc.buttonMode = true; 
circle3_mc.buttonMode = true; 
+0

你可以把所有的雕像在一個陣列中,有一個'每個... in'聲明支票他們全部。另外,最好如果你合併你在這裏的兩個函數。 – David 2013-03-12 12:40:25

回答

5

而不是檢查dropTarget的,你可以使用hitTestObject,看是否被丟棄的對象是「接觸」 theTarget。否則,已經放入theTarget的任何其他物品可能會被報告爲dropTarget。 另外,由於MovieClip是動態的,因此您可以在每個實例中存儲startXstartY值。

以下修改後的代碼將使用單個target_mc作爲放置目標。當一個項目就可以了下降,其他任何物品將被移回原來的點:

// create an array as @David suggested to keep track of your draggable items 
var circles:Array = [circle1_mc, circle2_mc, circle3_mc]; 
for each(var circleMC:MovieClip in circles) 
{ 
    circleMC.addEventListener(MouseEvent.MOUSE_DOWN, pickUp); 
    circleMC.addEventListener(MouseEvent.MOUSE_UP, dropIt); 
    circleMC.startX = circleMC.x; 
    circleMC.startY = circleMC.y; 
} 

function pickUp(event:MouseEvent):void 
{ 
    // no longer need to keep track of startX & startY here because that's already been done up above 
    event.target.startDrag(true); 
    event.target.parent.addChild(event.target); 

} 

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.x = target_mc.x; 
     event.target.y = target_mc.y; 
     // move all circles OTHER than the current target back to their original positions 
     for each(var circleMC:MovieClip in circles) 
     { 
      if(event.target != circleMC) 
      { 
       circleMC.x = circleMC.startX; 
       circleMC.y = circleMC.startY; 
      } 
     } 
    } 
    else 
    { 
     // only need to move the event target back if it was dropped outside of target_mc 
     event.target.x = event.target.startX; 
     event.target.y = event.target.startY; 
     event.target.buttonMode = true; 
    } 
} 
+0

這是一個更有效率的方式去做這件事!非常感謝!你和大衛!這比我想的要多得多,對於遲到的回覆感到抱歉,我已經出去了一段時間。 – user2160602 2013-03-12 19:19:04