Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 如何阻止MCs切换位置_Actionscript 3 - Fatal编程技术网

Actionscript 3 如何阻止MCs切换位置

Actionscript 3 如何阻止MCs切换位置,actionscript-3,Actionscript 3,我有一个问题,我的电影剪辑切换位置时,我把一个放在另一个上面。应该发生的是,电影剪辑应该返回到其原始位置,除非我放置在指定的特定位置。当我把它放在一个空白点或指定的放置点时,它可以正常工作,只有当我把它放在另一个电影剪辑上时,这两个电影剪辑才会切换位置,并且它们会被弄乱 我尝试过用“mouseEnabled=false”禁用所有内容,并在任何电影剪辑上悬停时将其设置回“mouseEnabled=true”,但它没有响应。有人有线索吗 function Placed(e){ if(e.ta

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

我尝试过用“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返回其原始位置或粘附到指定位置的代码。我认为这是非常清楚的MCs应该做什么给代码,所以我不知道为什么他们决定切换位置时,我把他们放在彼此的顶部

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

当我将MC放置在目标中时,它将保留自身的克隆并禁用拖动的MC。如果我没有将其放置在目标中,则不会留下克隆。我创建了3个MCs,顺序是MC1、MC2、MC3。当我把旧的MC放在新的MC上时,它们会切换位置,比如说我把MC1放在MC2或MC3上,但是当我做相反的事情时,比如说MC3放在MC2或MC1上,什么都不会发生,这对前者来说也是如此

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;
}
导入flash.events.MouseEvent;
导入flash.display.MovieClip;
导入flash.events.Event;
var-xPos:int;
var-yPos:int;
var-temp=0;
变量拖动:显示对象;
//计算金额

对于(var i=1;i您显然缺少标志指示,这使得您的第二个MC被分配了错误的坐标。您需要有一个变量,该变量将包含您现在是否正在拖动MC的信息,这样,如果有,您的MC的开始拖动代码将不会干扰。您在某处分配了
xPos
yPos
,您的代码如下所示:

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();
}
您必须首先检查是否有对象被拖动,如下所示:

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:您可能希望避免为此使用manager类,而是将那些
XPO
YPO
存储在您要移动的MC上。

e.target
替换为
e.currentTarget
,它们仍然会改变位置……我尝试添加了您的建议,但它仍然会互换。然而,我注意到的是3我拥有的MCs,按照我制作它们的MC1、MC2、MC3的顺序,只有当我把旧的MC放在新的MC上时,它们才会交换,比如说MC1到MC3,但是当我做相反的事情,MC3到MC1,什么都不会发生。Hm-m-m。请用
startDrag()的侦听器的代码更新问题
,以及这些侦听器的分配。我的描述只是一个粗略的猜测,但显然是对了一半,因为我假设两个目标都会调用它们的侦听器。我已经将我在示例试用中使用的全部代码按照您建议的方式放置。我仍然对侦听器之类的技术术语感到困惑当谈到编程时,我可能会对你们所指的东西感到困惑。