简单的拖放到目标as3

时间:2014-09-05 04:34:07

标签: actionscript-3 flash drag-and-drop drag target

我想制作一个可拖动的movieclip目标另一个movieclip(放置目标)。

它不需要具有可重用的功能(即event.target不需要),并且它不需要是数组的一部分。

我无法理解为什么下面的代码无法正常工作。我尝试在地方尝试使用赋值符号(=)而不是等号(==),但这没有区别。

任何反馈都非常感谢。

//Creating variables to store original x/y position of draggable movieclip (my_mc2):
var startX:Number;
var startY:Number;

//Enabling hand cursor over draggable mc:
my_mc2.buttonMode = true;

//Adding event listeners for mouse up and mouse down.
my_mc2.addEventListener(MouseEvent.MOUSE_DOWN, drag);
my_mc2.addEventListener(MouseEvent.MOUSE_UP, drop);

//Drag function (mouse down):
function drag(event:MouseEvent):void {
startX = my_mc2.x;
startY = my_mc2.y;
my_mc2.startDrag();
}

//Drop function (mouse up):
function drop(event:MouseEvent):void {
my_mc2.stopDrag();
if (my_mc2.x == target_mc2.x && my_mc2.y == target_mc2.y) {
    my_mc2.removeEventListener(MouseEvent.MOUSE_DOWN, drag);
    } else {
    my_mc2.x == startX;
    my_mc2.y == startY;
    }
}

3 个答案:

答案 0 :(得分:1)

您希望target_mc2成为my_mc2目标。 my_mc2target_mc2几乎没有机会获得完全相同的坐标。因此,您应该决定target_mc2周围的区域。

my_mc2.buttonMode = true;
var startX:int = my_mc2.x;
var startY:int = my_mc2.y;
const D:int = 20;

function drag(e:MouseEvent):void {
    e.target.startDrag();
}

function drop(e:MouseEvent):void {
    stopDrag();
    if (my_mc2.x > target_mc2.x - D && my_mc2.x < target_mc2.x + D && my_mc2.y > target_mc2.y - D &&  my_mc2.y < target_mc2.y + D) {
        my_mc2.x = target_mc2.x;
        my_mc2.y = target_mc2.y;
    } else {
        my_mc2.x = startX;
        my_mc2.y = startY;
    }
}

my_mc2.addEventListener(MouseEvent.MOUSE_DOWN, drag);
addEventListener(MouseEvent.MOUSE_UP, drop);

答案 1 :(得分:0)

我用替代代码回答了我自己的问题 - 尽管我仍然不清楚为什么以前的代码不起作用。我想这与其中任何一个有关:     if(my_mc2.x == target_mc2.x&amp;&amp; my_mc2.y == target_mc2.y)....     my_mc2.x == startX;     my_mc2.y == startY;

无论如何,对于任何其他AS3新手来说,寻找一个简单的解决方法,这对我有用。 (是的,这是一种可重复使用的功能,更好的做法。)

circleMC.addEventListener(MouseEvent.MOUSE_DOWN, pickUp);
circleMC.addEventListener(MouseEvent.MOUSE_UP, dropIt);
circleMC.startX = circleMC.x;
circleMC.startY = circleMC.y;
circleMC.buttonMode = true;

function pickUp(event:MouseEvent):void{
// no longer need to keep track of startX & startY here as already been done above
event.target.startDrag(true);
}

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.removeEventListener(MouseEvent.MOUSE_DOWN, pickUp);
    }
    else
    // move back to original position
    {
    circleMC.x = circleMC.startX;
    circleMC.y = circleMC.startY;
    }
}

答案 2 :(得分:0)

再次感谢helloflash你的答案。

只是想为其他人尝试更新此主题....

当您测试它时,如果您将对象拖离(或触摸)舞台的边缘,它将不再将自身重新定位到其原始坐标。

要解决此问题,请创建一个边界框以限制可以拖动的位置。这个盒子比舞台小。准确的尺寸将需要一些反复试验才能适合您的项目。虽然这很容易做到。在startDrag第二个属性中添加一个新矩形(false,new Rectangle(startx,starty,rectanglewidth,rectangleheight),如下所示:

function drag(e:MouseEvent):void {
e.target.startDrag(false, new Rectangle (200, 200, 600, 300));
}