首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止MC换位

如何阻止MC换位
EN

Stack Overflow用户
提问于 2014-03-28 14:20:20
回答 1查看 56关注 0票数 1

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

当我在任何电影剪辑上悬停时,我试着禁用所有带有"mouseEnabled = false“的设置,并将其设置回"mouseEnabled = true”,但没有响应。有谁有线索吗?

代码语言:javascript
复制
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。当我不把它放在目的地时,就不会留下克隆。我有3个MC3创建的顺序为MC1,MC2,MC3。当我把旧的MC放在新的MC上时,它们会交换位置,比如我把MC1放在MC2或MC3上,但当我反其道而行之时,比如MC3放在MC2或MC1上,什么也不会发生,前者也应该是这样的。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2014-03-28 15:00:51

你显然缺乏标志指示,这使得你的第二个MC被分配了错误的坐标。你需要有一个变量来包含是否有你正在拖动的MC的信息,这样如果有,你的MC的开始拖动代码就不会干扰。你在某个地方分配了xPosyPos,你的代码是这样的:

代码语言:javascript
复制
function someListener(e:MouseEvent):void {
    xPos=e.target.x;
    yPos=e.target.y;
    e.target.startDrag();
}

您必须首先检查是否有对象被拖动,如下所示:

代码语言:javascript
复制
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变量。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22705596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档