2013-11-15 128 views
1

問題:Java的貪吃蛇遊戲 - 重繪specifc drawString之()方法

我已經建立在J​​ava中的貪吃蛇遊戲,一切都順利運行。我遇到的唯一問題是顯示分數。每當蛇「吃」一個蘋果時,分數增加10分。而不是顯示當前分數,它只是寫下當前分數而不真正擦除它。當我在重新顯示之前嘗試清除內容時,出現錯誤並且沒有顯示任何內容,除了我的背景顏色。

我有其他圖形組件,包括我不想受影響的paint()。

我嘗試(理論值):

我顯示使用調用
drawString之一個圖形對象( 「當前得分:」 + currScore,0,(Constants.TOTAL_HEIGHT + 15))的分數;

我想我必須調用一個clearRect()方法,這對我很有意義。不幸的是,我在指定clearRect()的行中得到一個NullPointerException異常。

我沒有使用Graphics2D,所以我可以先熟悉Graphics。如果解決這個問題涉及Graphics2D,我沒有問題使用它。

我嘗試(所討論的方法):

public void displayScore(Graphics g) { 
    //clearScore.clearRect(0, getY(), getWidth(), getHeight()); 
    //g.clearRect(0, getY(), getWidth(), getHeight()); 
    g.drawString("Current score: " + currHighScore, 0, (Constants.TOTAL_HEIGHT + 15)); 

} 

在代碼中,clearScore是在類的任何方法之外聲明Graphics對象。我使用這個的原因是爲了避免影響其他圖形。我嘗試了每個clearRect()行,並且都產生了相同的NullPointerException,這就是爲什麼我將它們註釋掉了。 (Constants.TOTAL_HEIGHT + 15)負責分配Y座標。

錯誤消息:

Exception in thread "Thread-3" java.lang.NullPointerException 
at com.nmw.view.CanvasFrame.displayScore(CanvasFrame.java:149) 
at com.nmw.view.CanvasFrame.drawAll(CanvasFrame.java:43) 
at com.nmw.view.CanvasFrame.run(CanvasFrame.java:64) 
at java.lang.Thread.run(Thread.java:722) 

drawAll在這裏我呼籲所有的我的方法是採取圖形繪製的遊戲片段。

道歉冗長的問題=/

回答

2

你的問題是,你很可能試圖繪製一個空的Graphics對象。如果您在AWT或中未繪製paint(...)方法(如果爲Swing),通常會出現這種情況。解決方案,

  • 繪製在這兩種方法之一(取決於你使用的庫)。
  • 始終在您的繪畫方法中調用super的方法。
  • 或者使用Label(AWT)或JLabel(Swing)來顯示數據。

坦率地說,你的發言:"I have other Graphics components, including a paint() that I do NOT want affected." - 是一種不切實際的要求,如果這是一個AWT的項目,如果你不希望使用一個標籤。

而且這樣的說法:

在代碼中,clearScore是在類的任何方法之外聲明Graphics對象。我使用這個的原因是爲了避免影響其他圖形。

是不是應該如何繪畫,永遠。你現在知道爲什麼了。如果您在程序運行期間碰巧獲得了Graphics上下文,則可以使用它將Graphics分配給您的類字段,然後嘗試使用該類字段,您會經常獲得像您所看到的NPE,因爲Graphics對象因而獲得的不是持久的。


如果您需要更深入的幫助,請發佈您的實際任務要求和更多的代碼。特別是你的繪圖方法。最好的辦法是創建併發布sscce


編輯
幽州的評論:

我的貪吃蛇遊戲是一個獨立的項目,我一直在做進一步瞭解圖形。我只使用AWT庫,但是,我會嘗試使用標籤。謝謝你的反應和爲什麼我得到了NullPointerException異常

解釋如果這是你自己的項目,而不是學校裏的功課,那麼我認爲你會希望避免使用AWT,而是使用Swing。它比AWT更強大和更靈活。真的沒有理由爲什麼你現在想要使用AWT。

+0

我的蛇遊戲是一個獨立的項目,我一直在做更多的關於圖形。我只使用AWT庫,但是,我會嘗試使用標籤。感謝您對我爲什麼得到NullPointerException的回覆和解釋。 –

+0

@CuckoOooo:請參閱編輯回答。 –

+0

我將使用JLabel並編輯它包含的文本。爲了設置我想放置JLabel的位置,我想我應該使用setBounds(x,y,width,height)。這是用來調整x和y的理想方法還是有更適合的技術? –