我正在尝试将一个对象的子实例添加到舞台上,然后允许用户在舞台上拖放此对象(在本例中为影片剪辑)。但是,我收到以下错误:
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”(应该只是一个影片剪辑)无法使用该方法。
答案 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();
}