2011-03-25 102 views
1

我正在为学校开发一个简单的Flash游戏。在一个等级中,多个敌人产生并且玩家应该射击它们。我使用removeChild()来摆脱射击的敌人,但是当我点击(击中)一个敌人时,我的舞台上的所有东西都会被移除;它完全空白。AS3 - removeChild()删除舞台上的所有内容

功能来填充我的舞台与敌人如下:

private function Game2():void{ 
    for (var i:uint=0; i<50; i++) { 

     var man:MovieClip = new man_mc(); 
     man.x=Math.random()*750; 
     man.y=Math.floor(Math.random()*(70))+350; 
     addChild(man); 
     man.addEventListener(MouseEvent.CLICK, getroffen); 
    } 

功能“getroffen”检查,如果敌人腹背受敌:

public function getroffen(evt:MouseEvent):void{ 
      trace("hit"); 
      this.parent.removeChild(this); 

} 

的困惑类在这里,为什么它删除在舞台上的一切,而不是去除我点击的敌人。任何帮助?非常感谢。

回答

7

取决于getroffen()是哪里,你正在删除该类(this指向当前的作用域对象),所以我猜它可能是Main类。

您需要在remove函数做这样的事情:

var man:MovieClip = evt.target as MovieClip; 
man.parent.removeChild(man); 
+0

谢谢。这工作正常。你能解释一下Tim S.提供的代码有什么不同吗?我比他们更了解他的代码,但他们似乎都能做到这一点。 – cabaret 2011-03-25 15:05:34

+0

它们在功能上都是等效的。唯一的区别是他使用'currentTarget'参数(可能更好)而不是'target'参数。区别在于事件模型的工作原理以及注册事件侦听器的人员。我所做的只是将目标投射到一个“MovieClip”(你可以添加一个检查来查看它是否为空,然后如果你愿意的话可以返回),然后调用它的“父”来删除它。当你将一个DisplayObject添加到另一个DisplayObject时,它就成为该对象的子对象,并且它的父参数集被设置。所以'obj.parent.removeChild(obj)'是一个简单的方法来移除它 – divillysausages 2011-03-25 16:42:31

+0

至于'target'和'currentTarget'的区别,flash中的'Event'模型有3个阶段:捕获阶段,事件阶段,和冒泡阶段。当显示列表中的一个对象发送一个事件时,它将发送到'Stage-> parent-> parent-> parent-> child',其中'child'是调度事件的对象,'parent'是每个父'DisplayObject',所有到“舞台”的方式。直到最后一个“父母”我们处于捕获阶段。当我们到达“孩子”时,我们处于事件阶段。之后,活动再次回到'舞台'。这是冒泡阶段 – divillysausages 2011-03-25 16:45:48

3

而不是this.parent.removeChild(this)尝试:

evt.currentTarget.parent.removeChild(evt.currentTarget); 

这应该做的伎俩!

事件(mouseEvent)是你的一个敌人的'孩子',因此移除mouseEvent的目标将消除敌人。

+0

感谢。那就是诀窍。你能解释一下代码的含义吗?我了解evt.currentTarget,但是我不知道'父'来自哪里。其余的也很容易理解。非常感谢! – cabaret 2011-03-25 15:02:42

+1

我很抱歉,我还没有回答过此。 MouseEvent的“currentTarget”是您为EventListener分配的对象。因为我想删除那个对象,所以我必须首先访问它的父项以使其删除他的子项。 – 2011-09-23 13:25:26