【问题标题】: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 或更高版本。你输出的是什么版本?

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


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多