Android游戏开发之游戏帧动画的播放与处理

带你走进游戏开发的世界之游戏帧动画的处理
<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. * @param context
  26. * @param frameBitmapID
  27. * @param isloop
  28. */
  29. public Animation(Context context, int [] frameBitmapID, boolean isloop) {
  30. mFrameCount = frameBitmapID.length;
  31. mframeBitmap = new Bitmap[mFrameCount];
  32. for(int i =0; i < mFrameCount; i++) {
  33. mframeBitmap[i] = ReadBitMap(context,frameBitmapID[i]);
  34. }
  35. mIsLoop = isloop;
  36. }
  37. /**
  38. * 构造函数
  39. * @param context
  40. * @param frameBitmap
  41. * @param isloop
  42. */
  43. public Animation(Context context, Bitmap [] frameBitmap, boolean isloop) {
  44. mFrameCount = frameBitmap.length;
  45. mframeBitmap = frameBitmap;
  46. mIsLoop = isloop;
  47. }
  48. /**
  49. * 绘制动画中的其中一帧
  50. * @param Canvas
  51. * @param paint
  52. * @param x
  53. * @param y
  54. * @param frameID
  55. */
  56. public void DrawFrame(Canvas Canvas, Paint paint, int x, int y,int frameID) {
  57. Canvas.drawBitmap(mframeBitmap[frameID], x, y, paint);
  58. }
  59. /**
  60. * 绘制动画
  61. * @param Canvas
  62. * @param paint
  63. * @param x
  64. * @param y
  65. */
  66. public void DrawAnimation(Canvas Canvas, Paint paint, int x, int y) {
  67. //如果没有播放结束则继续播放
  68. if (!mIsend) {
  69. Canvas.drawBitmap(mframeBitmap[mPlayID], x, y, paint);
  70. long time = System.currentTimeMillis();
  71. if (time - mLastPlayTime > ANIM_TIME) {
  72. mPlayID++;
  73. mLastPlayTime = time;
  74. if (mPlayID >= mFrameCount) {
  75. //标志动画播放结束
  76. mIsend = true;
  77. if (mIsLoop) {
  78. //设置循环播放
  79. mIsend = false;
  80. mPlayID = 0;
  81. }
  82. }
  83. }
  84. }
  85. }
  86. /**
  87. * 读取图片资源
  88. * @param context
  89. * @param resId
  90. * @return
  91. */
  92. public Bitmap ReadBitMap(Context context, int resId) {
  93. BitmapFactory.Options opt = new BitmapFactory.Options();
  94. opt.inPreferredConfig = Bitmap.Config.RGB_565;
  95. opt.inPurgeable = true;
  96. opt.inInputShareable = true;
  97. // 获取资源图片
  98. InputStream is = context.getResources().openRawResource(resId);
  99. return BitmapFactory.decodeStream(is, null, opt);
  100. }
  101. }

复制代码

大家看看我做的游戏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行业人员进入!

时间: 2024-10-09 23:58:47

Android游戏开发之游戏帧动画的播放与处理的相关文章

Android 软件开发与游戏开发1 至 32系列博文大合集

Android 软件开发与游戏开发1 至 32系列博文大合集Android 软件开发与游戏开发1 至 32系列博文大合集 http://www.qdmm.com/BookReader/17958,65822595.aspxhttp://www.qdmm.com/BookReader/17958,65822597.aspxhttp://www.qdmm.com/BookReader/17958,65822598.aspxhttp://www.qdmm.com/BookReader/17958,65

android 逐帧动画的播放与播放结束操作对象

逐帧动画的xml代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 3 android:oneshot="true" > 4 5 <item 6 android:drawable="@drawabl

转Android 用Animation-list实现逐帧动画

Android 用Animation-list实现逐帧动画 第一步:先上图片素材,以下素材放到res/drawable目录下: http://blog.csdn.net/aminfo/article/details/7847761 图片素材: 文件名称: icon1.png icon2.png icon3.png icon4.png icon5.png icon6.png 第二步:上动画Animation-list帧布局文件,有2个,一个是按顺序显示动画,一个是倒序显示动画,文件存放在res/d

quick-cocos2d-x游戏开发【8】——动画与动作

动画与动作,在quick中都有对其封装,所以我们还是来看一下吧. 总的来说,对于帧动画,quick封装的方法我们可以经常使用,这是非常方便的,下面直接上代码来直观感受下, 比如,14张帧图片,采用cocos2d-x lua的方法来写是这样的, local sp = display.newSprite("grossini_dance_01.png", display.cx, display.cy) self:addChild(sp) local animation = CCAnimati

Android音频开发(3):如何播放一帧音频

本文重点关注如何在Android平台上播放一帧音频数据.阅读本文之前,建议先读一下<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的概念后,开发过程中的很多参数和流程就会更加容易理解. Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack,关于它们的区别可以看这篇文章:<Intro to the three Android Audio APIs>,简单来说

cocos2d-x游戏开发之游戏主循环

首先还是就我个人的理解,讲讲游戏引擎的处理流程. 其实游戏逻辑简单化就是一个死循环,如下: 1 2 bool game_is_running = true; 3 4 while( game_is_running ) { 5 update_game(); 6 display_game(); 7 } 我们所看到的游戏画面,游戏音乐,以及一些触控,输入等.在逻辑上就是这么一个死循环.这个循环一直在跑,期间会处理一些列的事件,简化之就是上面的两个函数. cocos2d-x引擎也是如此,所有的逻辑都是在这

在线捉鬼游戏开发之一 - 游戏流程介绍与技术选用

看过芒果台某知名节目的朋友们应该对“谁是卧底”不会陌生:N人参与,N-1人拿到同一个词(如馒头),剩余一人拿到另一个词(如包子),N人都只能看到自己的词,故没人知道自己是否和别人描述的不一样.游戏采用轮流发言制,想尽办法描述自己手中的词,让自己不被怀疑,且又不能让真正的卧底猜出自己和别人不一样,直到猜出谁是卧底. 此类游戏的有趣之处在于描述的尺度要拿捏在明确且不点破之间,机器没有人的智慧那么发散,人的参与感就更重要了(不然好比我喜欢的飞行棋,你还真不知道网络对面的对手是不是条狗). 捉鬼 这个游

JavaFX横幅类游戏开发 教训 游戏贴图

上一节课,我们即将完成战旗Demo有了一个大概的了解.教训这,我们将学习绘制游戏地图. 由于JavaFX 2.2中添加了Canvas相关的功能,我们就能够使用Canvas来实现游戏绘制了. 游戏地图绘制主要用到GraphicsContext.drawImage方法. drawImage(Image image,double sx,double sy,double sw,double sh,double dx,double dy,double dw,double dh); 当中image 表示源图

Cocos2d-x开发实例介绍帧动画使用

以下我们通过一个实例介绍一下帧动画的使用.这个实比例如以下图所看到的,点击Gobutton開始播放动画,这时候播放button标题变为Stop,点击Stopbutton能够停止播放动画. 以下我们再看看详细的程序代码,首先看一下看HelloWorldScene.h文件,它的代码例如以下: #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld