1.动画的原则框架

       帧的动画帧的动画顾名思义,画就是帧动画。 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只是是N张图片在一帧一帧的切换罢了。对摄像头不清楚的请看

p=992" rel="bookmark">Android研究之游戏开发摄像头更新

       如图所看到的:人物行走动画的实现方式, 4帧行走动画在播放区域 一帧一帧向左切换播放 给人们一种播放动画的假象 。图片就动了起来。 非常easy吧,其他三方向播放动画的方法类似我就不再一一举例。

\

2.动画资源的原始文件动画资源的原始文件PNG 一般有三种形式的呈现方式 请听我细细道来。
1.每一帧是一张png图片中
       如图所看到的上下左右方向每一组动画中的每一帧都是一张png图片,播放动画需要切换整张图片 ,实现动画效果。代码中仅仅需要将下一帧图片完整的覆盖住上一帧的图片就OK了。这样的资源的排列方式在程序算法上是最简单的。
2.全部动画帧都存在一张png图片中       如图所看到的一张png中存放了人物全部的帧动画,播放动画的时候程序须要计算出将要播放的图片在原始图片中的起始坐标和结束坐标,也就是说要从原始图片中把将要播放的图片扣出来。从而显示在手机屏幕上。

这样的资源的排列方式程序须要编写计算图片坐标位置的算法。

3.动画编辑器处理动画游戏公司都会有自己的动画编辑器 ,动画编辑器的优点是

 1.降低图片大小节省内存空间 

 2. 缩短美工对坐标时间 ,由于假设没有编辑器美工非常痛苦的须要一张图片一张图片的对坐标。全是体力活。

3.全然数据驱动动画 ,动画出问题程序不用改代码。

BUG都是美术的 。呵呵。

动画编辑器生成出来的事实上就是坐标 告诉图片的每个点 每个动画的点 拼接起来的每个坐标 程序需要编辑对动画编辑器生成的xml文件 依据生成出来的坐标 进行解析然后绘制出游戏动画。AuroraGT动画编辑器是笔者使用最多的一款动画编辑器它的功能很强大能够编出随意动画。

因为考虑到商业用途 对于这个编辑器的解析与使用我不做不论什么解释 。

假设仅仅是单纯的想学习我把编辑器的下载地址贴出来,大家能够互相研究互相讨论互相学习。

源代码下载:AuroraGT

" class="alignnone size-full wp-image-1004" alt="Android研究之游戏开发帧动画实现(三) - 第4张 | 成功智慧网-专注游戏编程开发!" src="http://www.cgzhw.com/wp-content/uploads/2014/07/414.jpg" style="">

