大家好,我正在制作一个 2D 游戏,我从 4 个预设图像生成了一个随机的草地背景。我的问题是,我的游戏使用以下代码从游戏开始时创建的数组中绘制每个图像:
public static void createBackground() {
for(int x = 0; x < 640; x+= 32) {
for(int y = 0; y < 496; y+= 32) {
random = new Random();
int grassTex = random.nextInt(grassTextures.size());
grassPos.add(grassTextures.get(grassTex));
}
}
}
工作正常,但问题就出在这里。我正在使用这个重新绘制放入该数组的每个图像:
public static void paintBackground(Graphics g) {
counter = 0;
for(int x = 0; x < 640; x+= 32) {
for(int y = 0; y < 496; y+= 32) {
random = new Random();
int grassTex = random.nextInt(grassTextures.size());
g.drawImage(grassPos.get(counter), x, y, null);
counter++;
}
}
}
这会导致 fps 下降(下降幅度不大,但很明显)。无论如何,我可以将所有这些草图像绘制到一个 BufferedImage 中,以便只绘制一个图像吗?或者有更有效的方法吗?
谢谢。
最佳答案
如您所问,没有办法获取“来自 Graphics 的图像”,但是创建 BufferedImage 然后将图像绘制到其中并不是很难。如果有的话,AWT 的成像模型非常复杂,您必须构建一些辅助数据结构和东西,但这里有一个创建 32 位 RGBA 图像的模板:
private static final ComponentColorModel colormodel =
new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),
new int[] {8, 8, 8, 8}, true, false,
ComponentColorModel.TRANSLUCENT, DataBuffer.TYPE_BYTE);
public static BufferedImage makeimage(int w, int h) {
WritableRaster buf = Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, w, h, 4, null);
return(new BufferedImage(colormodel, buf, false, null));
}
一旦您拥有由 makeimage()
创建的 BufferedImage,只需对其调用 getGraphics()
并随心所欲地绘制。
关于Java:从 Graphics 中获取图像并将其转换为临时 BufferedImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9238866/