2012-12-05 78 views
3

我有一個類Catcher,它可以讓你控制遊戲中的動畫片段。我正在嘗試編寫遊戲,以便完成並且可以重新啓動。所以我需要刪除所有內容並返回菜單。應該是一個簡單的事情來解決,但我似乎無法瞭解如何。AS3:如何正確刪除movieclip而沒有錯誤1009溢出?

到目前爲止,我只有ourCatcher.parent.removeChild(ourCatcher);從舞臺上刪除我的movieclip。還有一條if語句,用於阻止將事物放到舞臺上的功能之一。 SoundMixer.stopAll();停止音樂。然後,我將它轉到第3幀這是遊戲畫面。

它看起來很好,但我得到不斷1009錯誤溢出錯誤控制檯中,當我重新啓動遊戲,它超慢。似乎Catcher內移動的功能仍然在運行併產生錯誤,因爲Catcher從舞臺上移開,現在爲空。

我知道我需要取消引用一切與捕手,但我無法找到任何文檔在線做我的情況。每個人似乎都有不同的方法,我嘗試過並且不工作。

在麥田類中的兩個功能我用移動的字符:

public function Catcher(stageRef:Stage) 
    { 
     stop(); 
     this.stageRef = stageRef; 
     key = new KeyObject(stageRef); 


     addEventListener(Event.ENTER_FRAME, loop, false, 0, true); 
    } 

    //movement 
    public function loop(e:Event):void 
    {   
     if (key.isDown(Keyboard.A)) 
       vx -= walkSpeed; 

     else if (key.isDown(Keyboard.D)) 
       vx += walkSpeed; 

     else 
       vx *= friction; 

     //update position 
     x += vx; 

     //speed adjustment 
     if (vx > maxspeed) 
      vx = maxspeed; 
     else if (vx < -maxspeed) 
      vx = -maxspeed; 

     //stay inside screen 
     if (x > stageRef.stageWidth) 
     { 
      x = stageRef.stageWidth; 
      vx = -vx 
     } 

     else if (x < 0) 

     { 
      x = 0; 
      vx = -vx; 
     } 


     if (key.isDown(Keyboard.A)) 
     { 
      scaleX = -1; 
     } 

     else if (key.isDown(Keyboard.D)) 
     { 
      scaleX = 1; 
     } 

     movement(); 

     // Jumping 
     jump += gravity; 

     if (y > stage.stageHeight /1.5) 
     { 
      jump = 0; 
      canJump = true; 
     } 

     if (key.isDown(Keyboard.SPACE) && canJump) 
     { 
      jump = -10; 
      canJump = false; 
     } 

     y += jump; 


    } 

在那裏我從舞臺上刪除的東西被稱爲CatchingGame其他類,它有其刪除函數對象,我把遊戲放在代碼裏面,當playerlives == 0時。

if (playerLives == 0) 
       { 
       stop(); 
       ourCatcher.parent.removeChild(ourCatcher); 
       SoundMixer.stopAll(); 
       gotoAndStop(3); 
       } 

我可能犯了一個小錯誤,因爲這是我的第一個flash遊戲。任何幫助都非常感謝,因爲這幾乎是完成我的遊戲的最後一步。

回答

0

而不是通過引用它的父親去除自己(我不得不測試以確保這實際上工作)去除孩子。在創建/實例化Catcher的相同位置創建一個函數,首先刪除eventListener的ENTER_FRAME,然後刪除Catcher。

if (playerLives == 0) { 
    stop(); 
    removeCatcher(); 
    SoundMixer.stopAll(); 
    gotoAndStop(3); 
} 

// new location in the main code where the catcher is created 
function removeCatcher():void { 
    ourCatcher.cleanUp(); 
    removeChild(ourCatcher); 
} 

// in the Catcher class 
function cleanUp():void { 
    removeEventListener(Event.ENTER_FRAME, loop); 
} 
+0

嘿,感謝您的快速響應。這確實擺脫了1009錯誤,但現在我得到了2025錯誤。 ArgumentError:錯誤#2025:提供的DisplayObject必須是調用者的子項。我想我可能會把事情混淆在錯誤的地方。 \t在flash.display使用::級DisplayObjectContainer/removeChild之() \t在CatchingGame/removeCatcher() \t在CatchingGame/moveObjects() – Zimbozo

+0

你的地方在那裏存在之外取出孩子。確保removeCatcher位於您創建它的相同框架中 – Gone3d

+0

並且它在創建它的父代中,如果父代也是類。 – Gone3d

0
if (ourCatcher.parent) ourCatcher.parent.removeChild(ourCatcher); 
else trace("Catcher without a parent still plays! DEBUG THIS!"); 

基本上,你最有可能失去你的捕手的控制流,也就是說,它似乎試圖將自己從舞臺兩次刪除。在它第一次移除後,它的parent變爲空,因此變成了1009.而且,當你擊中2028時,同樣的原因適用,你的捕手不再是任何地方的孩子。

+0

是的,你是對的,似乎這是發生。我應該如何正確刪除它? – Zimbozo

+0

那麼,至少在你從舞臺上移除捕手時,請移除事件監聽器。除此之外,您需要爲我們提供更多代碼,以向您展示需要解決的問題。 – Vesper