1

问题:

我一直在用 Java 创建一个 Snake 游戏,一切都很顺利。我遇到的唯一问题是显示分数。蛇每“吃掉”一个苹果,分数就会增加 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 方法中绘图,通常会发生这种情况。解决方案,

  • 在这两种方法之一中绘制(取决于您使用的库)。
  • 始终在您的绘画方法中调用超级方法。
  • 或者使用 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


编辑
您在评论中声明:

我的 Snake 游戏是我一直在做的一个独立项目,旨在了解有关图形的更多信息。我一直在使用 AWT 库,但是,我会尝试使用标签。感谢您对我为什么得到 NullPointerException 的回复和解释

如果这是针对您自己的项目而不是学校作业,那么我认为您将希望避免使用 AWT,而是使用 Swing。它比 AWT 更强大、更灵活。现在真的没有理由要使用 AWT。

于 2013-11-15T04:16:23.860 回答