如何阻止MC切换位置

时间:2014-03-28 06:20:20

标签: actionscript-3

我的电影剪辑切换位置有问题,当我把它们放在另一个上面时。应该发生的是,影片剪辑应该返回其原始位置,除非我放入我指定的特定位置。当我将它放在一个空白点或指定的丢弃点时,它可以正常工作,只有当我将它放在另一个Movie Clip上时,这两个Movie Clips切换位置并且它们会混乱。

我尝试使用“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();
    }
}

这是可以使MC返回其原始位置或坚持指定位置的代码。我认为很清楚MC会在给出代码的情况下应该做什么,所以我不知道为什么当我把它们放在彼此顶部时他们决定换位置。

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

当我将MC放在目的地时,它会留下自己的克隆并禁用拖动的MC。如果我没有将它放在目的地,那么就不会留下任何克隆。我按照MC1,MC2,MC3的顺序创建了3个MC。当我将较旧的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;
}

1 个答案:

答案 0 :(得分: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上。