2016-03-02 19 views
-1

我想制作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); \t \t \t \t \t 
 

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

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

感谢,任何建议将理解

编辑:这是我使用移动到其他场景

代码

HOME1.addEventListener(MouseEvent.CLICK, fl_ClickToGoToScene_15); 
 

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

+0

你如何进入下一帧?当你使用addChild来父对象或重新对象时,你需要使用'removeChild'来除掉它。一旦重新设置(如果最初在时间轴上为父),时间线将不再影响对象。看起来你可能需要做的就是在移动到下一帧removeChildren()之前手动清除所有的孩子。 nextFrame();'。 – BadFeelingAboutThis

+0

我尝试使用按钮单击来移动下一帧。我已经尝试使用removeChildren();但它给了我一个错误1180:调用一个可能未定义的方法removeChildren。真的需要帮助。谢谢。 –

+0

你需要显示你的相关代码。更新你的问题,并包括你用来转到下一帧的代码。 – BadFeelingAboutThis

回答

0

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

所以,当你这样做:

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

(大概是为了使该项目被拖到前面),你无意中告诉闪存,这种对象是通过代码控制现在。

解决方案是在完成对象代码后手动删除对象。这可以通过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); 
} 

另外,如果你不希望清除当前时间轴的孩子,你可以只是跟踪什么是b eing上拖动和删除这些对象:

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 

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