我正在进入Java图形,我正在阅读Andrew Davison用Java编写的Killer游戏编程。他编写了一个简单的窗口应用程序,该应用程序使用Image类进行离屏渲染,然后将图像复制到组件。我感到迷惑的是,一个可以只创建图像,然后获得与图形上下文:用于屏幕外渲染的Java图形(2D)
dbg = dbImage.getGraphics();
我觉得很困惑,因为那时我们只使用DBG Graphics对象绘制的东西,但后来我们使用数据库图像中的paintComponent方法来显示所有我们已经吸引到DBG对象的东西:
3210那么如何数据库图像“知道”,它包含了所有我们已经绘制到DBG Graphics对象的图形的东西?
这里是整个代码:
public class GamePanel extends JPanel implements Runnable{
private static final int PWIDTH = 500;
private static final int PHEIGHT = 400;
private Thread animator;
private volatile boolean running = false;
private volatile boolean gameOver = false;
private Graphics dbg;
private Image dbImage = null;
private Counter counter;
public GamePanel(){
setBackground(Color.white);
setPreferredSize(new Dimension(PWIDTH, PHEIGHT));
// create game components eg. counter.
counter = new Counter(10);
counter.start();
}
private void stopGame(){
running = false;
}
@Override public void addNotify(){
super.addNotify();
startGame();
}
public void startGame(){
if(animator == null || !running){
animator = new Thread(this);
animator.start();
}
}
@Override
public void run() {
running = true;
while(running){
gameUpdate();
gameRender();
repaint();
try{
Thread.sleep(20);
}
catch(InterruptedException ex){
// do something with the exception...
}
}
}
private void gameUpdate(){
if(!gameOver){
// update game state...
if(counter.getCounter() == 0)
gameOver = true;
}
}
private void gameRender(){
if(dbImage == null){
dbImage = createImage(PWIDTH, PHEIGHT);
if(dbImage == null){
System.out.println("dbImage is null");
return;
}
else
dbg = dbImage.getGraphics(); // get graphics context for drawing to off-screen images.
}
// clear the background
dbg.setColor(Color.white);
dbg.fillRect(0, 0, PWIDTH, PHEIGHT);
// draw game elements here...
dbg.setColor(Color.black);
dbg.drawString(Integer.toString(counter.getCounter()), 10, 10);
if(gameOver)
dbg.drawString("Game over...", 10, 20);
}
@Override public void paintComponent(Graphics g){
super.paintComponent(g);
if(dbImage != null)
g.drawImage(dbImage, 0, 0, null);
}
}
的重要的部分是只的paintComponent方法和gameRender()方法虽然。
因为'Graphics'实例是它自己的,所以它属于图像,没有别的。简单地说:'Image'实例保持对它的引用。 (或者相反,取决于实现,但最终结果是一样的。) – biziclop
所以createImage方法将dbg和dbImage绑定在一起@biziclop?它背后有一定的设计模式吗? – kimsay