Android游戲開發之游戲幀動畫的播放與處理

来源:http://www.cnblogs.com/8hao/archive/2016/03/02/5235598.html
-Advertisement-
Play Games

帶你走進游戲開發的世界之游戲幀動畫的處理<ignore_js_op> 1.幀動畫的原理 幀動畫幀動畫顧名思義,一幀一幀播放的動畫就是幀動畫。 幀動畫和我們小時候看的動畫片的原理是一樣的,在相同區域快速切換圖片給人們呈現一種視覺的假象感覺像是在播放動畫,其實不過是N張圖片在一幀一幀的切換罷了。 如圖所


帶你走進游戲開發的世界之游戲幀動畫的處理
<ignore_js_op> 
1.幀動畫的原理

       幀動畫幀動畫顧名思義,一幀一幀播放的動畫就是幀動畫。 幀動畫和我們小時候看的動畫片的原理是一樣的,在相同區域快速切換圖片給人們呈現一種視覺的假象感覺像是在播放動畫,其實不過是N張圖片在一幀一幀的切換罷了。
     
       如圖所示:人物行走動畫的實現方式, 4幀行走動畫在播放區域 一幀一幀向左切換播放 給人們一種播放動畫的假象 ,圖片就動了起來, 很簡單吧,其它三方向播放動畫的方法類似我就不再一一舉例。
<ignore_js_op> 
2.動畫資源的原始文件

動畫資源的原始文件PNG 一般有三種形式的呈現方式 請聽我細細道來。



1.每一幀是一張png圖片中

       如圖所示上下左右方向每一組動畫中的每一幀都是一張png圖片,播放動畫須要切換整張圖片 ,實現動畫效果。代碼中只需要將下一幀圖片完整的覆蓋住上一幀的圖片就OK了,這種資源的排列方式在程式演算法上是最簡單的。
<ignore_js_op> 
2.所有動畫幀都存在一張png圖片中

       如圖所示一張png中存放了人物所有的幀動畫,播放動畫的時候程式需要計算出將要播放的圖片在原始圖片中的起始坐標和結束坐標,也就是說要從原始圖片中把將要播放的圖片扣出來,從而顯示在手機屏幕上。這種資源的排列方式程式需要編寫計算圖片坐標位置的演算法。
<ignore_js_op> 
3.動畫編輯器處理動畫

游戲公司都會有自己的動畫編輯器 ,動畫編輯器的好處是
1.減少圖片大小節省記憶體空間 
2. 縮短美工對坐標時間 ,因為如果沒有編輯器美工很痛苦的需要一張圖片一張圖片的對坐標,全是體力活。
3.完全數據驅動動畫 ,動畫出問題程式不用改代碼。BUG都是美術的 ,呵呵。

       動畫編輯器生成出來的其實就是坐標 告訴圖片的每一個點 每個動畫的點 拼接起來的每一個坐標 程式須要編輯對動畫編輯器生成的xml文件 根據生成出來的坐標 進行解析然後繪製出游戲動畫。AuroraGT動畫編輯器是筆者使用最多的一款動畫編輯器它的功能非常強大可以編出任意動畫。由於考慮到商業用途 對於這個編輯器的解析與使用我不做任何解釋 。如果只是單純的想學習我把編輯器的下載地址貼出來,大家可以互相研究互相討論互相學習。

下載地址: <ignore_js_op> AuroraGT.rar (1.51 MB, 下載次數: 2046) 
<ignore_js_op>
給大家看看生成出來的動畫效果很絢麗吧,是不是很給力呢 呵呵呵呵。

