@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,您只有图形的引用(指针)。