2014-03-28 43 views
1

当我将它们放在另一个位置时,我的电影剪辑切换位置出现问题。应该发生的是电影剪辑应该返回到原来的位置,除非我放在我分配的特定位置。当我将它放在空白处或指定的放置点时,它工作正常,只有当我将它放在另一个影片剪辑上时,这两个影片剪辑才会切换位置,并且它们会变得混乱。如何停止MCs转换位置

我试着禁用所有与“mouseEnabled = false”,并将其设置回“mouseEnabled = true”当我悬停在任何电影剪辑,但它没有回应。任何人都有线索?

function Placed(e){ 
    if(e.target.hitTestObject(Destination)) { 
     e.target.stopDrag(); 
     e.target.enabled = false; 
     e.target.mouseEnabled = false;  
    } 

    else { 
     e.target.x = xPos; 
     e.target.y = yPos; 
     e.target.stopDrag(); 
    } 
} 

这是代码,可以让MCs回到原来的位置或坚持到指定地点。我认为它清楚地知道MC应该怎么做,因此我不知道为什么他们决定在将它们放在彼此顶部时切换位置。

编辑*:我会将我的整个代码发布在这句话下面,它可能有助于更好地理解可能会出现什么问题。这段代码已经有Vesper和null.point3r的想法,但仍然没有解决问题。

当我将MC放入目标中时,它将自行克隆并禁用拖动的MC。当我没有把它放到目的地时,就没有克隆。我有3个MC以MC1,MC2,MC3的顺序创建。当我把旧的MC放在新的MC上时,他们会切换位置,比如我把MC1放在MC2或MC3的上面,但是当我做相反的事情时,比如说MC3或MC1上面的MC3,什么都不会发生,前者应该是这样以及。

import flash.events.MouseEvent; 
import flash.display.MovieClip; 
import flash.events.Event; 

var xPos:int; 
var yPos:int; 
var temp = 0; 
var Drag:DisplayObject; 

//Count for Amount MCs 
for (var i=1; i<4; i++) 
{ 
    this["Amount" + i].addEventListener(MouseEvent.MOUSE_DOWN, CheckDrag); 
    this["Amount" + i].addEventListener(MouseEvent.MOUSE_UP, Placed); 
    this["Amount" + i].buttonMode = true; 
} 

//Gets original position of selected Amount and allows dragging 
function Trace(e){ 
    getPosition(e.target); 
    e.target.startDrag(); 
} 

//Stores original position of selected/dragged Amount 
function getPosition(target:Object):void{ 
    xPos = target.x; 
    yPos = target.y; 
} 

//Check if a MC is being dragged 
function CheckDrag(e){ 
    if(Drag != null) return; 
    Drag = e.target; 
    Trace(e); 
} 

//Checks if placed in Ledger, returns to original position if false 
function Placed(e){ 
    if(Drag == null) return; 

    //Add Child on Mouse_UP 
    var Xtra:Class = getDefinitionByName(getQualifiedClassName(e.currentTarget)) as Class; 
    var Extra:MovieClip = new Xtra(); 
    this.addChildAt(Extra,1); 
    Extra.x = xPos; 
    Extra.y = yPos; 

    //Disable Drag of selected Amount and set position in Desitnation 
    if(e.target.hitTestObject(Destination)){ 
      e.currentTarget.stopDrag(); 
      e.currentTarget.enabled = false; 
      e.currentTarget.mouseEnabled = false;  
    } 

    //Return Amount to original position and remove Child 
    else{ 
     e.currentTarget.x = xPos; 
     e.currentTarget.y = yPos; 
     e.currentTarget.stopDrag(); 
     removeChild(Extra); 
    } 
    Drag = null; 
} 
+0

用'e.currentTarget'取代'e.target'' –

+0

它们仍然改变地方... – IceCue

回答

0

你显然没有标志指示,这会让你的第二个MC得到错误的坐标。你需要有一个变量来包含你现在正在拖动的MC是否有信息,这样如果有的话,你的MC的开始拖动代码不会产生干扰。你有xPosyPos分配的地方,和你的代码做这样的:

function someListener(e:MouseEvent):void { 
    xPos=e.target.x; 
    yPos=e.target.y; 
    e.target.startDrag(); 
} 

你必须先检查是否有被拖动的对象,像这样:

var draggedObject:DisplayObject; 
function someListener(e:MouseEvent):void { 
    if (draggedObject!=null) return; 
    //^this means something is being dragged, this clip shouldn't react 
    draggedObject=e.target; 
    xPos=e.target.x; 
    yPos=e.target.y; 
    e.target.startDrag(); 
} 

然后,一旦你即将停止拖动,请清除draggedObject变量。

function Placed(e){ 
    if (draggedObject==null) return; // safety precaution 
    if(e.target.hitTestObject(Destination)) { 
     e.target.stopDrag(); 
     e.target.enabled = false; 
     e.target.mouseEnabled = false;  
    } 
    else { 
     e.target.x = xPos; 
     e.target.y = yPos; 
     e.target.stopDrag(); 
    } 
    draggedObject=null; 
} 

PS:你可能想避免使用管理器类此,而是存储这些xPosyPos上,你移动MC。

+0

我试着添加你的建议,它仍然是交换。然而,我注意到的是,我有3个MC,按照我制作的MC1,MC2,MC3的顺序,只有当我把旧的MC放在新的MC上面时,他们才会互换,比如说MC1到MC3 ,但是当我做相反的事情时,MC3到MC1没有任何反应。 – IceCue

+0

Hm-m-m。请用'startDrag()'的侦听器的代码和这些侦听器的分配来更新问题。我的描述是疯狂的猜测,但显然这是对的,因为我认为两个目标都可以让他们的听众打电话。 – Vesper

+0

我已经将我在示例试用中使用的所有代码放在一起,并按照您的建议方式进行操作。在编程方面,我仍然对诸如听众之类的技术术语感到困惑,所以我可能会迷失于你所指的内容。 – IceCue