<ignore_js_op> 
<ignore_js_op> 
我用代碼詳細的說明一下第一種和第二種游戲動畫的代碼實現方法。

       我自己寫了一個動畫類來處理播放動畫,需要調用動畫只需要new一個Animation對象傳入動畫所需要的參數通過調用 DrawAnimation 方法就可以按幀播放繪製動畫。如果是單純的學習的話我覺得這個類已經夠學習使用了。

  1. package cn.m15.xys;
  2. import java.io.InputStream;
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.graphics.Canvas;
  7. import android.graphics.Paint;
  8. public class Animation {
  9.     /** 上一幀播放時間 **/
  10.     private long mLastPlayTime = 0;
  11.     /** 播放當前幀的ID **/
  12.     private int mPlayID = 0;
  13.     /** 動畫frame數量 **/
  14.     private int mFrameCount = 0;
  15.     /** 用於儲存動畫資源圖片 **/
  16.     private Bitmap[] mframeBitmap = null;
  17.     /** 是否迴圈播放 **/
  18.     private boolean mIsLoop = false;
  19.     /** 播放結束 **/
  20.     private boolean mIsend = false;
  21.     /** 動畫播放間隙時間 **/
  22.     private static final int ANIM_TIME = 100;
  23.     
  24.     
  25.     /**
  26.      * 構造函數 
  27.      * @param context
  28.      * @param frameBitmapID
  29.      * @param isloop
  30.      */
  31.     public Animation(Context context, int [] frameBitmapID, boolean isloop) {
  32.         mFrameCount = frameBitmapID.length;
  33.         mframeBitmap = new Bitmap[mFrameCount];
  34.         for(int i =0; i < mFrameCount; i++) {
  35.             mframeBitmap[i] = ReadBitMap(context,frameBitmapID[i]);
  36.         }
  37.         mIsLoop = isloop;
  38.     }
  39.     
  40.     /**
  41.      * 構造函數
  42.      * @param context
  43.      * @param frameBitmap
  44.      * @param isloop
  45.      */
  46.     public Animation(Context context, Bitmap [] frameBitmap, boolean isloop) {
  47.         mFrameCount = frameBitmap.length;
  48.         mframeBitmap = frameBitmap;
  49.         mIsLoop = isloop;
  50.     }
  51.     
  52.     
  53.     
  54.    /**
  55.     * 繪製動畫中的其中一幀
  56.     * @param Canvas
  57.     * @param paint
  58.     * @param x
  59.     * @param y
  60.     * @param frameID
  61.     */
  62.     public void DrawFrame(Canvas Canvas, Paint paint, int x, int y,int frameID) {
  63.         Canvas.drawBitmap(mframeBitmap[frameID], x, y, paint);
  64.     }
  65.     
  66.     
  67.     /**
  68.      * 繪製動畫
  69.      * @param Canvas
  70.      * @param paint
  71.      * @param x
  72.      * @param y
  73.      */
  74.     public void DrawAnimation(Canvas Canvas, Paint paint, int x, int y) {
  75.         //如果沒有播放結束則繼續播放
  76.         if (!mIsend) {
  77.             Canvas.drawBitmap(mframeBitmap[mPlayID], x, y, paint);
  78.             long time = System.currentTimeMillis();
  79.             if (time - mLastPlayTime > ANIM_TIME) {
  80.                 mPlayID++;
  81.                 mLastPlayTime = time;
  82.                 if (mPlayID >= mFrameCount) {
  83.                     //標誌動畫播放結束
  84.                     mIsend = true;
  85.                     if (mIsLoop) {
  86.                         //設置迴圈播放
  87.                         mIsend = false;
  88.                         mPlayID = 0;
  89.                     }
  90.                 }
  91.             }
  92.         }
  93.     }
  94.     
  95.     /**
  96.      * 讀取圖片資源
  97.      * @param context
  98.      * @param resId
  99.      * @return
  100.      */
  101.     public Bitmap ReadBitMap(Context context, int resId) {
  102.         BitmapFactory.Options opt = new BitmapFactory.Options();
  103.         opt.inPreferredConfig = Bitmap.Config.RGB_565;
  104.         opt.inPurgeable = true;
  105.         opt.inInputShareable = true;
  106.         // 獲取資源圖片
  107.         InputStream is = context.getResources().openRawResource(resId);
  108.         return BitmapFactory.decodeStream(is, null, opt);
  109.     }
  110. }
複製代碼

大家看看我做的游戲demo  利用上下左右按鍵 播放向上 向下 向左 向右人物行走動畫。
<ignore_js_op> 
<ignore_js_op> 
<ignore_js_op> 
最後由於代碼較多我就不貼在博客中了 , 下麵給出Demo源碼的下載地址歡迎大家下載閱讀互相學習,互相研究
<ignore_js_op> 第三講之幀動畫.rar (426.78 KB, 下載次數: 1354) 

問啊-定製化IT教育平臺牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 獲取【下載地址】 QQ: 313596790 【免費支持更新】支持三大資料庫 mysql oracle sqlsever 更專業、更強悍、適合不同用戶群體【新錄針對本系統的視頻教程,手把手教開發一個模塊,快速掌握本系統】A 代碼生成器(開發利器); 增刪改查的處理類,service層,mybatis
  • 定義: 單例模式:確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 使用場景: 確保某一個類有且只有一個對象的場景,避免產生多個對象消耗過多的資源,或者某種類型的對象只應該有且只有一個。 UML類圖: 單例模式幾個關鍵點: 1、構造函數不對外開放,一般為private。 2、通過一
  • 第二章:商場促銷——策略模式 策略模式的定義: 策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,知識實現不同,他可以以相同的方式調用所有的演算法,減少了各類演算法類與使用演算法類之間的耦合 策略模式的優點 : 1. 策略模式的Strategy 類層次為Context定義
  • Atitit.biz業務系統 面向框架 面向模式---------數據映射imp 1.1. 面向變數 面向過程 面向對象 面向組件 面向框架 面向服務 面向模式1 1.2. 第2章 架構模式 18 1 1.3. 第3章 設計模式 143 2 1.4. 面向對象中的面向變數全局變數問題2 1.5. 面
  • Atitit.wrmi web rmi框架新特性 1. V1d 新特性1 1.1. 增加了精確參數1 1.2. 增加了req參數,命名參數模式。。1 1.3. 增加了globale 傳遞隱含參數req resp等1 1.4. Cs bs兩個版本的實現1 2. V2 新特性2 2.1. $req對象預
  • 協議 協議只有方法的聲明(類似於其他編程語言的介面) 協議相當於大家都所遵循的 關鍵字 @protocol 協議名 <所遵循的協議> 預設NSObject @end @protocollamcoProtocol <NSObject>@required //必須實現的方法 -(void)study;@
  • 本軟體設定用戶第一個接觸到的功能就是頁面載入等待功能,這個功能對使用者來說就是一個持續1、2秒鐘的等待頁面,在用戶等待的同時程式做一些必要的檢查以及數據準備工作,載入頁面分為UI篇和功能篇,從表及里首先是UI的實現,一個軟體除功能之外還得有一個光鮮的外表也是非常重要的,儘管本人設計水平一般但是還是親
  • 先看下onBackPressed和onKeyDown的區別 在Android上有兩種方法來獲取該按鈕的事件 1.直接獲取按鈕按下事件,此方法相容Android 1.0到Android 2.1 也是常規方法,直接重寫Activity的onKeyDown方法即可,代碼如下: @Override publ
