2011-03-25 101 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