我目前正在研究Java2D中基于磁贴的游戏,我正在考虑添加一些便宜的眼睛糖果。
例如,为爆炸和/或烟雾实施一个简单的粒子系统(可能类似于this)。
你是否有任何关于相对容易编程的效果的建议,这些效果不需要画很多(或根本没有)新艺术?
上述效果的教程和代码示例也是最受欢迎的!
-Ido。
PS - 如果绝对必要,我可以切换到像LWJGL / JOGL甚至是Slick这样的东西 - 但我宁愿继续使用Java2D。
答案 0 :(得分:6)
实现模糊和其他图像过滤效果非常简单。
例如,要对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的一些信息。它可用于实现锐化,浮雕,边缘增强等效果。
答案 1 :(得分:5)
执行像素化效果是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();
虽然有相当多的代码,但这种效果在智力上是一个悬而未决的结果 - 没有太多复杂的事情发生。它基本上是找到一个块的中心颜色,并用这种颜色填充一个盒子。这是一个相当天真的实现,因此可能有更好的方法来实现它。
以下是执行上述像素化效果之前和之后的比较:
答案 2 :(得分:1)
Filthy Rich Clients详细描述了许多非常好的Java2D / Swing效果。它还为这些效果提供了极好的理论背景。我不确定有多少低调的果实,但它是一个很好的浏览资源。
一种可能性是使用alpha合成做一些事情。也许将alpha复合与Timing Framework结合起来。根据游戏规则的不同,游戏玩法可能会有选择性地和时间依赖性地使对象变得半透明。
答案 3 :(得分:0)
透明效果(例如烟雾)可以在不费力的情况下产生重大影响。不知道这是否可以在Java2d中完成。
答案 4 :(得分:0)
任何看似真实的东西,从其他东西反弹的东西,滚落等都可能很酷,如果你的游戏是侧面滚动2D而不是自上而下的2D,你可以使用一个就绪像Box2D这样的物理引擎可以用很少的努力做一些很酷的事情。这是您可以使用的a Java port of Box2D。