按钮上的退出框架时,删除拖放对象

时间:2016-03-02 00:44:13

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

我想制作Flash应用程序,允许用户将图片与包含该单词的第一个字母的框匹配。该方法是用目标拖放的。我真的很陌生。

拖放目标到目前为止工作但我的问题是当我移动对象后退出框架时,拖放对象仍然可见。

离开帧时如何删除此对象?

这是我得到的:



import flash.events.MouseEvent;
import flash.display.DisplayObject;

var objectoriginalX:Number;
var objectoriginalY:Number;

a.buttonMode = true;
a.addEventListener(MouseEvent.MOUSE_DOWN, pickupObject);
a.addEventListener(MouseEvent.MOUSE_UP, dropObject);					  

function pickupObject(event:MouseEvent):void
{
	event.target.startDrag();
	event.target.parent.addChild(event.target);
	objectoriginalX = event.target.x;
	objectoriginalY = event.target.y;
}

function dropObject(event:MouseEvent):void
{
	event.target.stopDrag();
	var matchingTargetName:String = "target" + event.target.name;
	var matchingTarget:DisplayObject = getChildByName(matchingTargetName);
	if(event.target.dropTarget != null && event.target.dropTarget.parent == matchingTarget)
	{
		event.target.removeEventListener(MouseEvent.MOUSE_DOWN, pickupObject);
		event.target.removeEventListener(MouseEvent.MOUSE_UP, dropObject);
		event.target.buttonMode = false;
		event.target.x = matchingTarget.x;
		event.target.y = matchingTarget.y;
	}
	else
	{
		event.target.x = objectoriginalX;
		event.target.y = objectoriginalY;
	}
}




先前感谢,任何建议都将受到赞赏

编辑:这是我用来移动到其他场景的代码



HOME1.addEventListener(MouseEvent.CLICK, fl_ClickToGoToScene_15);

function fl_ClickToGoToScene_15(event:MouseEvent):void
{
	MovieClip(this.root).gotoAndStop(2, "Scene 1");
}




1 个答案:

答案 0 :(得分:0)

当您通过代码对时间轴对象执行某些操作以导致父项更改时,该时间轴对象将不再受时间轴控制。

所以当你这样做时:

event.target.parent.addChild(event.target);

(大概是将项目拖到前面),你无意中告诉Flash这个对象现在由代码控制。

解决方案是在完成对象时手动删除对象。这可以使用removeChild(childObject)完成。

由于您可能正在处理可以拖动的多个对象,因此在进入下一帧之前,最简单的方法是手动清除所有子项:

removeChildren(); //remove all children of the current context (timeline)
nextFrame(); //go to the next frame,  or play(); or whatever you want to do

如果您定位的是较旧版本的闪存(少于11个不支持removeChildren方法),您可以在其中执行此操作:

var i:int = numChildren;
while(i--){
    removeChildAt(i);
}

或者,如果您不想清除当前时间轴中的所有孩子,您可以跟踪被拖动的内容并删除这些对象:

var draggedObjs:Array = [];
function pickupObject(event:MouseEvent):void
{
    draggedObjs.push(event.target);
    ...rest of code

然后在准备继续时执行此操作:

for each(obj in draggedObjs){
    removeChild(obj);
}
draggedObjs = [];

nextFrame(); //or whatever

另一个选项是复制单击的项目,将其添加到舞台,然后拖动副本并在鼠标移动时将原始位置与其匹配。拖动完成后,从舞台中删除副本。