2014-06-18 38 views
0

我的班級裏,我調用這個函數影片剪輯(根)線似乎被撞毀我的遊戲

MovieClip(root).increaseScore(); 

它處理主。至於文件的分數。 這一切在執行關卡時都可以正常工作。然而,當水平完成,畫面轉到另一幀,遊戲崩潰,並給了我這個錯誤

TypeError: Error #1009: Cannot access a property or method of a null object reference.

上面的線。

我該如何解決這個問題? 感謝

編輯: 這是我告訴它addScore,這是在GameController.as文件

 private function removeBubble(bubble, addScore:Boolean) 
     { 
       var delay:Timer = new Timer(200, 1); 
       delay.addEventListener(TimerEvent.TIMER_COMPLETE, function(e:TimerEvent) 
       { 

        if(bubble.parent==mcGameStage) 
        { 
         var j:int = bubbleList.indexOf(bubble); 
         bubbleList.splice(j,1); 
         if(addScore) bubble.addScore(); 
         mcGameUI.txtScorePlayer.text = String(playerScore); 
         mcGameStage.removeChild(bubble); 
        } 
       e.currentTarget.removeEventListener(e.type, arguments.callee); 
       checkWin(); 
       }); 
       delay.start(); 
     }  

這裏是checkWin功能:

 private function checkWin() 
     { 
      if (playerBlue + playerRed + playerYellow + playerOrange + playerPurple + playerGreen == 0) 
      { 
       gameWin(); 
      } 
     } 
     private function gameWin() 
     { 
      while (bubbleList.numChildren > 0) 
      { 
       bubbleList.removeChildAt(0); 
      } 

      mcGameUI.btnMixBlue.removeEventListener(MouseEvent.CLICK, mixBlue); 
      mcGameUI.btnMixRed.removeEventListener(MouseEvent.CLICK, mixRed); 
      mcGameUI.btnMixYellow.removeEventListener(MouseEvent.CLICK, mixYellow); 
      mcGameUI.btnNeedle.removeEventListener(MouseEvent.CLICK, activateNeedle); 
      mcGameStage.removeEventListener(Event.ENTER_FRAME,update); 
      mcGameStage.removeEventListener(MouseEvent.CLICK, checkToHit); 
      removeEventListener(Event.ADDED_TO_STAGE, gameAddedToStage); 
      stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler); 
      stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpHandler); 
      if (mouseCursor != null) 
      { 
       mouseCursor.removeEventListener(Event.ENTER_FRAME,followMouse);   
       mouseCursor = null; 
      } 

      gotoAndPlay("level1win"); 

     } 

而且我的班級裏,

public function addScore() 
{ 
    root["increaseScore"](); 
} 

這是什麼increaseScore

public function increaseScore() 
{ 
    playerScore += 1000; 
} 

那麼空對象在哪裏呢? D: 另外,我對調試器很不熟悉,所以我很抱歉如果這可以很容易地解決。我試過了,在來這裏之前弄不清楚。 什麼是OPP方法? 什麼是FrameScript? 此外,該類是MovieClip的

謝謝:)

回答

0

修復此與調試器的幫助下完成的!

錯誤告訴你某些內容爲空,並且您試圖訪問它。這不好,那麼讓我們認爲可能是空的?

1)您的影片剪輯實例可能爲空。 2)增加您的影片剪輯實例的Score()方法可能嘗試訪問空值

您沒有發佈任何代碼,我可以在我寫這個答案時分析,所以我不能肯定地說。

一些可能出現的問題:

你的類不叫MovieClip的,但你只是想投你的根對象到MovieClip。事情是,MovieClip沒有增加Score()方法。你應該改爲調用與

root["increaseScore"](); 

這個increaseScore()方法將調用你的根時間軸的方法,但是由於我們使用弱打字,則可能是後來調試它的問題。但是我猜這就是在一個框架中編寫所有代碼而不是使用OPP方法時所付出的代價。

+0

我同意一個解決方法是用調試器:) –

+1

@AndreyPopov我不相信我在第一句話後寫了任何根本性錯誤。當然,把方法稱爲動態對象是不好的,但是告訴一個人重寫所有的代碼以使其更好地工作,因爲OOP也不會有幫助:)無論如何,我認爲我們可以認爲框架腳本很容易被哈希解決方案,所以我可以幫助的最好的方法就是警告可能導致的問題。 –

+1

@AndreyPopov你知道,在第二個想法中,我認爲這個辯論是毫無意義的 - 沒有足夠的信息來真正回答問題。因爲現在的問題只是一個猜測遊戲,所以我們兩個都可能是對的;我們無法知道這一點。 –

0

這裏的真實原因在錯誤中說:無法訪問空對象引用的屬性或方法。

這是什麼意思是MovieClip(root)爲空(它甚至不費心去檢查函數是否存在)。原因可能是三種:

  • 您的文檔類不是MovieClip(可能是Sprite)。
  • 您使用root的類不是DisplayObject。該屬性是DislpayObject類的一部分,因此如果您在其他類不使用它的類上使用它,它將不起作用。
  • 您正在使用此代碼段之前您已將實例添加到階段(最可能的原因)。根屬性表示樹中最頂端的顯示對象。如果您還沒有將孩子添加到樹中,它就沒有根:)檢查出parent - 錯誤應該是相同的。
+0

老實說,我不認爲文檔類或任何類都在這裏使用。它看起來更像是100%框架腳本,並且代碼是從某個影片剪輯的嵌套時間軸中調用的。 –

+0

如果他沒有指定任何文檔類,Flash將創建自己的內部文件(因爲時間軸,它將成爲MovieClip)。另一部分是足夠的 - 無論他在哪裏使用腳本,它必須在**添加到舞臺上。正如我所說 - 這不是該功能是壞的,但鑄造到MovieClip的根返回null。它不是MovieClip或它是空的(不添加)。否則,我同意**如果**這是框架腳本 - 這是一個壞主意(如果你在類中投下根,那更糟糕,但是..)乾杯! :) –

+0

@AndreyPopov感謝您的回覆,我添加了一些信息和代碼的帖子,請你再看一遍嗎? :) 再次感謝 –