2014-01-10 84 views
0

我不知道如何清除它,但:有沒有辦法允許將鼠標事件註冊到數組中的對象?我有多個對象被添加到數組的階段,我想在點擊對象後調用不同的函數?我有這樣的:Flash中的數組中的對象的鼠標事件

 function makeEnemies():void 
    { 
     //create humans 

     var tempEnemy:MovieClip; 
     var wolf:MovieClip; 
     tempEnemy = new Enemy2(); 
     tempEnemy.cacheAsBitmap = true; 
     tempEnemy.speed = 20; 
     tempEnemy.x = Math.round(Math.random() * 800); 
     tempEnemy.y = Math.round(Math.random() * 480); 
     addChild(tempEnemy); 
     enemies.push(tempEnemy); 
    } 

    function moveEnemies():void 
    { 
     var tempEnemy:MovieClip; 
     for (var i:int =enemies.length-1; i>=0; i--) 
     { 
      tempEnemy = enemies[i]; 

      if (tempEnemy.x > stage.stageWidth) 
      { 
       tempEnemy.x = stage.stageWidth; 
      } 

      if (tempEnemy.y > stage.stageHeight) 
      { 
       tempEnemy.y = stage.stageHeight; 
      } 
      tempEnemy.x += Math.round(Math.random() * tempEnemy.speed); 
      tempEnemy.y -= Math.round(Math.random() * tempEnemy.speed); 

       tempEnemy.addEventListener(MouseEvent.CLICK, scoreM); 

     function scoreM(event:MouseEvent):void 
     { 
      makeBite(tempEnemy.x, tempEnemy.y); 
      removeEnemy(i); 
      score++; 
      score_txt.text = String(score); 
     } 

    function removeEnemy(idx:int) 
{ 
    removeChild(enemies[idx]); 
    enemies.splice(idx,1); 
} 

,我得到一個錯誤

TypeError: Error #2007: Parameter child must be non-null. 
    at flash.display::DisplayObjectContainer/removeChild() 
    at veinsVtest_fla::MainTimeline/removeEnemy() 
    at MethodInfo-67() 
+0

我沒有被跨越攜帶,你可以讓自己的監聽器類型,其中你可以通過索引。或者你可以在敵人陣列中循環,並檢查事件==敵人[索引]的擁有者是否刪除那個 –

回答

1

這個工作你不需要一個數組。像雪人一樣說。使用event.currentTarget將指向

tempEnemy.addEventListener(MouseEvent.CLICK, scoreM); 

function scoreM(event:MouseEvent):void 
{ 
    var clickedOnEnemy:MovieClip = event.currentTarget as MovieClip; 

    //Now you have your enemy, do whatever you please with him. 
    makeBite(clickedOnEnemy.x, clickedOnEnemy.y); 

    //And farewell, my enemy ... time to remove him. 
    removeChild(clickedOnEnemy); 
    clickedOnEnemy = null; 

    score++; 
    score_txt.text = String(score); 
} 

「關於敵人按下」 *編輯**

有實行 「removeAllEnemies」 的幾種方法。 做到這一點的一種方法是使用另一個MovieClip來保存所有創建的敵人。

因此,創建一個movieClip並將其添加到舞臺。

var enemiesWrapper : MovieClip = new MovieClip(); 
addChild(enemiesWrapper); 

然後而不是相加的敵人剷除

addChild(tempEnemy); //Instead of doing this 

他們加入到這個影片剪輯代替。

enemiesWrapper.addChild(tempEnemy); //Do this instead 

請注意,您的removeChild之必須進行相應的更新

enemiesWrapper.removeChild(clickedOnEnemy); 

而對於「removeAllEnemies」功能

function removeAllEnemies() { 

    while(enemiesWrapper.numChildren > 0) { 
     enemiesWrapper.removeChildAt(0); 
    } 
} 
+0

謝謝你的作品!但現在它將所有的剪輯留在舞臺上,除非我點擊它們......在我的計時器用完後,我該如何清理? – ryoukos

+0

我只是編輯我的答案。讓我知道這是否適合你,歡呼! :) – Doppio

+0

** + 1 ** @Doppy你好像喜歡我的回答,看起來像當你*喜歡*答案,你* upvote *它:) – Cilan

1

更換removeEnemy(i);removeEnemy(event.currentTarget);

不能刪除一個整數,因爲它不是一個孩子。但是,我假設您要刪除被點擊的影片剪輯,並且它看起來像參數removeEnemy調用removeChild()。如果不是,你介意顯示你的removeEnemy功能嗎?

+0

事實上,我想在點擊時刪除MovieClip並添加一個動作,以便在此時發生。 removeEnemy是'function removeEnemy(idx:int) { \t removeChild(enemies [idx]); \t enemies.splice(idx,1); }' – ryoukos

+0

您需要首先遍歷數組,以便您不訪問不存在的項目 –

+0

我已添加刪除敵方功能的主題 – ryoukos