@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();
生成的值。你能解释最后两行代码是如何完成任务的 - “来自前一帧不会流血到当前帧“:( :(
谢谢
答案 0 :(得分:2)
gameImage.getGraphics();
只将引用(不复制)传递给gameImage的内部Graphics。
让我们说gameImage是某个类A的一个实例,它有一个Graphics G类型的私有变量。 并且有一个访问该变量的方法:
public Graphics getGraphics(){
return this.G;
}
你可以通过调用getGraphics,只有图形的引用(指针)。
答案 1 :(得分:1)
“Graphics”元素是程序的全局元素。它管理所有图形,无论它们在哪里。但是因为它是全局的东西,你不能只使用你定义的变量,比如说String,但必须从一个引用它的现有对象中获取它。例如,每个图像都有对图形对象的引用。您拥有的变量 g 现在是对此元素的引用,可以使用它。然后在下一行中使用此参考来清除整个屏幕和先前创建的图像,以便它们不会流入当前帧。
(注意:这种解释可能不是100%准确,但这就是它让我理解它的方式。)