1

問題:

私は Java でスネーク ゲームを作成してきましたが、すべてがスムーズに動作しています。私が抱えている唯一の問題は、スコアの表示です。ヘビがリンゴを「食べる」たびに、スコアが 10 ずつ増えます。現在のスコアを表示する代わりに、現在のスコアを実際に消去せずに上書きするだけです。再表示する前にコンテンツを消去しようとすると、エラーが発生し、背景色以外は何も表示されません。

影響を与えたくない paint() など、他のグラフィックス コンポーネントがあります。

私の試み(理論的):


drawString("Current score: " + currScore, 0, (Constants.TOTAL_HEIGHT + 15));を呼び出す Graphics オブジェクトを使用してスコアを表示します。

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 は、Graphics を使用してゲームのセグメントを描画するすべてのメソッドを呼び出す場所です。

長々と質問すみません=/

4

1 に答える 1

2

あなたの問題は、null Graphics オブジェクトで描画しようとしている可能性が高いことです。paint(...)これは通常、AWT またはpaintComponent(...)Swingの場合にメソッド内で描画していない場合に発生します。ソリューション、

  • これら 2 つのメソッドのいずれかで描画します (使用しているライブラリによって異なります)。
  • 描画メソッド内で常にスーパーのメソッドを呼び出します。
  • または、Label (AWT) または JLabel (Swing) を使用してデータを表示します。

率直に言うと、あなたのステートメント: "I have other Graphics components, including a paint() that I do NOT want affected."-- これが AWT プロジェクトであり、ラベルを使用したくない場合、非現実的な要件です。

そして、この声明:

コードでは、clearScore はメソッドの外側のクラスで宣言された Graphics オブジェクトです。これを使用する理由は、他のグラフィックに影響を与えないようにするためです。

あなたが描くべき方法ではありません。あなたは今、その理由を見つけています。プログラムの実行中に Graphics コンテキストを取得し、それを使用して Graphics をクラス フィールドに割り当て、そのクラス フィールドを使用しようとすると、Graphics オブジェクトがこのようにして得られたものは長続きしません。


より詳細なヘルプが必要な場合は、実際の割り当て要件と追加のコードを投稿してください。特にあなたの描画方法。sscceを作成して投稿するのが最善です。



コメントであなたの状態を編集します:

私の Snake ゲームは、グラフィックスについてもっと学ぶために私が行ってきた独立したプロジェクトです。AWT ライブラリしか使用していませんが、Label を使用してみます。NullPointerException が発生した理由についての返信と説明をありがとう

これが学校の課題ではなく、あなた自身のプロジェクト用である場合は、AWT の使用を避け、代わりに Swing を使用することをお勧めします。AWT よりもはるかに強力で柔軟です。現在、AWT を使用する理由はまったくありません。

于 2013-11-15T04:16:23.860 に答える