@Override
    public void run() {
            while (running) {
                    currentState.update();
                    prepareGameImage();
                   // next line draws image(frame) to the screen
                    currentState.render(gameImage.getGraphics());
                    repaint();
            }

            // End game immediately when running becomes false.
            System.exit(0);
    }


    private void prepareGameImage() {
            if (gameImage == null) {
                    gameImage = createImage(gameWidth, gameHeight);
            }

            Graphics g = gameImage.getGraphics();
            g.clearRect(0, 0, gameWidth, gameHeight);
    }


这是游戏循环的一小段。本书对此作了一些解释。在prepareGameImage()中,我们通过创建和初始化gameImage变量来准备屏幕外图像,该变量的宽度为gameWidth,高度为gameHeight。 (我不知道它是如何工作的--->)接下来,在每一帧上,我们使用大小相等的矩形清除此图像,以清除上一帧绘制到屏幕上的所有图像。这样可以确保前一帧的图像不会渗入当前帧。每帧重新开始。
 我不明白的是摘要的最后2行。 gameImage.getGraphics();的值存储在Graphics变量g中。方法g.clearRect(0, 0, gameWidth, gameHeight);应该只影响变量g,并且不影响gameImage.getGraphics();生成的值。您能解释一下最后两行代码如何完成任务吗?“前一帧的图像不会渗入当前帧” :( :(
 谢谢

最佳答案

gameImage.getGraphics();


仅将引用(不进行复制)传递给gameImage的内部Graphics。

可以说gameImage是某个类A的实例,该类具有类型为Graphics G的私有变量。
并具有访问该变量的方法:

public Graphics getGraphics(){
   return this.G;
}


如您所料...通过调用getGraphics,您只有图形的引用(指针)。

10-04 20:32