每一款強大的遊戲引擎一般都會自帶粒子編輯器,libgdx自然也是一樣------Particle-Editor,今天我們就将介紹一下它的使用和應用。
(注:該工具必須運作在jre上,是以確定你的電腦上裝有Java環境喽)
1.編輯器介紹:
簡單來說,所謂的粒子,是由一些做指定規則移動的圖檔所構造成的。這些圖像通常經過不同的展示方式,混合一些特殊的效果,然後再呈現在我們面前,就構成了粒子。粒子系統可以做出各種精妙的效果,如水流,火焰,煙霧等等,制作精美的粒子系統甚至可以以假亂,制作出令人驚歎的效果。
2.編輯器使用
2.1首先,我們先看一張截面圖,左上角為效果圖,右邊為屬性設定
<a target="_blank" href="http://blog.51cto.com/attachment/201307/120341253.png"></a>
2.2接着我們看一下官方的參數介紹:
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:粒子的透明度
2.3這裡我們可以先不考慮怎樣制作一個漂亮的效果圖,大家可以先做一個工作,就是先save一下,将得到的一個檔案,我們将它儲存為particle.p,這個可以留下來等會用,這裡還需要一個用來形成單個粒子的圖檔,預設是一個小圓圖檔,當然你也可以換成其他的具有良好效果的圖檔。
3.代碼實作(實作粒子模拟出觸摸軌迹的一個功能)
這裡介紹兩個主要類:
ParticleEffect 類
介紹:libgdx自帶的粒子效果類,負責擷取粒子編輯器生成的“.p”檔案,主要是負責加入粒子編輯器生成的檔案,同時加入一些簡單的管理。如果我們要看到粒子效果的話,可以再render中繪制出來。
主要方法
解釋
負責加載粒子編輯器檔案,同時加入Atlas檔案。
設定粒子位置
負責超看粒子一個生命周期是否完成,一般用去銷毀粒子
擷取發射器,本身類型是一個 Array<ParticleEmitter> 類型。
void draw()
繪制粒子效果的方法。
ParticleEffectPool 類
介紹:粒子池,是一個承裝粒子的容器,主要負責管理粒子編輯器生成的檔案。
主要方法
解釋
第一個參數是一個ParticleEffect執行個體,第二個參數是初始粒子容量,第三個是最大粒子容量。
obtain()
傳回一個粒子池中的對象
<b>newObject</b>
加入一個粒子對象
主入口:
1
2
3
4
5
6
7
8
9
10
11
12
<code>package</code> <code>com.zhf.android_libgdx;</code>
<code>import</code> <code>com.badlogic.gdx.backends.android.AndroidApplication;</code>
<code>import</code> <code>android.os.Bundle;</code>
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>AndroidApplication {</code>
<code> </code><code>@Override</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>//在此啟動遊戲,FirstGame實作了ApplicationListener的類</code>
<code> </code><code>initialize(</code><code>new</code> <code>FirstGame(), </code><code>false</code><code>); </code><code>//specifying the configuration for the GLSurfaceView.</code>
<code> </code><code>//第二個參數如果設為true,則在opengl 2.0可用的情況下會使用opengl 2.0。</code>
<code> </code><code>}</code>
<code>}</code>
主界面:
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<code>import</code> <code>java.util.ArrayList;</code>
<code>import</code> <code>javax.microedition.khronos.opengles.GL10;</code>
<code>import</code> <code>com.badlogic.gdx.ApplicationListener;</code>
<code>import</code> <code>com.badlogic.gdx.Gdx;</code>
<code>import</code> <code>com.badlogic.gdx.graphics.g2d.ParticleEffect;</code>
<code>import</code> <code>com.badlogic.gdx.graphics.g2d.ParticleEffectPool;</code>
<code>import</code> <code>com.badlogic.gdx.graphics.g2d.SpriteBatch;</code>
<code>public</code> <code>class</code> <code>FirstGame </code><code>implements</code> <code>ApplicationListener {</code>
<code> </code><code>SpriteBatch batch; </code><code>// 繪圖用的SpriteBatch</code>
<code> </code>
<code> </code><code>ParticleEffect particle; </code><code>//粒子執行個體</code>
<code> </code><code>ParticleEffect tem; </code><code>//臨時變量</code>
<code> </code><code>ParticleEffectPool particlepool; </code><code>//一個粒子系統的統一管理的類,負責管理粒子系統的産生回收,可以用它的obtain()方法得到一個ParticleEffect執行個體</code>
<code> </code><code>ArrayList<ParticleEffect> particlelist;</code>
<code> </code><code>public</code> <code>void</code> <code>create () {</code>
<code> </code><code>// 執行個體化</code>
<code> </code><code>batch=</code><code>new</code> <code>SpriteBatch();</code>
<code> </code><code>//初始化粒子變量</code>
<code> </code><code>particle = </code><code>new</code> <code>ParticleEffect();</code>
<code> </code><code>//Gdx.files.internal()的位置是在項目的asset根目錄下,同理在asset下的data檔案夾的話,格式應該為Gdx.files.internal(“data/particle.p”).</code>
<code> </code><code>//第一個參數是Particle Editor生成的編輯檔案(注意字尾名也是自己取的,讀取的時候記得對應),第二個參數是形成單個粒子的圖檔檔案。</code>
<code> </code><code>particle.load(Gdx.files.internal(</code><code>"particle.p"</code><code>), Gdx.files.internal(</code><code>""</code><code>)); </code><code>//還可以換成particle_fire.p</code>
<code> </code><code>particlepool=</code><code>new</code> <code>ParticleEffectPool(particle, </code><code>5</code><code>, </code><code>10</code><code>);</code>
<code> </code><code>particlelist=</code><code>new</code> <code>ArrayList<ParticleEffect>(); </code><code>//執行個體化裝粒子效應的集合</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>public</code> <code>void</code> <code>render () {</code>
<code> </code><code>// STUB</code>
<code> </code><code>Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); </code><code>// 清屏</code>
<code> </code><code>Gdx.gl.glClearColor(0f,0f,0f,0f);</code>
<code> </code><code>//對此Gdx包中的input部分提供了Gdx.input.isTouched()方法,判斷目前螢幕是否被觸摸,是則傳回true。</code>
<code> </code><code>if</code><code>(</code><code>true</code><code>){</code>
<code> </code><code>if</code><code>(Gdx.input.isTouched()){</code>
<code> </code><code>//當此觸摸點與上一觸摸點距離大于一定值的時候觸發新的粒子系統,由此減小系統負擔</code>
<code> </code><code>tem=particlepool.obtain();</code>
<code> </code><code>tem.setPosition(Gdx.input.getX(),Gdx.graphics.getHeight()-Gdx.input.getY());</code>
<code> </code><code>particlelist.add(tem);</code>
<code> </code><code>}</code>
<code> </code><code>batch.begin();</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<particlelist.size();i++){</code>
<code> </code><code>particlelist.get(i).draw(batch, Gdx.graphics.getDeltaTime());</code>
<code> </code><code>batch.end();</code>
<code> </code><code>//清除已經播放完成的粒子系統</code>
<code> </code><code>ParticleEffect temparticle;</code>
<code> </code><code>temparticle=particlelist.get(i);</code>
<code> </code><code>if</code><code>(temparticle.isComplete()){</code>
<code> </code><code>particlelist.remove(i);</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>resize (</code><code>int</code> <code>width, </code><code>int</code> <code>height) {</code>
<code> </code><code>public</code> <code>void</code> <code>pause () {</code>
<code> </code><code>public</code> <code>void</code> <code>resume () {</code>
<code> </code><code>public</code> <code>void</code> <code>dispose () {</code>
<code> </code><code>batch.dispose();</code>
<code> </code><code>//千萬别忘了釋放記憶體</code>
<code> </code><code>particle.dispose();</code>
<code> </code><code>if</code><code>(tem!=</code><code>null</code><code>)</code>
<code> </code><code>tem.dispose();</code>
<code> </code><code>particlepool.clear();</code>
這裡注意:particle.load(Gdx.files.internal("particle.p"), Gdx.files.internal(""));
第一個參數是ParticleEditor生成的編輯檔案,圖檔檔案的檔案名必須為particle.png,也就是說無論粒子編輯檔案的名字是什麼,系統讀取的圖檔檔案都應該是particle.png。
效果圖:
ok! 效果出來喽!
<b> 本文轉自zhf651555765 51CTO部落格,原文連結:http://blog.51cto.com/smallwoniu/1256919</b><b>,如需轉載請自行聯系原作者</b>