as3 - addchild with drag and drop

时间:2013-05-28 17:24:40

标签: actionscript-3 flash actionscript

我正在尝试将一个对象的子实例添加到舞台上,然后允许用户在舞台上拖放此对象(在本例中为影片剪辑)。但是,我收到以下错误:

  

TypeError:错误#1009:无法访问空对象引用的属性或方法。       at working_copy_fla :: MainTimeline / dragObject()

所以,这是我的第一个问题。那么第二个问题是,我还没有找到关于如何使子对象(特别是影片剪辑)能够在舞台上正确拖放的答案。

这是我的代码:

// Allow buttons to bring objects to the stage
myButton.addEventListener(MouseEvent.CLICK, addImage);

function addImage(event:MouseEvent):void
{
    var myImage:Image_mc = new Image_mc();
    stage.addChild(myImage);
    // Center the object
    myImage.x = 300;
    myImage.y = 300;


    // Allow the object to be drag and dropped  
    myImage.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    myImage.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}

function startDragging(event:MouseEvent):void
{
    event.target.x = event.target.parent.mouseX - event.target.mouseX
    event.target.y = event.target.parent.mouseY - event.target.mouseY

    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject);
}

function dragObject(event:MouseEvent):void
{
    event.target.x = event.target.parent.mouseX - event.target.mouseX
    event.target.y = event.target.parent.mouseY - event.target.mouseY
}

function stopDragging(event:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject);
}

修改

我想通了,解决方案就像在Adobe Flash中查看示例代码一样简单(使用CS6)。这是我现在的代码:

// Allow buttons to bring objects to the stage
myButton.addEventListener(MouseEvent.CLICK, addImage);

function addImage(event:MouseEvent):void
{
    var myImage:Image_mc = new Image_mc();
    stage.addChild(myImage);
    // Center the object
    myImage.x = 300;
    myImage.y = 300;


    // Allow the object to be dragged
    myImage.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag);
}

function clickToDrag(event:MouseEvent):void
{
    event.target.startDrag();
}

stage.addEventListener(MouseEvent.MOUSE_UP, releaseToDrop);

function releaseToDrop(event:MouseEvent):void
{
    event.target.stopDrag();
}

这里的关键是我创建了通用函数(clickToDrag和releaseToDrop),它将接受来自任何对象的输入(因此我可以将这些函数与我添加到舞台上的其他图像一起使用)。此代码适用于舞台上的多个孩子(所有孩子都可以随时拖放)。

我现在遇到的唯一问题是,每当我生成一个子元素时(通过单击 myButton 按钮实例),我都会收到此错误:

ReferenceError: Error #1069: Property stopDrag not found on flash.display.SimpleButton and there is no default value.
    at working_copy_fla::MainTimeline/releaseToDrop()

此错误并未阻止应用程序正常工作;一切都还好。但我仍想弄清楚为什么会出现这种错误。我的猜测是,使用“stopDrag”(应该只是一个影片剪辑)无法使用该方法。

2 个答案:

答案 0 :(得分:0)

event.target.x = event.target.parent.mouseX - event.target.mouseX

上面的代码假设'event.target'是舞台,对(因为你将监听器添加到舞台上)?所以你试图改变舞台的x / y?不可以.start / startDragging应该引用被拖动的对象,可以作为私有类变量使用,该变量对于dragObject方法是可见的。此外,舞台的父母是什么('event.target.parent.mouseX')?舞台上没有父母。这可能是“空对象引用”所引用的内容。

修改

我习惯于面向对象的AS3(强烈推荐),但我猜测“时间轴”上的编程应该有效。在函数之外声明一个变量,如:

var objectCurrentDragging:DisplayObjectContainer;

然后在“addImage”函数中,使用以下代码使objectCurrentDragging引用要拖动的对象:

objectCurrentDragging = myImage;

然后在dragObject函数中,只需引用objectCurrentDragging:

objectCurrentDragging.x = ...

希望能帮到你。

答案 1 :(得分:0)

所以我终于明白了。关键是不要向舞台添加事件,而是将“releaseToDrop”函数添加到子元素上的* MouseEvent.MOUSE_UP *事件中,该函数将其添加到舞台中。现在我没有错误,它可以在舞台上使用子对象(影片剪辑)的多个实例。

以下是有效的代码:

// Allow buttons to bring objects to the stage
myButton.addEventListener(MouseEvent.CLICK, addImage);

function addImage(event:MouseEvent):void
{
    var myImage:Image_mc = new Image_mc();
    stage.addChild(myImage);
    // Center the object
    myImage.x = 300;
    myImage.y = 300;


    // Allow the object to be dragged
    myImage.addEventListener(MouseEvent.MOUSE_DOWN, clickToDrag);
    myImage.addEventListener(MouseEvent.MOUSE_UP, releaseToDrop);
}

function clickToDrag(event:MouseEvent):void
{
    event.target.startDrag();
}

function releaseToDrop(event:MouseEvent):void
{
    event.target.stopDrag();
}