Android應(yīng)用libGDX引擎系列(五)-結(jié)合APP開發(fā)綜合筆記

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)注一下:

  1. 調(diào)試粒子軌跡文件***.p這個(gè)文件的編輯,讓這種飄動效果看起來自然有一定的隨機(jī)效果

  2. 增加用代碼控制的方式蚯撩,設(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)我感觸比較深吧:

  1. 理論從"書"中得來,實(shí)戰(zhàn)+產(chǎn)品化才能補(bǔ)齊框架短板泻蚊;
  2. 腦洞大開躲舌,不設(shè)天花板落實(shí)到鍵盤上藕夫,得到的比預(yù)想的要多孽糖;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毅贮,隨后出現(xiàn)的幾起案子办悟,更是在濱河造成了極大的恐慌,老刑警劉巖滩褥,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病蛉,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铺然,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門俗孝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魄健,你說我怎么就攤上這事赋铝。” “怎么了沽瘦?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵革骨,是天一觀的道長。 經(jīng)常有香客問我析恋,道長良哲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任助隧,我火速辦了婚禮筑凫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘并村。我一直安慰自己巍实,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布哩牍。 她就那樣靜靜地躺著蔫浆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姐叁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天洗显,我揣著相機(jī)與錄音外潜,去河邊找鬼。 笑死挠唆,一個(gè)胖子當(dāng)著我的面吹牛处窥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玄组,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼滔驾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了俄讹?” 一聲冷哼從身側(cè)響起哆致,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎患膛,沒想到半個(gè)月后摊阀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年胞此,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了臣咖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,637評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漱牵,死狀恐怖夺蛇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酣胀,我是刑警寧澤刁赦,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站灵临,受9級特大地震影響截型,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜儒溉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一宦焦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顿涣,春花似錦波闹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒲障,卻和暖如春歹篓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揉阎。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工庄撮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毙籽。 一個(gè)月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓洞斯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坑赡。 傳聞我的和親對象是個(gè)殘疾皇子烙如,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容