java游戏循环。对初学者有点帮助

时间:2015-08-17 20:48:07

标签: java graphics awt

@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();生成的值。你能解释最后两行代码是如何完成任务的 - “来自前一帧不会流血到当前帧“:( :(
谢谢

2 个答案:

答案 0 :(得分:2)

gameImage.getGraphics();

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

让我们说gameImage是某个类A的一个实例,它有一个Graphics G类型的私有变量。 并且有一个访问该变量的方法:

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

你可以通过调用getGraphics,只有图形的引用(指针)。

答案 1 :(得分:1)

“Graphics”元素是程序的全局元素。它管理所有图形,无论它们在哪里。但是因为它是全局的东西,你不能只使用你定义的变量,比如说String,但必须从一个引用它的现有对象中获取它。例如,每个图像都有对图形对象的引用。您拥有的变量 g 现在是对此元素的引用,可以使用它。然后在下一行中使用此参考来清除整个屏幕和先前创建的图像,以便它们不会流入当前帧

(注意:这种解释可能不是100%准确,但这就是它让我理解它的方式。)