2009-06-10 53 views
3

我目前正在Java2D中開發基於瓦片的遊戲,並且我正在考慮添加一些便宜的眼睛糖果。低懸圖形編程水果?

例如,爲爆炸和/或煙霧實施簡單的粒子系統(可能類似於this)。

對於相對容易的編程效果,您是否有任何建議,不需要繪製大量(或根本不需要)新藝術?

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

-Ido。

PS - 如果絕對必要,我可以切換到像LWJGL/JOGL甚至Slick這樣的東西 - 但我寧願留在Java2D中。

回答

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的一些信息。它可以用來實現銳化,浮雕,邊緣增強等效果。

+0

運動模糊可以在2D中看起來非常漂亮,而且非常容易實現。 – shoosh 2009-06-10 15:05:19

+0

謝謝,我會用它! 還有更多你知道的效果嗎? – 2009-06-10 20:10:28

5

執行像素化效果是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 http://coobird.net/img/grad64.pngPixelated image http://coobird.net/img/grad64p.png

0

透明度效果(例如煙霧)可以有很大的差異沒有太多精力。不知道這是否可以在Java2d中完成。

1

Filthy Rich Clients詳細描述了許多非常不錯的Java2D/Swing效果。它也給這些影響提供了極好的理論背景。我不確定有多少低窪水果,但它是瀏覽的好資源。

一種可能性可能是用alpha合成做些事情。也許結合alpha複合與Timing Framework。根據遊戲規則,對於遊戲玩法而言,選擇性和時間依賴性地使對象變爲半透明可能甚至是非常重要的。

0

任何看起來很現實的東西,從其他東西反彈的東西,滾落等都可能會很酷,如果您的遊戲是側面滾動2D而不是自上而下的2D,您可能可以使用準備好像Box2D這樣的物理引擎,只需很少的努力就可以做一些很酷的事情。這裏是你可以使用它的a Java port of Box2D