Android應用libGDX引擎系列(五)-結合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大會,收獲頗多,尤其是微信團隊葉潤桂關于弱網處理的介紹,真是開了眼界,他們是真正的開發(fā)者在做改變世界改變互聯(lián)網的事情,更覺技術無邊界,潛心修煉內功,努力實踐是多么重要,激發(fā)自己也要不斷創(chuàng)新、總結,自己也要把這前做的東西深入深入再深入,那么就從這篇libgdx在原生應用中的特效綜合筆記開始吧!!!

圖片名稱

進入正題啦

距離上一次發(fā)表四篇文章《Android FrameWork 基于libGDX實現高性能動畫特效(粒子特效/煙花效果篇)》《libGDX 入門精要》《Box2D 入門簡要》《Android FrameWork 基于libGDX實現高性能動畫特效(Box2D/物理碰撞 篇)》,過去很久了,這段時間對于libgdx技術的使用有了一點點新的認識和應用。借著這篇文章的機會和大家分享一下吧。雖然有了些新的代碼和好玩兒效果,但是基本上也是復用了我們之前的技術、框架上沒有大的飛躍和改變,也體現出這個框架在輸出產生新效果時,改動小效果佳的特性。

這段時間特效倉庫有什么變化

解決觸控層級問題

在《Android FrameWork 基于libGDX實現高性能動畫特效(粒子特效/煙花效果篇)》中“設置透明以及層級”中提到的層級問題,用以下方式可以完美解決:通過InterceptableViewGroup替換原有普通的layout容器解決,讓我看一下這個實現比較簡單。

    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;
        }
    }

通過這個實現,我們可以將現在的libgdxfragment放在任何層級,而不影響app的觸控行為。good!!!

利用粒子效果實現點贊飄動的效果

圖片名稱
圖片名稱

這個DEMO(GitHub-粒子特效
利用粒子效果改造一下就可以了,實現中主要有幾點需要關注一下:

  1. 調試粒子軌跡文件***.p這個文件的編輯,讓這種飄動效果看起來自然有一定的隨機效果

  2. 增加用代碼控制的方式,設置幾個libgdx粒子效果參數,這樣的好處是:

    • 控制比.p文件靈活,例如可以增加一些隨機數值等等,定制化比較強的邏輯;
    • 由于.p文件中計量單位都是像素,這樣設置出來的效果在不同分辨率的手機看起來效果不同,舉個例子移動速度在.p文件中設置為100像素每秒的話,在高分屏幕上看起來就要比低分屏幕上移動的慢,如果用代碼設置的話,你可以實現一個dp轉px的方法,這樣以相對距離單位這樣在不同手機上看到的效果基本上就相同了。如下這部分代碼所示:
        //創(chuàng)建粒子系統(tǒng)
        //放大系數
        float scale_lowMin = Utils.DpToPx(0);
        float scale_lowMax = Utils.DpToPx(0);
        float scale_highMin = Utils.DpToPx(43);
        float scale_highMax = Utils.DpToPx(48);
        //移動系數
        float move_lowMin = Utils.DpToPx(15);
        float move_lowMax = Utils.DpToPx(25);
        float move_highMin = Utils.DpToPx(95);
        float move_highMax = Utils.DpToPx(125);
        //設置放大縮小效果
        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();
        }
        //設置發(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碰撞實現禮物掉落效果

圖片名稱
圖片名稱

這個例子是Box2D(GitHub-Box2D碰撞特效,"dianzan"這個分支上)上加以改造完成的。

需要關注的是:

  • Texture的圖片的加載要在libgdx生命周期的函數內完成,這個其實在之前粒子效果那篇文章中已經用到了,但是有一陣子沒寫libgdx相關代碼,居然自己都忘記了。我這里是把創(chuàng)建邏輯放在了libgdx生命周期的create方法內,如下所示:
    <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>
    如果你沒明白的話,你可以試著把加載圖片邏輯封住一個public單獨的方法,在外部直接調用,不管你是在什么線程上調用,圖片都無法加載成功,現象時圖片會顯示為一個個小黑方塊,這點真的值得注意

兩種特效一同使用

問題:在同一個顯示區(qū)域或者說同一個activity中,我想同時使用兩種特效(粒子特效和box2d碰撞特效)有問題嗎?

因為目前粒子效果和box2d是封裝在兩個繼承自AndroidFragmentApplication的fragment中,如果你直接使用兩個fragment層疊的話,處于下層的那個fragment是看不到的。

問題:如何解決?

需要合并代碼,合并哪些代碼呢,首先外層是用同一個繼承自AndroidFragmentApplication的fragment,由于此fragment中核心代碼不多,基本上此部分原有的兩個fragment相似度95%,只有部分業(yè)務接口不同,取并集就可以了,比較簡單。另外繼承自ApplicationListener的view要合并,核心是要在同一個render上完成兩類效果的繪制就可以了,此部分代碼由于量比較大,需要開發(fā)者要使用一定的設計模式更好的設計結構就可以了,沒有什么其他太多的技術難點。

思考與改進

libgdx還能做什么

如果你熟練掌握了我介紹的這套知識和框架,那么你在一些特效實現上可能多了一個不錯的選擇。最近我也在結識更多的libgdx開發(fā)者,大家相互探討,如果你有興趣,可以發(fā)郵件email給我哦,相互學習一下。

另外多看libgdx的源碼營養(yǎng)充分,了解他內部結構知識,對于學習OpenGL很有幫助。

框架改進

目前在項目中使用這個框架有個問題就是對于那些在乎包大小的工程是個問題,我也在努力研究看是否能夠裁剪框架,重新編譯一個精簡版本。但是這個僅僅作為預研內容,畢竟libgdx本身還在不斷改進,這種裁剪可能會對后續(xù)升級有很大限制。

一點點感受總結

長話短說,此次libgdx之旅,這兩點我感觸比較深吧:

  1. 理論從"書"中得來,實戰(zhàn)+產品化才能補齊框架短板
  2. 腦洞大開,不設天花板落實到鍵盤上,得到的比預想的要多;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容