低悬的图形编程水果?

时间:2009-06-10 14:44:05

标签: java graphics java-2d

我目前正在研究Java2D中基于磁贴的游戏,我正在考虑添加一些便宜的眼睛糖果。

例如,为爆炸和/或烟雾实施一个简单的粒子系统(可能类似于this)。

你是否有任何关于相对容易编程的效果的建议,这些效果不需要画很多(或根本没有)新艺术?

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

-Ido。

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

5 个答案:

答案 0 :(得分:6)

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

例如,要对BufferedImage执行模糊处理,可以将ConvolveOpKernel中指定的卷积矩阵一起使用:

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. 确定像素化的一个块的颜色。
  2. 在图像上填写像素化块。
  3. 第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

答案 2 :(得分:1)

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

一种可能性是使用alpha合成做一些事情。也许将alpha复合与Timing Framework结合起来。根据游戏规则的不同,游戏玩法可能会有选择性地和时间依赖性地使对象变得半透明。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

任何看似真实的东西,从其他东西反弹的东西,滚落等都可能很酷,如果你的游戏是侧面滚动2D而不是自上而下的2D,你可以使用一个就绪像Box2D这样的物理引擎可以用很少的努力做一些很酷的事情。这是您可以使用的a Java port of Box2D