Низко висящие графические плоды программирования? - PullRequest
3 голосов
/ 10 июня 2009

В настоящее время я работаю над игрой на основе тайлов в Java2D, и я подумывал добавить немного дешевого глазного конфеты.

Например, реализация простой системы частиц (может быть, что-то вроде this ) для взрывов и / или дыма.

Есть ли у вас какие-либо предложения относительно относительно простых в программировании эффектов, которые не требовали бы рисования большого количества (или вообще) нового искусства?

Учебники и примеры кода для указанных эффектов также приветствуются!

-Ido.

PS - если это абсолютно необходимо, я могу переключиться на что-то вроде LWJGL / JOGL или даже Slick - но я лучше останусь с Java2D.

Ответы [ 5 ]

6 голосов
/ 10 июня 2009

Реализация размытия и других эффектов фильтрации изображений довольно проста для выполнения.

Например, чтобы выполнить размытие на BufferedImage, можно использовать ConvolveOp с матрицей свертки, указанной в Kernel:

BufferedImageOp op = new ConvolveOp(new Kernel(3, 3,
    new float[] { 
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f,
        1/9f, 1/9f, 1/9f
    }
));

BufferedImage resultImg = op.filter(originalImg, resultImage);

Не совсем уверен, когда нужен эффект размытия, но он может пригодиться когда-нибудь. Но я бы сказал, что это легковесный фрукт из-за простоты реализации.

Вот некоторая информация о матрицах свертки . Его можно использовать для реализации таких эффектов, как повышение резкости, тиснение, улучшение кромки.

5 голосов
/ 10 июня 2009

Выполнение эффекта пикселизации - операция с низко висящими фруктами BufferedImage.

Это можно выполнить в два этапа:

  1. Определите цвет одного блока пикселизации.
  2. Заполните блок пикселизации на изображении.

Шаг 1: Определите цвет:

public static Color determineColor(BufferedImage img, int x, int y, int w, int h) {
    int cx = x + (int)(w / 2);
    int cy = y + (int)(h / 2);
    return new Color(img.getRGB(cx, cy), true);
}

В методе determineColor цвет пикселя от центра BufferedImage определяется и передается вызывающей стороне.

Шаг 2. Заполните блок пикселизации определенным цветом:

BufferedImage sourceImg = ...;  // Source Image.
BufferedImage destimg = ...;    // Destination Image.
Graphics g = destImg.createGraphics();

int blockSize = 8;
for (int i = 0; i < sourceImg.getWidth(); i += blockSize) {
    for (int j = 0; j < sourceImg.getHeight(); j += blockSize) {
        Color c = determineColor(sourceImg, i, j, blockSize, blockSize);
        g.setColor(c);
        g.fillRect(i, j, blockSize, blockSize);
    }
}
g.dispose();

Несмотря на то, что кода довольно много, этот эффект является интеллектуально низко висящим фруктом - здесь не так много сложного. Это в основном нахождение центрального цвета блока и заполнение коробки этим цветом. Это довольно наивная реализация, поэтому могут быть более эффективные способы сделать это.

Ниже приведено сравнение до и после выполнения вышеуказанного эффекта пикселизации:

Non-pixelated image Pixelated image

1 голос
/ 10 июня 2009

Filthy Rich Clients подробно описывает ряд очень приятных эффектов Java2D / Swing. Это также дает превосходную теоретическую основу для этих эффектов. Я не уверен, сколько там низко висящих фруктов, но это отличный ресурс для просмотра.

Одной из возможностей может быть что-то сделать с альфа-композицией. Возможно объединить альфа-композит с Timing Framework . В зависимости от правил вашей игры в игровом процессе может быть даже важно сделать выборочно и зависящим от времени объекты полупрозрачными.

0 голосов
/ 10 июня 2009

Все, что выглядит реалистично, что-то отскакивает от других вещей, скатывается и т. Д., Может быть круто, и если ваша игра представляет собой 2D с боковой прокруткой, а не 2D сверху вниз, вы можете использовать готовый заставил физический движок вроде Box2D сделать что-то классное без особых усилий. Вот порт Java Box2D , который вы можете использовать для него.

0 голосов
/ 10 июня 2009

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

...