给大家看看生成出来的动画效果非常绚丽吧,是不是非常给力呢 呵呵呵呵。
我用代码具体的说明一下第一种和另外一种游戏动画的代码实现方法。

       我自己写了一个动画类来处理播放动画。须要调用动画仅仅须要new一个Animation对象传入动画所须要的參数通过调用 DrawAnimation 方法就能够按帧播放绘制动画。假设是单纯的学习的话我认为这个类已经够学习使用了。
  1. <strong>package cn.m15.xys;
  2.  
  3. import java.io.InputStream;
  4.  
  5. import android.content.Context;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.Canvas;
  9. import android.graphics.Paint;
  10.  
  11. public class Animation {
  12.  
  13. /** 上一帧播放时间 **/
  14. private long mLastPlayTime = 0;
  15. /** 播放当前帧的ID **/
  16. private int mPlayID = 0;
  17. /** 动画frame数量 **/
  18. private int mFrameCount = 0;
  19. /** 用于储存动画资源图片 **/
  20. private Bitmap[] mframeBitmap = null;
  21. /** 是否循环播放 **/
  22. private boolean mIsLoop = false;
  23. /** 播放结束 **/
  24. private boolean mIsend = false;
  25. /** 动画播放间隙时间 **/
  26. private static final int ANIM_TIME = 100;
  27.  
  28. /**
  29. * 构造函数
  30. * @param context
  31. * @param frameBitmapID
  32. * @param isloop
  33. */
  34. public Animation(Context context, int [] frameBitmapID, boolean isloop) {
  35. mFrameCount = frameBitmapID.length;
  36. mframeBitmap = new Bitmap[mFrameCount];
  37. for(int i =0; i < mFrameCount; i++) {
  38. mframeBitmap[i] = ReadBitMap(context,frameBitmapID[i]);
  39. }
  40. mIsLoop = isloop;
  41. }
  42.  
  43. /**
  44. * 构造函数
  45. * @param context
  46. * @param frameBitmap
  47. * @param isloop
  48. */
  49. public Animation(Context context, Bitmap [] frameBitmap, boolean isloop) {
  50. mFrameCount = frameBitmap.length;
  51. mframeBitmap = frameBitmap;
  52. mIsLoop = isloop;
  53. }
  54.  
  55. /**
  56. * 绘制动画中的当中一帧
  57. * @param Canvas
  58. * @param paint
  59. * @param x
  60. * @param y
  61. * @param frameID
  62. */
  63. public void DrawFrame(Canvas Canvas, Paint paint, int x, int y,int frameID) {
  64. Canvas.drawBitmap(mframeBitmap[frameID], x, y, paint);
  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. }</strong>

大家看看我做的游戏demo  利用上下左右按键 播放向上 向下 向左 向右人物行走动画。

" class="size-full wp-image-1009 aligncenter" alt="Android研究之游戏开发帧动画实现(三) - 第8张 | 成功智慧网-专注游戏编程开发。" src="http://www.cgzhw.com/wp-content/uploads/2014/07/82.jpg" style="">

最后因为代码较多我就不贴在博客中了 , 以下给出Demo源代码的下载欢迎大家下载阅读互相学习。互相研究。互相讨论 希望能够和大家一起进步。

源代码下载:Animation

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android游戏开发研究帧动画实现的更多相关文章

  1. Android游戏开发研究与主角在地图滚动

     让人感动的地图过程平滑滚动         玩过rpg朋友应该都知道RPG的游戏地图一般都比較大 今天我和大家分享一下在RPG游戏中怎样来处理超出手机屏幕大小的游戏地图. 如图所看到的为程序效果 ...

  2. [Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

    初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引 ...

  3. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  4. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  5. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  6. Android(java)学习笔记198:Android下的逐帧动画(Drawable Animation)

    1.帧动画: 帧动画顾名思义,一帧一帧播放的动画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧 ...

  7. Android游戏开发实践(1)之NDK与JNI开发04

    Android游戏开发实践(1)之NDK与JNI开发04 有了前面几篇NDK与JNI开发相关基础做铺垫,再来通过代码说明下这方面具体的操作以及一些重要的细节.那么,就继续NDK与JNI的学习总结. 作 ...

  8. Android游戏开发之旅 View类详解

    Android游戏开发之旅 View类详解 自定义 View的常用方法: onFinishInflate() 当View中所有的子控件 均被映射成xml后触发 onMeasure(int, int) ...

  9. Android游戏开发基本知识

    Android游戏开发 手机游戏被业内人士称为继短信之后的又一座金矿.Android虽然基于Java,但是其虚拟机是基于寄存器的,速度得到了很大的提升,这为Android平台上开发游戏提供了坚强的后盾 ...

随机推荐

  1. mysql table is marked as crashed and last (automatic?) repair failed

    1.同事的服务器在mysqldump备份的时候报错了 这个原因是myisam的表数据太多,在某个时刻, 存放数据的这个MyISAM表数据急速长大. 比如一些log表, 当硬盘写满了.这个时候还在继续写 ...

  2. 【原创】编写多线程Python爬虫来过滤八戒网上的发布任务

    目标: 以特定语言技术为关键字,爬取八戒网中网站设计开发栏目下发布的任务相关信息 需求: 用户通过设置自己感兴趣的关键字或正则表达式,来过滤信息. 我自己选择的是通过特定语言技术作为关键字,php.j ...

  3. 为什么tap事件绑定在document上,而不是对象本身上

    1.在移动端前端开发,click事件有300ms的延时,为了提升用户体验,快速响应.zepto添加了tap事件.tap是在手指触屏横纵向移动距离小于30px,触发tap事件.移动距离的判断是通过tou ...

  4. 《编程简介(Java) &#183;10.3递归思想》

    <编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...

  5. 这两个成员函数inline重新virtual种类

    inlineType表示在编译时扩展功能,随着在函数调用的函数体而出替换函数调用:和vitual它是c++多态的必要条件,但为了表现出多态性,您将需要等到执行,要知道什么是真正的函数调用.从表面上看这 ...

  6. 上Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题和解决方法

    近来在负责公司短信网关的维护及建设,随着公司业务发展对短信依赖越来越严重了,短信每天发送量也比曾经每天40多w发送量暴增到每天达到200w发送量.由于是採用Java做发送底层,压力递增情况下不可避免的 ...

  7. C# WinForm dataGridView 技巧小结

    1.不显示第一个空白列RowHeaderVisible属性设置为false 2.点击cell选取整行SelectinModel属性FullRowSelectRowSelectinModel属性设置或用 ...

  8. GitLab一键式安装bitnami

    https://bitnami.com/stack/gitlab/installer https://bitnami.com/redirect/to/96764/bitnami-gitlab-8.5. ...

  9. 为RadComboBox添加SelectionChanging事件

    代码非标准,仅供参考. using System; using System.Collections.Generic; using System.Linq; using System.Windows. ...

  10. 泛泰A860(高通公司8064 cpu 1080p) 拂4.4中国民营recovery TWRP2.7.1.2文本(通过刷第三版)

    专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo crazyi(天下无雪 ...