Java Snake Game - 重绘特定的drawString()方法

时间:2013-11-15 04:14:39

标签: java canvas graphics awt draw

问题:

我一直用Java创建一个Snake游戏,一切都很顺利。我唯一的问题就是显示得分。每当蛇“吃掉”一个苹果时,分数增加10.而不是显示当前分数,它只是在没有实际删除它的情况下写入当前分数。当我在重新显示之前尝试擦除内容时,我收到错误,除了我的背景颜色之外什么也没有出现。

我有其他图形组件,包括我不想受影响的paint()。

我的尝试(理论):

我使用调用
的Graphics对象显示分数      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是我调用所有方法的地方,这些方法使用Graphics来绘制游戏的一部分。

为冗长的问题道歉= /

1 个答案:

答案 0 :(得分: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


修改
您在评论中说明:

  

My Snake游戏是一个独立的项目,我一直在努力学习更多有关Graphics的知识。我只使用AWT库,但是,我会尝试使用Label。感谢您对我收到NullPointerException

的原因的回复和解释

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