gpt4 book ai didi

用于离屏渲染的 Java Graphics(2D)

转载 作者:行者123 更新时间:2023-11-30 06:13:24 26 4
gpt4 key购买 nike

我目前正在研究 Java 图形,并且正在阅读 Andrew Davison 撰写的 Killer game programming in Java 一书。他编写了一个简单的窗口应用程序,该应用程序使用 Image 类进行离屏渲染,然后将图像复制到组件中。我感到困惑的是,人们可以只创建图像,然后通过以下方式获取图形上下文:

dbg = dbImage.getGraphics();

我觉得很困惑,因为那时我们只使用 dbg Graphics 对象来绘制东西,但后来我们在 paintComponent 方法中使用 dbImage 来显示我们绘制到 dbg 对象的所有东西:

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() 方法。

最佳答案

基本上,Graphics 对象不是您 上绘制的对象。这是您画的东西。

当您调用 dbImage.getGraphics() 时,您是在说“给我一个工具箱,让我可以在此图像上绘图”。 Graphics 对象中的所有绘制方法都在创建它的组件上绘制。它们不是绘制在 Graphics 对象上,而是绘制在 Image 或属于它的 Component 上。

Graphics 对象视为调色板和画笔,将 ImageComponent 对象视为 Canvas 。

因此,当您使用 dbg 完成运行操作时,这意味着您拥有了一个充满彩色像素的图像,此 Graphics 对象在其上绘制了图像。现在您可以获取此图像并将其复制到另一个组件 - 通过使用该组件的 Graphics - 它的“工具箱”中的 drawImage“工具”。

关于用于离屏渲染的 Java Graphics(2D),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31892451/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com