我目前正在用Java2D开发一个基于磁贴的游戏,我正在考虑添加一些便宜的花哨的东西。
例如,为爆炸和/或烟雾实现一个简单的粒子系统(可能类似于this)。
你有什么建议,可以相对容易地编程效果,而不需要画很多(或根本不需要)新的艺术吗?
对于上述效果的教程和代码样本也将是最受欢迎的!
-Ido。
PS -如果绝对必要,我可以切换到LWJGL/JOGL,甚至Slick之类的东西-但我宁愿留在Java2D上。
发布于 2009-06-10 14:53:40
实现模糊和其他图像过滤效果相当容易执行。
例如,要对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);不太确定什么时候需要模糊效果,但它可能会在某些时候派上用场。但我要说的是,由于其易于实现,它是一个容易摘到的果实。
这里有一些关于convolution matrices的信息。它可以用来实现锐化,浮雕,边缘增强等效果。
发布于 2009-06-10 16:02:50
在BufferedImage上执行像素化效果是一种容易实现的操作。
这可以通过两个步骤来执行:
步骤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();虽然有相当多的代码,但这种效果在智力上是一个容易摘到的果实--没有太多复杂的事情正在发生。它基本上是找到一个块的中心颜色,并用该颜色填充一个框。这是一个相当幼稚的实现,因此可能有更好的方法来实现它。
下面是执行上述像素化效果的前后比较:


发布于 2009-06-10 16:17:41
Filthy Rich Clients非常详细地描述了许多非常好的Java2D/Swing效果。它也为这些效应提供了很好的理论背景。我不确定有多少低挂的果实,但它是一个很好的浏览资源。
一种可能是使用alpha合成。也许将alpha composite与Timing Framework结合使用。根据你的游戏规则,它甚至可能是重要的游戏,有选择地和时间依赖地使对象半透明。
https://stackoverflow.com/questions/976026
复制相似问题