国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

MIDP中嘗試粒子系統

2019-11-18 14:55:16
字體:
來源:轉載
供稿:網友

粒子系統在圖形學上的應用十分廣泛。最常見的,是通過控制大量的、具有相似行為的點元素,來描繪自然現象。例如下雨、下雪、火焰、水、霧等等。在家用控制臺或PC上的2D、3D游戲中,粒子特效代替了更為傳統的精靈繪圖,并取得了更靈活多變的視覺效果。但在手機設備上,因為機能和API的諸多限制,對于這一技術的應用并不常見。本文試圖嘗試一下如何在這些設備上實現簡單的例子系統。這僅僅是一次試驗,并不能保證一定能用于你的實際開發。

粒子系統簡介

粒子系統,即粒子群系統。在自然界中,微粒以各種各樣的方式聚集在一起形成,擁有了自身的屬性和運動規律,構成了復雜的世界。對這種微粒的研究過于寬泛,我們僅僅關注微粒系統在圖形學上應用的一小部分應用。一個常見的微粒系統由兩部分組成:微粒群和微粒治理器。微粒包括了一系列的屬性:速度、顏色、貼圖等和一系列的行為。微粒治理器則負責創建微粒群,調用微粒群的行為、以及將微粒群表現出來(顯示)。

MIDP中嘗試粒子系統(圖一)


 
例子系統常見的應用有:描述群體(一個子彈群)、描述自然現象(下雨、下雪、火焰、水、霧)。此文關注的是后者。

實現粒子系統的成本

實現通用粒子系統的前提:
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的限制,我們僅能有限的利用粒子系統。

試驗一:模擬瀑布

基本思路:將粒子群的出生地定于一點,隨機產生一個小范圍的水平速度。讓粒子按照自然規律自由落體。在接觸地的時候發生碰撞,產生很小的向上動力(能量衰減)。

MIDP中嘗試粒子系統(圖二)MIDP中嘗試粒子系統(圖三)MIDP中嘗試粒子系統(圖四)


      
以下是代碼,其中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;



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 景德镇市| 阳原县| 黄石市| 封丘县| 班戈县| 乐山市| 泾川县| 崇明县| 临洮县| 承德县| 印江| 攀枝花市| 怀柔区| 波密县| 五华县| 乡宁县| 新乡县| 高尔夫| 盐津县| 昔阳县| 苏尼特左旗| 上饶市| 峨眉山市| 睢宁县| 郁南县| 卢龙县| 合肥市| 梧州市| 丹东市| 井冈山市| 宾阳县| 尤溪县| 新邵县| 禹州市| 大安市| 林周县| 孟村| 青浦区| 瑞安市| 峨眉山市| 玛沁县|