我正在進入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