在互联网上搜索主要游戏循环引擎的图形方法后,我发现了下面的代码,对它的工作原理几乎一无所知。
public class Game extends Canvas {
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer().getDataBuffer()).getData();
private void tick() {
for (int i = 0; i < pixels.length; i++) {
pixels[i] = i;
}
}
private void render() {
BufferStrategy bs = getBufferStrategy();
Graphics g = bs.getDrawGraphics();
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
g.dispose();
bs.show();
}
}
关于这个代码有两件事我不明白:
1) 在render方法中,将g设置为bs.getDrawGraphics(),然后使用图形并处理图形对象。如果你不是从这个改变bs,而是从bs设置g,那么图像不应该用g破坏吗?
2) 设置图像变量,然后设置图像中的像素阵列。如果不直接更改图像变量,那么如何在更改像素阵列后不进行设置的情况下通过像素阵列更改图像的值?
非常感谢。
-
处理图形上下文时,之前所做的任何更改都不受此影响,因为
Graphics
不是保存实际像素数据的对象。 -
pixels
数组是对BufferedImage
的光栅的直接引用。它们是一样的,所以不需要做任何魔术来将像素"刷新"回图像。