【问题标题】:ActionScript 3 Drag and DropActionScript 3 拖放
【发布时间】:2013-11-08 15:27:41
【问题描述】:

我有这个 AS3 代码:

circle_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
square_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
stage.addEventListener(MouseEvent.MOUSE_UP, drop);

function drag(e:MouseEvent):void
{
     e.target.startDrag(false, new Rectangle(30,30,150,150));
}

function drop(e:MouseEvent):void
{
     stopDrag();
}

现在,如果我测试电影,如果我单击圆形或正方形,它们将跳入舞台,因为我不允许将它们移出那个矩形。

  1. 我希望脚本允许我将形状拖动到任何地方(当 MOUSE_DOWN 事件处于活动状态时),但仍然不允许我将它们从其中拖放出来(在 MOUSE_UP 上)。

  2. 如何使用对象而不是矩形舞台?

【问题讨论】:

  • 那么,您希望能够在舞台上的任意位置拖动圆形和方形,但只能在定义的矩形中停止拖动它们?

标签: actionscript-3 flash-cs5


【解决方案1】:

制作一个名为 target_mc 的影片剪辑,在其中绘制一个 150x150 的矩形形状,并将其放置在舞台上 x=30 和 y=30 处(这将替换代码 new Rectangle(30,30,150,150) 中的矩形)。 现在试试这段代码,如果拖拽的对象没有放到正确的位置,它会将拖拽的对象放回原来的位置。你可以使用其他任何形状的对象来限制可拖放的区域。

circle_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
square_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
stage.addEventListener(MouseEvent.MOUSE_UP, drop);

var draggedObject:Object;
function drag(e:MouseEvent):void
{
    draggedObject = e.target;
    draggedObject.orginalX = draggedObject.x;
    draggedObject.orginalY = draggedObject.y;
    draggedObject.startDrag(false);
}

function drop(e:MouseEvent):void
{
    stopDrag();

    // target_mc is the name of the object you want to allow dropping over it only,
    // it can be a movieclip with any shape inside it (rectangle or any other irregular shape).
    // if you like you can make it invisible by setting its alpha to 0  (target_mc.alpha = 0;)

    // Check if the mouse is over the target object at the dropping moment :
    if (target_mc.hitTestPoint(stage.mouseX,stage.mouseY,true))
    {
        trace("it was dropped INSIDE the target area");
        // ...
    }
    else
    {
        trace("it wa dropped OUTSIDE the target area");
        // bring the dragged movie back to its orginal place,
        // so it will not be able to be dropped outside your target area :
        draggedObject.x = draggedObject.orginalX;
        draggedObject.y = draggedObject.orginalY;
    }
}

【讨论】:

    【解决方案2】:

    嘿,我遇到了这段代码。改过来不是更好吗

       if (target_mc.hitTestPoint(stage.mouseX,stage.mouseY,true))
        {
            trace("it was dropped INSIDE the target area");
            // ...
        }
    

     if (target_mc.hitTestPoint(draggedObject.x,draggedObject.y,true))
        {
            trace("it was dropped INSIDE the target area");
            // ...
        }
    

    第一个,如果你用鼠标点击,将触发代码,即使你没有拖动对象。 最后一个将确保拖动的对象击中目标,而不是确保鼠标击中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2013-03-22
      • 1970-01-01
      • 2014-10-24
      • 2018-01-13
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多