一周排行
    -Advertisement-
    Play Games
  • ## 引言 最近發現自己喜歡用的 Todo 軟體總是差點意思,畢竟每個人的習慣和工作流不太一樣,我就想著自己寫一個小的[Todo 項目]( https://github.com/circler3/TodoTrack ),核心的功能是自動記錄 Todo 執行過程中消耗的時間(尤其面向程式員),按照自己 ...
  • ### 前言 當我們編寫 C# 代碼時,經常需要處理大量的數據集合。在傳統的方式中,我們往往需要先將整個數據集合載入到記憶體中,然後再進行操作。但是如果數據集合非常大,這種方式就會導致記憶體占用過高,甚至可能導致程式崩潰。 C# 中的`yield return`機制可以幫助我們解決這個問題。通過使用`y ...
  • 1. ADO.NET的前世今生 ADO.NET的名稱起源於ADO(ActiveX Data Objects),是一個COM組件庫,用於在以往的Microsoft技術中訪問數據。之所以使用ADO.NET名稱,是因為Microsoft希望表明,這是在NET編程環境中優先使用的數據訪問介面。 ADO.NE ...
  • 1. 為什麼需要單元測試 在我們之前,測試某些功能是否能夠正常運行時,我們都將代碼寫到Main方法中,當我們測試第二個功能時,我們只能選擇將之前的代碼清掉,重新編寫。此時,如果你還想重新測試你之前的功能時,這時你就顯得有些難為情了,因為代碼都被你清掉了。當然你完全可以把代碼寫到一個記事本中進行記錄, ...
  • 1. 透過現象看本質 反射被譽為是 c#中的黑科技 ,在很多領域中都有反射的身影,例如,我們經常使用的ORM框架,ABP框架 等。 反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。. 程式集包含模塊,而模塊包含類型,類型又包含成員。. 反射則提供了封裝程式集、模塊和類型的對象。. 您可以使 ...
  • # Rust Web 全棧開發之 Web Service 中的錯誤處理 ## Web Service 中的統一錯誤處理 ### Actix Web Service 自定義錯誤類型 -> 自定義錯誤轉為 HTTP Response - 資料庫 - 資料庫錯誤 - 串列化 - serde 錯誤 - I/ ...
  • 在前面的幾篇文章中,詳細地給大家介紹了Java里的集合。但在介紹集合時,我們涉及到了泛型的概念卻並沒有詳細學習,所以今天我們要花點時間給大家專門講解什麼是泛型、泛型的作用、用法、特點等內容 ...
  • ###BIO:同步阻塞 主線程發起io請求後,需要等待當前io操作完成,才能繼續執行。 ###NIO:同步非阻塞 引入selector、channel、等概念,當主線程發起io請求後,輪詢的查看系統是否準備好執行io操作,沒有準備好則主線程不會阻塞會繼續執行,準備好主線程會阻塞等待io操作完成。 # ...
  • 摘要:在讀多寫少的環境中,有沒有一種比ReadWriteLock更快的鎖呢?有,那就是JDK1.8中新增的StampedLock! 本文分享自華為雲社區《【高併發】高併發場景下一種比讀寫鎖更快的鎖》,作者: 冰 河。 什麼是StampedLock? ReadWriteLock鎖允許多個線程同時讀取共 ...
  • ## 併發與並行😣 ### 併發與並行的概念和區別 並行:同一個時間段內多個任務同時在不同的CPU核心上執行。強調同一時刻多個任務之間的”**同時執行**“。 併發:同一個時間段內多個任務都在進展。強調多個任務間的”**交替執行**“。 ![](https://img2023.cnblogs.co ...