Java: взять изображение из Graphics и превратить его во временный BufferedImage - PullRequest
1 голос
/ 11 февраля 2012

Привет, ребята, я делаю 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++;

        }
    }

}

Это вызывает падение частоты кадров в секунду (это не много, но это заметно).В любом случае я могу нарисовать все эти изображения травы в одном BufferedImage, чтобы рисовать было только одно изображение?Или есть более эффективный способ сделать это?

Спасибо.

1 Ответ

3 голосов
/ 11 февраля 2012

Нет способа взять "изображение из графики", как вы просите, но не очень сложно просто создать 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));
}

Когда у вас есть BufferedImage, созданный makeimage(), просто наберите на нем getGraphics() и раскрасьте все до глубины души.

...