单击按钮退出框架时删除拖放对象

Posted

技术标签:

【中文标题】单击按钮退出框架时删除拖放对象【英文标题】:remove drag and drop objects when exit frame on button click 【发布时间】:2016-06-14 16:03:41 【问题描述】:

我想制作一个允许用户将图片与包含单词首字母的框匹配的 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");

【问题讨论】:

如何进入下一帧?当您使用addChild 来作为对象的父对象或重新设置对象时,您需要使用removeChild 来摆脱它。一旦重新设置父级(如果最初在时间轴上设置父级),时间轴将不再影响对象。看起来您可能需要做的就是手动清除所有孩子,然后再继续下一帧removeChildren(); nextFrame(); 我尝试使用按钮单击来移动下一帧。我已经尝试过使用 removeChildren();但它给了我一个错误 1180:调用可能未定义的方法 removeChildren。这里真的需要帮助。谢谢。 您需要出示您的相关代码。更新您的问题并包含您用于转到下一帧的代码。 感谢您的回复,已经更新并包含我用来转到其他场景的代码。非常感谢您的帮助。 removeChildren 仅适用于 Flash Player 11 或更高版本。你输出的是什么版本? 【参考方案1】:

当您通过代码对时间线对象执行导致父级更改的操作时,该时间线对象将不再受时间线控制。

所以当你这样做时:

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

如果你的目标是旧版本的 flash(小于 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

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

【讨论】:

以上是关于单击按钮退出框架时删除拖放对象的主要内容,如果未能解决你的问题,请参考以下文章

单击退出时删除 cookie

在android qtquick中单击后退按钮时应用程序退出

单击两次后退按钮以退出活动

在 FabricJS 画布上拖放和删除对象

如何通过单击一个创建的按钮退出整个应用程序? [复制]

弹出U盘移动硬盘退出时提示被占用怎么解决方法