by AlexQ (email alexq_andr@163.com)
工程托管在此:GitHub-粒子特效
What's libGDX?
libGDX is a cross-platform Java game development framework based on OpenGL (ES) that works on Windows, Linux, Mac OS X, Android, your WebGL enabled browser and iOS.
好久不見!
本周末參加了GMTC大會隅肥,收獲頗多,尤其是微信團(tuán)隊(duì)葉潤桂關(guān)于弱網(wǎng)處理的介紹,真是開了眼界,他們是真正的開發(fā)者在做改變世界改變互聯(lián)網(wǎng)的事情瞒津,更覺技術(shù)無邊界宿亡,潛心修煉內(nèi)功,努力實(shí)踐是多么重要太示,激發(fā)自己也要不斷創(chuàng)新、總結(jié)香浩,自己也要把這前做的東西深入深入再深入类缤,那么就從這篇libgdx在原生應(yīng)用中的特效綜合筆記開始吧!A诳浴餐弱!
進(jìn)入正題啦
距離上一次發(fā)表四篇文章《Android FrameWork 基于libGDX實(shí)現(xiàn)高性能動畫特效(粒子特效/煙花效果篇)》《libGDX 入門精要》《Box2D 入門簡要》《Android FrameWork 基于libGDX實(shí)現(xiàn)高性能動畫特效(Box2D/物理碰撞 篇)》,過去很久了镜盯,這段時(shí)間對于libgdx技術(shù)的使用有了一點(diǎn)點(diǎn)新的認(rèn)識和應(yīng)用岸裙。借著這篇文章的機(jī)會和大家分享一下吧。雖然有了些新的代碼和好玩兒效果速缆,但是基本上也是復(fù)用了我們之前的技術(shù)降允、框架上沒有大的飛躍和改變,也體現(xiàn)出這個(gè)框架在輸出產(chǎn)生新效果時(shí)艺糜,改動小效果佳的特性剧董。
這段時(shí)間特效倉庫有什么變化
解決觸控層級問題
在《Android FrameWork 基于libGDX實(shí)現(xiàn)高性能動畫特效(粒子特效/煙花效果篇)》中“設(shè)置透明以及層級”中提到的層級問題,用以下方式可以完美解決:通過InterceptableViewGroup替換原有普通的layout容器解決破停,讓我看一下這個(gè)實(shí)現(xiàn)比較簡單翅楼。
public class InterceptableViewGroup extends RelativeLayout {
private boolean intercept = false;
public InterceptableViewGroup(Context context) {
super(context);
}
public InterceptableViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
}
public InterceptableViewGroup(Context context, AttributeSet attrs, int
defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (intercept)
return true;
return super.onInterceptTouchEvent(ev);
}
public void setIntercept(boolean intercept) {
this.intercept = intercept;
}
}
通過這個(gè)實(shí)現(xiàn),我們可以將現(xiàn)在的libgdxfragment放在任何層級真慢,而不影響app的觸控行為毅臊。good!:诮纭管嬉!
利用粒子效果實(shí)現(xiàn)點(diǎn)贊飄動的效果
這個(gè)DEMO(GitHub-粒子特效)
利用粒子效果改造一下就可以了皂林,實(shí)現(xiàn)中主要有幾點(diǎn)需要關(guān)注一下:
調(diào)試粒子軌跡文件***.p這個(gè)文件的編輯,讓這種飄動效果看起來自然有一定的隨機(jī)效果
-
增加用代碼控制的方式蚯撩,設(shè)置幾個(gè)libgdx粒子效果參數(shù)础倍,這樣的好處是:
- 控制比.p文件靈活,例如可以增加一些隨機(jī)數(shù)值等等胎挎,定制化比較強(qiáng)的邏輯沟启;
- 由于.p文件中計(jì)量單位都是像素,這樣設(shè)置出來的效果在不同分辨率的手機(jī)看起來效果不同犹菇,舉個(gè)例子移動速度在.p文件中設(shè)置為100像素每秒的話德迹,在高分屏幕上看起來就要比低分屏幕上移動的慢,如果用代碼設(shè)置的話项栏,你可以實(shí)現(xiàn)一個(gè)dp轉(zhuǎn)px的方法浦辨,這樣以相對距離單位這樣在不同手機(jī)上看到的效果基本上就相同了。如下這部分代碼所示:
//創(chuàng)建粒子系統(tǒng)
//放大系數(shù)
float scale_lowMin = Utils.DpToPx(0);
float scale_lowMax = Utils.DpToPx(0);
float scale_highMin = Utils.DpToPx(43);
float scale_highMax = Utils.DpToPx(48);
//移動系數(shù)
float move_lowMin = Utils.DpToPx(15);
float move_lowMax = Utils.DpToPx(25);
float move_highMin = Utils.DpToPx(95);
float move_highMax = Utils.DpToPx(125);
//設(shè)置放大縮小效果
try{
mParticle.getEmitters().get(0).getScale().setLow(scale_lowMin,
scale_lowMax);
mParticle.getEmitters().get(0).getScale().setHigh(scale_highMin,
scale_highMax);
}
catch (Exception e){
e.printStackTrace();
}
//設(shè)置發(fā)生器發(fā)射速度
try {
mParticle.getEmitters().get(0).getVelocity().setLow(move_lowMin,
move_lowMax);
mParticle.getEmitters().get(0).getVelocity().setHigh(move_highMin,
move_highMax);
}
catch (Exception e){
e.printStackTrace();
}
利用Box2D碰撞實(shí)現(xiàn)禮物掉落效果
這個(gè)例子是Box2D(GitHub-Box2D碰撞特效沼沈,"dianzan"這個(gè)分支上)上加以改造完成的。
需要關(guān)注的是:
- Texture的圖片的加載要在libgdx生命周期的函數(shù)內(nèi)完成币厕,這個(gè)其實(shí)在之前粒子效果那篇文章中已經(jīng)用到了列另,但是有一陣子沒寫libgdx相關(guān)代碼,居然自己都忘記了旦装。我這里是把創(chuàng)建邏輯放在了libgdx生命周期的create方法內(nèi)页衙,如下所示:
<code><pre>
@Override
public void create() {
float w = Gdx.graphics.getWidth();
float h = Gdx.graphics.getHeight();
for (int i=1; i < size; i++)
m_giftTextures.add( new Texture(Gdx.files.internal("gifts/"+i
+".png")));
m_starTextures.add(new Texture(Gdx.files.internal("star.png")));
m_starTextures.add(new Texture(Gdx.files.internal("star_self.png")));
......省略其他邏輯......
}
</code></pre>
如果你沒明白的話,你可以試著把加載圖片邏輯封住一個(gè)public單獨(dú)的方法阴绢,在外部直接調(diào)用店乐,不管你是在什么線程上調(diào)用,圖片都無法加載成功呻袭,現(xiàn)象時(shí)圖片會顯示為一個(gè)個(gè)小黑方塊,這點(diǎn)真的值得注意眨八。
兩種特效一同使用
問題:在同一個(gè)顯示區(qū)域或者說同一個(gè)activity中,我想同時(shí)使用兩種特效(粒子特效和box2d碰撞特效)有問題嗎左电?
因?yàn)槟壳傲W有Ч蚥ox2d是封裝在兩個(gè)繼承自AndroidFragmentApplication的fragment中廉侧,如果你直接使用兩個(gè)fragment層疊的話,處于下層的那個(gè)fragment是看不到的篓足。
問題:如何解決段誊?
需要合并代碼,合并哪些代碼呢栈拖,首先外層是用同一個(gè)繼承自AndroidFragmentApplication的fragment连舍,由于此fragment中核心代碼不多,基本上此部分原有的兩個(gè)fragment相似度95%涩哟,只有部分業(yè)務(wù)接口不同索赏,取并集就可以了盼玄,比較簡單。另外繼承自ApplicationListener的view要合并参滴,核心是要在同一個(gè)render上完成兩類效果的繪制就可以了强岸,此部分代碼由于量比較大,需要開發(fā)者要使用一定的設(shè)計(jì)模式更好的設(shè)計(jì)結(jié)構(gòu)就可以了砾赔,沒有什么其他太多的技術(shù)難點(diǎn)蝌箍。
思考與改進(jìn)
libgdx還能做什么
如果你熟練掌握了我介紹的這套知識和框架,那么你在一些特效實(shí)現(xiàn)上可能多了一個(gè)不錯(cuò)的選擇暴心。最近我也在結(jié)識更多的libgdx開發(fā)者妓盲,大家相互探討,如果你有興趣专普,可以發(fā)郵件email給我哦悯衬,相互學(xué)習(xí)一下。
另外多看libgdx的源碼營養(yǎng)充分檀夹,了解他內(nèi)部結(jié)構(gòu)知識筋粗,對于學(xué)習(xí)OpenGL很有幫助。
框架改進(jìn)
目前在項(xiàng)目中使用這個(gè)框架有個(gè)問題就是對于那些在乎包大小的工程是個(gè)問題炸渡,我也在努力研究看是否能夠裁剪框架娜亿,重新編譯一個(gè)精簡版本。但是這個(gè)僅僅作為預(yù)研內(nèi)容蚌堵,畢竟libgdx本身還在不斷改進(jìn)买决,這種裁剪可能會對后續(xù)升級有很大限制。
一點(diǎn)點(diǎn)感受總結(jié)
長話短說吼畏,此次libgdx之旅督赤,這兩點(diǎn)我感觸比較深吧:
- 理論從"書"中得來,實(shí)戰(zhàn)+產(chǎn)品化才能補(bǔ)齊框架短板泻蚊;
- 腦洞大開躲舌,不設(shè)天花板,落實(shí)到鍵盤上藕夫,得到的比預(yù)想的要多孽糖;