嘿伙计们我正在制作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中,这样它只能绘制一个图像吗?或者有更有效的方法吗?
感谢。
答案 0 :(得分:3)
如你所知,没有办法从“图形”中获取“图像”,但是创建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()
并绘制你内心的内容。