粒子系統在圖形學上的應用十分廣泛。最常見的,是通過控制大量的、具有相似行為的點元素,來描繪自然現象。例如下雨、下雪、火焰、水、霧等等。在家用控制臺或PC上的2D、3D游戲中,粒子特效代替了更為傳統的精靈繪圖,并取得了更靈活多變的視覺效果。但在手機設備上,因為機能和API的諸多限制,對于這一技術的應用并不常見。本文試圖嘗試一下如何在這些設備上實現簡單的例子系統。這僅僅是一次試驗,并不能保證一定能用于你的實際開發。
粒子系統,即粒子群系統。在自然界中,微粒以各種各樣的方式聚集在一起形成,擁有了自身的屬性和運動規律,構成了復雜的世界。對這種微粒的研究過于寬泛,我們僅僅關注微粒系統在圖形學上應用的一小部分應用。一個常見的微粒系統由兩部分組成:微粒群和微粒治理器。微粒包括了一系列的屬性:速度、顏色、貼圖等和一系列的行為。微粒治理器則負責創建微粒群,調用微粒群的行為、以及將微粒群表現出來(顯示)。

例子系統常見的應用有:描述群體(一個子彈群)、描述自然現象(下雨、下雪、火焰、水、霧)。此文關注的是后者。
實現通用粒子系統的前提:
1,要有足夠的內存空間保存粒子系統本身
2,可以對屏幕上的點進行控制
對于第1條,我的建議是,不要為每一個粒子系統建立類對象,僅僅保存一個多維數組用作描述狀態信息。行為可以抽象到粒子治理器去處理。盡管這樣,當粒子數目很多時其消耗也是非常驚人的。
對于第2條,MIDP2.0提供了對屏幕上的點進行訪問的能力。這一能力是通過Graphics的
void drawRGB(int[] rgbData, int offset, int scanlength, int x, int y, int width, int height, boolean PRocessAlpha)
Renders a series of device-independent RGB+transparency values in a specified region.
方法實現的。此方法不是直接取得對緩沖區的操作能力,而是通過對一個rgbData進行各種操作,然后將它繪畫出來,從而實現點的控制。換句話說,對屏幕的點的控制,轉換為了對數組的控制。不開放對緩沖區的直接操作,優點是:不去限制硬件廠商的實現;缺點是:一旦要對整個屏幕進行像素操作,就不得不開辟一個足夠大的數組,則對普通的手機來說顯得負擔承重。以sek700為例,176*221=38896像素,每個像素一個int(占2Byte),則總共需要77792B約76KB的連續空間。正如后面看到的,大量的例子算法需要使用到Blur技術用于提高畫面效果。此技術需要上次的屏幕的點信息,因此需要兩個76KB的連續空間。這還不算粒子群本身需要的空間。假如僅僅作為屏幕特效,就吃掉兩個76KB的連續空間似乎有些得不償失。另外,標準沒有對數組進行操作的繪圖指令,因此如何對數組進行簡單的畫圓、輸出字符等操作都很棘手。所以可以預見,因為標準API的限制,我們僅能有限的利用粒子系統。
基本思路:將粒子群的出生地定于一點,隨機產生一個小范圍的水平速度。讓粒子按照自然規律自由落體。在接觸地的時候發生碰撞,產生很小的向上動力(能量衰減)。



以下是代碼,其中blur是一種簡單的模糊算法,它可以上畫面更見好看,這里使用的是算法是取一個點為其四周四個點的平均值。這個例子使用了調色板技術實現了瀑布由白向藍再向黑的過渡(查表法)。通過這個例子,你可了解到例子系統的基本實現、簡單的物理模型模擬和調色板的使用技巧。在模擬器上運行很慢,但在Nokia3310上有13fps。
public class Waterfall {
public static final int X = 0;
public static final int Y = 1;
public static final int VX = 2;
public static final int VY = 3;
public static final int XACC = 4;
public static final int YACC = 5;
public static final int LIFE = 6;
public static final int DECAY = 7;
int[][] particle;
private int max;
private int last;
public Palette pal;
新聞熱點
疑難解答