3

我目前正在使用 Java2D 开发基于图块的游戏,并且我正在考虑添加一些便宜的眼睛糖果。

例如,为爆炸和/或烟雾实现一个简单的粒子系统(可能是这样的)。

对于不需要绘制大量(或根本)新艺术的相对容易编程的效果,您有什么建议吗?

上述效果的教程和代码示例也将受到欢迎!

-我愿意。

PS - 如果绝对必要,我可以切换到 LWJGL/JOGL 甚至 Slick 之类的东西 - 但我宁愿继续使用 Java2D。

4

5 回答 5

6

实现模糊和其他图像过滤效果相当简单。

例如,要对 a 执行模糊BufferedImage,可以使用ConvolveOpa 中指定的卷积矩阵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);

不太确定何时需要模糊效果,但它可能会在一段时间内派上用场。但我会说这是一个容易实现的目标。

这是关于卷积矩阵的一些信息。它还可用于实现锐化、浮雕、边缘增强等效果。

于 2009-06-10T14:53:40.080 回答
5

执行像素化效果是对BufferedImage.

这可以分两个步骤执行:

  1. 确定像素化的一个块的颜色。
  2. 填充图像上的像素化​​块。

第一步:确定颜色:

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();

尽管有相当多的代码,但这种效果在智力上是一个容易实现的果实——没有太多复杂的事情发生。它基本上是找到一个块的中心颜色,并用该颜色填充一个盒子。这是一个相当幼稚的实现,因此可能有更好的方法来做到这一点。

以下是执行上述像素化效果的前后对比:

非像素化图像 像素化图像

于 2009-06-10T16:02:50.347 回答
1

Filthy Rich Clients非常详细地描述了许多非常好的 Java2D/Swing 效果。它还为这些效应提供了极好的理论背景。我不确定有多少唾手可得的果实,但它是一个很好的浏览资源。

一种可能性可能是使用 alpha 合成来做一些事情。也许将 alpha 复合材料与Timing Framework结合起来。根据你的游戏规则,对游戏玩法来说,选择性地和时间相关地使对象半透明甚至可能很重要。

于 2009-06-10T16:17:41.253 回答
0

透明效果(例如烟雾)可以在不费力气的情况下产生很大的不同。不知道这是否可以在 Java2d 中完成。

于 2009-06-10T16:05:02.963 回答
0

任何看起来很逼真的东西,从其他东西反弹的东西,滚落等等都可能很酷,如果你的游戏是横向滚动 2D 而不是自上而下的 2D,你也许可以使用现成的物理引擎就像 Box2D 一样,用很少的努力就能做一些很酷的事情。这是您可以使用的 Box2D 的 Java 端口。

于 2009-06-10T16:18:44.760 回答