Flash AS3 - 如何将多个物体拖拽到一个目标上?

3

我想要的示例

标题基本上就是自解释的,我已经通过许多不同的教程进行了学习,但老实说我并不太擅长AS3。 (图像显示了我的目标)

无论如何,在我看到的大多数在线教程中,拖放教程都是基于一个对象到一个目标或多个对象到多个目标的,因此我想知道是否有人足够友好地帮助我解释如何让多个对象连接到一个目标。

如果可能的话,还可以使其可切换,例如,如果当我将对象2拖动过去时,对象1已经放置在目标位置,则对象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;

你可以把所有的雕像放在一个数组里,然后使用 for each...in 语句来检查它们。另外,最好将这里的两个函数合并。 - David
1个回答

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;
    }
}

这是一种更有效的方法!非常感谢你和David!这比我想象的要帮助得多,哈哈,不过很抱歉回复晚了,我有段时间出门了。 - user2160602

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接