本講是Testin杯 libgdx遊戲引擎教程的第三講,主要給大家介紹一下libgdx引擎中粒子系統的使用。本講本應該介紹一下libgdx引擎中的多遊戲介面的實現,但考慮到有一些巴友對我這個教程的創新性表示疑問,於是我決定講該內容放在第四講再做詳細的介紹。從第一講開始,每次的程式都建立在上一次程式的基礎上,每一次的源碼都可以在教程的最下方下載到。
一個遊戲引擎要做出精美的遊戲出來,有兩個類是必不可少的,一個是精靈類,一個是粒子系統。粒子系統可以做出各種精妙的效果,如水流,火焰,煙霧等等,製作精美的粒子系統甚至可以以假亂,製作出令人驚歎的效果。
Libgdx也提供了粒子系統的支援,而且令人興奮的是,libgdx提供了一個可視化的粒子系統編輯器,我們可以採取邊編輯邊預覽的方式,“所見即所得 (WYSIWYG)”,很快就能做出不錯的粒子系統效果。
Libgdx粒子系統編輯器—Particle Editor
Particle Editor:http://libgdx.googlecode.com/svn/jws/particle-editor.jnlp
這裡請大家注意一點,把該工具下載下來以後,需要保證你的電腦已經安裝了jre即Java環境這樣工具才能運行。jre的安裝方法就問一下度娘吧。
這是我今天將最新版下載下來以後開啟的:
嘿嘿,這裡大家可以先做一個工作,就是先save一下,將得到的一個檔案,我們將它儲存為particle.p,這個可以留下來等會用,嘿嘿。這裡還需要一個用來形成單個粒子的圖片,一般用一個很小的白色小圓即可,在我的源碼裡有,也可以用任意圖片代替,當然出來的效果就不一樣啦。我還會在附件裡面添加一個我隨意做的.p檔案,也就是粒子效果檔案,顯示的效果應該是彩虹色,大家可以用該工具開啟後就可以根據下面各個參數的解釋一一摸索,調整對應參數觀察變化,然後自己做出一些更好的效果出來。
官方網站上對軟體中的各個參數的解釋如下:
Delay: 當粒子系統開始後,發射器等待多少時間開始發射
Duration:發射器生存跨度,也就是粒子效果持續的的時間,注意這個時間和粒子存留時間不同
Count: 顧名思義,同一時間可出現的粒子個數,有一個上限一下下限。
Emission: 每秒鐘發射多少個粒子,這個參數帶了一張圖表,圖表中間寫著duration,代表圖表X 軸表示發射器存留時間,意思是說發射器的存留時間內,該圖表控制各個時間點粒子每秒鐘發射多少個,左邊的上下兩個文字框用於控制產生初始值時的範圍,左邊的'>'字元用於輸入另外一個數值,比如說下面那個”>“, 發射器會在這兩個值中間選擇一下隨機值作為上限值,Relative,如果選中,表示圖表中的值是相對值,相對於初始值。否則是個絕對值.
Life: 一個粒子的存留時間,
Life Offset: 決定粒子在顯示之前已經用掉它生命多少值 ,這樣可以實現讓一個粒子在它生命50%時再顯現
X Offset and Y Offset: 粒子出現在位置相對中心位置的像素位移
Spawn: 用於產生粒子的發射器的形狀
Spawn Width and Spawn Height: 發射器的形狀的寬,高
Size: 粒子的大小
Velocity:
Angle:
Rotation:
這個幾值用於控制粒子的運動軌跡:
Wind and Gravity: 煙為存留時間內在X軸和Y軸上每秒種的像素位移值
Tint: 粒子的顏色,可以在粒子生存期內變化任意多個顏色
Transparency:粒子的透明度
下面我們做一些代碼上的準備,今天要實現的是實現粒子類比出觸摸軌跡的一個功能,代碼在上一講的代碼的基礎上做進一步的修改。
在MyGame.java裡添加四個變數ParticleEffect particle;ParticleEffect tem;ParticleEffectPool particlepool;ArrayList<ParticleEffect>particlelist; 第一個即為粒子執行個體,第二個是一個臨時變數,這裡重點要說一下的是第三個量,這是一個ParticleEffectPool的執行個體,這是一個粒子系統的統一管理的類,負責管理粒子系統的產生回收,可以用它的obtain()方法得到一個ParticleEffect執行個體,我們當然可以不用這個類而直接建立ParticleEffect執行個體,但是如果要產生大量的粒子(為了產生更真實的效果往往我們必須這麼做),粒子的管理就是一個很大的問題,因此使用ParticleEffectPool是個很不錯的選擇。添加以後的代碼如下所示:
- public class MyGame implements ApplicationListener {
- SpriteBatch batch;
- BitmapFont bf;
- ParticleEffect particle;
- ParticleEffect tem;
- ParticleEffectPool particlepool;
- ArrayList<ParticleEffect> particlelist;
- public void create () {
- // STUB
- batch=new SpriteBatch();
- bf=new BitmapFont();
- //初始化粒子變數
- particle = new ParticleEffect();
- particle.load(Gdx.files.internal("particle.p"), Gdx.files.internal("particle.png"));
- particlepool=new ParticleEffectPool(particle, 5, 10);
- }
- public void render () {
- // STUB
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- Gdx.gl.glClearColor(0f,0f,0f,0f);
- batch.begin();
- bf.draw(batch, "Testin Mkey libgdx(2)",Gdx.graphics.getWidth()/2, Gdx.graphics.getHeight()/2);
- batch.end();
- }
- public void resize (int width, int height) {
- // STUB
- }
- public void pause () {
- // STUB
- }
- public void resume () {
- // STUB
- }
- public void dispose () {
- // STUB
- batch.dispose();
- bf.dispose();
- //千萬別忘了釋放記憶體
- particle.dispose();
- if(tem!=null)
- tem.dispose();
- particlepool.clear();
- }
- }
複製代碼 這裡說明一點Gdx.files.internal()的位置是在項目的asset根目錄下,同理在asset下的data檔案夾的話,格式應該為Gdx.files.internal(“data/particle.p”).另外,我們在上一講中已經提到,libgdx中很多資源需要手動回收,ParticleEffect,ParticleEffectPool 兩個類都實現了Disposeable介面(新版的ParticleEffectPool沒有了dispose()方法而用clear()方法替代),千萬記得手動回收一下資源。另外ParticleEffect,ParticleEffectPool使用前都要初始化:
- particle.load(Gdx.files.internal("particle.p"),
- Gdx.files.internal(""));
複製代碼 第一個參數是Particle Editor產生的編輯檔案(注意尾碼名也是自己取的,讀取的時候記得對應),第二個參數是形成單個粒子的圖片檔案。
這裡有一點非常重要!請萬分注意:第一個參數是ParticleEditor產生的編輯檔案,圖片檔案的檔案名稱必須為particle.png,也就是說無論粒子編輯檔案的名字是什麼,系統讀取的圖片檔案都應該是particle.png,而有關兩者的路徑問題,舉個例子大家就應該能明白。如果在asset下的data檔案夾的話,格式應該寫為Gdx.files.internal(“data/particle.p”)和Gdx.files.internal(“data/”)也就是說,png圖片實際上是不需要在代碼中寫出來的,不過檔案名稱要保持一致才能正確讀取。
- particlepool=new ParticleEffectPool(particle, 5, 10);
複製代碼 第一個參數是剛剛初始化完成的粒子,第二個參數是制定該粒子池裡以第一個參數為模板產生多少個粒子可以供系統隨時調用,第三個參數是粒子池中最大的粒子數目。 下面我們實現粒子類比觸摸軌跡的功能,首先我們需要捕捉到觸摸事件。而且我們面臨一個很現實的問題:我們在哪裡捕捉觸摸事件?要知道libgdx和API可不一樣,我們沒有辦法使用API在libgdx中擷取觸摸事件。對此Gdx包中的input部分提供了Gdx.input.isTouched()方法,判斷當前螢幕是否被觸摸,是則返回true。我們將這一語句放在render()方法中,就達到了隨時檢測的目的。修改後的MyGame.java的代碼如下:
- public class MyGame implements ApplicationListener {
- SpriteBatch batch;
- BitmapFont bf;
- ParticleEffect particle;
- ParticleEffect tem;
- ParticleEffectPool particlepool;
- ArrayList<ParticleEffect> particlelist;
- public void create () {
- // STUB
- batch=new SpriteBatch();
- bf=new BitmapFont();
- //初始化粒子變數
- particle = new ParticleEffect();
- particle.load(Gdx.files.internal("particle.p"), Gdx.files.internal(""));
- particlepool=new ParticleEffectPool(particle, 5, 10);
- particlelist=new ArrayList<ParticleEffect>();
- }
- public void render () {
- // STUB
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- Gdx.gl.glClearColor(0f,0f,0f,0f);
- batch.begin();
- bf.draw(batch, "Testin Mkey libgdx(3)",Gdx.graphics.getWidth()*0.4f, Gdx.graphics.getHeight()/2);
- batch.end();
- if(true){
- if(Gdx.input.isTouched()){
- //當此觸摸點與上一觸摸點距離大於一定值的時候觸發新的粒子系統,由此減小系統負擔
- tem=particlepool.obtain();
- tem.setPosition(Gdx.input.getX(),Gdx.graphics.getHeight()-Gdx.input.getY());
- particlelist.add(tem);
- }
- batch.begin();
- for(int i=0;i<particlelist.size();i++){
- particlelist.get(i).draw(batch, Gdx.graphics.getDeltaTime());
- }
- batch.end();
-
- //清除已經播放完成的粒子系統
- ParticleEffect temparticle;
- for(int i=0;i<particlelist.size();i++){
- temparticle=particlelist.get(i);
- if(temparticle.isComplete()){
- particlelist.remove(i);
- }
- }
- }
- }
- public void resize (int width, int height) {
- // STUB
- }
- public void pause () {
- // STUB
- }
- public void resume () {
- // STUB
- }
- public void dispose () {
- // STUB
- batch.dispose();
- bf.dispose();
- //千萬別忘了釋放記憶體
- particle.dispose();
- if(tem!=null)
- tem.dispose();
- particlepool.clear();
- }
- }
複製代碼 其中添加了一些很簡單的去除已完成的粒子系統的代碼,想來對大家也沒有什麼難度,因此不做過多的解釋了.
為了示範方便,我對前面儲存的particle.p做了適當的修改,並在編輯器最下方中勾選了 continuous,即連續播放,也是為了讓大家看的更清楚一些,直接吧,無圖無真相啊:我畫出了“bus”的圖樣,代表我們熱愛的安卓巴士論壇哦這是我隨手做的另一個粒子效果的圖
讓我們換一個粒子圖片看看效果這樣似乎看的不是非常清楚….其實每一個粒子都是一個Android機器人!
資源檔都在源碼的asset檔案夾下,大家可以自行替換。
這裡是原始碼哦!
edu.nju.wsj.libgdx.rar
(3.01 MB, 下載次數: 1259)
2012-7-3 19:56 上傳
點擊檔案名稱下載附件
下載積分: 下載豆 -2
歡迎繼續支援#Testin杯#Mkey libgdx遊戲引擎教程!
Testin ID:ilovemkey@gmail.com 總的而言這個平台真的非常好用!我正是用這個平台發現了現在寫的這個應用的一些記憶體管理方面的問題。另外建議能夠在測試報告中看到某一台機型在整個執行過程中的cpu和記憶體佔用的變化情況,這樣可以更快地鎖定問題。感謝Itestin讓測試變得輕鬆了太多太多!
-
particle-editor.jpg
(107.48 KB, 下載次數: 18)
2012-7-3 19:49 上傳
點擊檔案名稱下載附件
-
pacl.png
(134.32 KB, 下載次數: 10)
2012-7-3 19:49 上傳
點擊檔案名稱下載附件
-
Screenshot_2012-07-03-19-26-34.png
(191.88 KB, 下載次數: 11)
2012-7-3 19:49 上傳
點擊檔案名稱下載附件
-
豌豆莢20120703193939.png
(30.98 KB, 下載次數: 9)
2012-7-3 19:49 上傳
點擊檔案名稱下載附件
-
豌豆莢20120703194602.png
(37.43 KB, 下載次數: 11)
2012-7-3 19:50 上傳
點擊檔案名稱下載附件