我现在正在进入Java图形,我正在阅读Andrew Davison撰写的Java中的Killer游戏编程。他编写了一个简单的窗口应用程序,它使用Image类进行离屏渲染,然后将图像复制到组件。我觉得令人困惑的是,人们可以创建图像,然后通过以下方式获取图形上下文:
dbg = dbImage.getGraphics();
我发现它令人困惑,因为那时我们只使用dbg Graphics对象来绘制东西但后来我们在paintComponent方法中使用dbImage来显示我们绘制到dbg Object的所有东西:
g.drawImage(dbImage, 0, 0, null);
那么dbImage"如何知道"它包含我们绘制到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()方法。
答案 0 :(得分:5)
基本上,Graphics
对象不是您在上绘制的。这是你用绘制的东西。
当您致电dbImage.getGraphics()
时,您说“给我一个允许我在此图片上绘制的工具箱”。 Graphics
对象中的所有绘制方法都在其创建的组件上绘制。它们不会在Graphics
对象上绘制,而是在属于它的Image
或Component
上绘制。
将Graphics
对象视为调色板和画笔,将Image
或Component
视为画布。
因此,当您使用dbg
完成操作后,就意味着您的图像中充满了彩色像素,而这个Graphics
对象会在其上绘制。现在,您可以将此图像复制到另一个组件 - 使用该组件的drawImage
- “工具箱”中的Graphics
“工具”。