雨松MOMO带你走进游戏开发的世界之游戏帧动画的处理

雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/242

1.帧动画的原理

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

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

2. 动画资源的原始文件

动画资源的原始文件PNG 一般有三种形式的呈现方式 请听我细细道来。

1.每一帧是一张png图片中
       如图所示上下左右方向每一组动画中的每一帧都是一张png图片,播放动画须要切换整张图片 ,实现动画效果。代码中只需要将下一帧图片完整的覆盖住上一帧的图片就OK了,这种资源的排列方式在程序算法上是最简单的。

2.所有动画帧都存在一张png图片中

如图所示一张png中存放了人物所有的帧动画,播放动画的时候程序需要计算出将要播放的图片在原始图片中的起始坐标和结束坐标,也就是说要从原始图片中把将要播放的图片扣出来,从而显示在手机屏幕上。这种资源的排列方式程序需要编写计算图片坐标位置的算法。

3.动画编辑器处理动画

游戏公司都会有自己的动画编辑器 ,动画编辑器的好处是
 1.减少图片大小节省内存空间
 2. 缩短美工对坐标时间 ,因为如果没有编辑器美工很痛苦的需要一张图片一张图片的对坐标,全是体力活。
 3.完全数据驱动动画 ,动画出问题程序不用改代码。BUG都是美术的 ,呵呵。

动画编辑器生成出来的其实就是坐标 告诉图片的每一个点 每个动画的点 拼接起来的每一个坐标 程序须要编辑对动画编辑器生成的xml文件 根据生成出来的坐标 进行解析然后绘制出游戏动画。AuroraGT动画编辑器是笔者使用最多的一款动画编辑器它的功能非常强大可以编出任意动画。由于考虑到商业用途 对于这个编辑器的解析与使用我不做任何解释 。如果只是单纯的想学习我把编辑器的下载地址贴出来,大家可以互相研究互相讨论互相学习。

下载地址:http://download.csdn.net/source/3462935

给大家看看生成出来的动画效果很绚丽吧,是不是很给力呢 呵呵呵呵。

       

我用代码详细的说明一下第一种和第二种游戏动画的代码实现方法。
       我自己写了一个动画类来处理播放动画,需要调用动画只需要new一个Animation对象传入动画所需要的参数通过调用 DrawAnimation 方法就可以按帧播放绘制动画。如果是单纯的学习的话我觉得这个类已经够学习使用了。

package cn.m15.xys;import java.io.InputStream;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;public class Animation {/** 上一帧播放时间 **/private long mLastPlayTime = 0;/** 播放当前帧的ID **/private int mPlayID = 0;/** 动画frame数量 **/private int mFrameCount = 0;/** 用于储存动画资源图片 **/private Bitmap[] mframeBitmap = null;/** 是否循环播放 **/private boolean mIsLoop = false;/** 播放结束 **/private boolean mIsend = false;/** 动画播放间隙时间 **/private static final int ANIM_TIME = 100;/*** 构造函数 * @param context* @param frameBitmapID* @param isloop*/public Animation(Context context, int [] frameBitmapID, boolean isloop) {mFrameCount = frameBitmapID.length;mframeBitmap = new Bitmap[mFrameCount];for(int i =0; i < mFrameCount; i++) {mframeBitmap[i] = ReadBitMap(context,frameBitmapID[i]);}mIsLoop = isloop;}/*** 构造函数* @param context* @param frameBitmap* @param isloop*/public Animation(Context context, Bitmap [] frameBitmap, boolean isloop) {mFrameCount = frameBitmap.length;mframeBitmap = frameBitmap;mIsLoop = isloop;}/*** 绘制动画中的其中一帧* @param Canvas* @param paint* @param x* @param y* @param frameID*/public void DrawFrame(Canvas Canvas, Paint paint, int x, int y,int frameID) {Canvas.drawBitmap(mframeBitmap[frameID], x, y, paint);}/*** 绘制动画* @param Canvas* @param paint* @param x* @param y*/public void DrawAnimation(Canvas Canvas, Paint paint, int x, int y) {//如果没有播放结束则继续播放if (!mIsend) {Canvas.drawBitmap(mframeBitmap[mPlayID], x, y, paint);long time = System.currentTimeMillis();if (time - mLastPlayTime > ANIM_TIME) {mPlayID++;mLastPlayTime = time;if (mPlayID >= mFrameCount) {//标志动画播放结束mIsend = true;if (mIsLoop) {//设置循环播放mIsend = false;mPlayID = 0;}}}}}/*** 读取图片资源* @param context* @param resId* @return*/public Bitmap ReadBitMap(Context context, int resId) {BitmapFactory.Options opt = new BitmapFactory.Options();opt.inPreferredConfig = Bitmap.Config.RGB_565;opt.inPurgeable = true;opt.inInputShareable = true;// 获取资源图片InputStream is = context.getResources().openRawResource(resId);return BitmapFactory.decodeStream(is, null, opt);}
}


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

最后由于代码较多我就不贴在博客中了 , 下面给出Demo源码的下载地址欢迎大家下载阅读互相学习,互相研究,互相讨论 雨松MOMO希望可以和大家一起进步。

下载地址:http://www.xuanyusong.com/archives/242

Android游戏开发之游戏帧动画的播放与处理(七)相关推荐

  1. android 开发游戏_Android游戏开发–基本游戏循环

    android 开发游戏 在到目前为止的系列之后,您将对游戏架构有所了解. 即使只是短暂的一次,但我们知道我们需要以某种形式进行输入,更新游戏的内部状态,最后将其渲染到屏幕上,并产生一些声音和/或振动 ...

  2. 雪碧图 游戏开发_Android游戏开发–雪碧动画

    雪碧图 游戏开发 如果到目前为止您仍然关注该系列 ,我们将在处理触摸,显示图像和移动它们方面广为人知. 但是,动态图像看起来很呆板,因为它看起来确实是假的和业余的. 为了给角色一些生活,我们将需要做更 ...

  3. android游戏开发_Android游戏开发–游戏循环

    android游戏开发 游戏循环是每个游戏的心跳. 到目前为止,我们仅使用了非常简单的一种(您可以在此处找到),无法控制我们更新游戏状态的速度或速度以及要渲染的帧. 概括地说,最基本的游戏循环是whi ...

  4. android策略模式_Android游戏开发–设计游戏实体–策略模式

    android策略模式 在这一部分中,我将尝试解释我对好的游戏设计元素的理解. 我将在示例中使用droid,并编写基本的战斗模拟器脚本以查看其行为. 问题: 我指挥一个机器人,我想消灭敌人. 再次面对 ...

  5. android_Android游戏开发–基本游戏架构

    android 因此,我们启动并运行了我们的Android应用程序,但是您可能想知道哪种类型的应用程序正是游戏. 我会尽力让您了解它. 下图显示了游戏架构. Android手机上的游戏架构 在上面的架 ...

  6. [libGDX游戏开发教程]使用LibGDX进行游戏开发(1)-游戏设计

    声明:本章是一个系列的开始,英文原文是<Learning libGDX Game Development>,大家请周知. [libgdx游戏开发教程]使用Libgdx进行游戏开发(2)-游 ...

  7. 微信小游戏开发教程-游戏实现3

    微信小游戏开发教程-游戏实现3 对象池 由于游戏过程中会创建很多临时对象,这些对象很快又不再使用,垃圾回收器也能帮我们主动回收这部分垃圾,但是回收时间不可控制,同时增大了创建对象的开销,所以我们使用对 ...

  8. 微信小游戏开发教程-游戏实现1

    微信小游戏开发教程-游戏实现1 概述 微信开发者工具官方提供一个飞机大战的游戏Demo,这里我们不再使用这个demo,我们以FlappyBird为例,为了让读者更加容易理解. 源码 https://g ...

  9. 游戏开发技术——游戏引擎

    游戏开发技术--游戏引擎 是什么:游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件.这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易 ...

最新文章

  1. PHP上传文件缺省目录,帝国cms默认图片、附件上传路径/d/file/怎么修改
  2. vsearch2.8.1使用和命令简介——中文帮助文档(免费64位版usearch)
  3. 10万视频,所有图像均获授权,Facebook创建大规模Deepfake数据集
  4. cxf生成客户端代码
  5. Redis之GEO存储地理位置信息
  6. java调用rocketmq_java操作RocketMQ
  7. JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
  8. android 自定义 build.gradle,Gradle for Android 第二篇( Build.gradle入门 )
  9. 0宽字符隐藏文本加密及原理
  10. 渥太华大学电子计算机两年,重磅!2021秋季渥太华大学电子与计算机专业直博录取分享!...
  11. virtualbox 设置静态IP
  12. wamp 增加php 7.2,wamp环境下php7.2升级,WAMP本地环境升级php7+版本
  13. dw自动滚动图片_Dreamweaver实现滚动图片文字
  14. 酷6 期待“化茧成蝶”
  15. 2021年上海市安全员C证考试报名及上海市安全员C证试题及解析
  16. 2021广东高考成绩位次排名查询,广东高考排名对应大学-广东高考位次查询(2021年文科参考)...
  17. VSC学习前端,不容错过的插件
  18. 福师《大学摄影》在线作业一、二
  19. MySQL主从架构、读写分离、集群相关面试问题
  20. ant desigh of angular:让nz-tree-select与nz-tree的值保持一致

热门文章

  1. 前台js实现附件比如word或者pdf的预览
  2. html5如何自动复制文字,H5实现移动端复制文字功能
  3. 做一个微信小程序商城需要多少钱?
  4. 7-8 大小写转换 (10分)
  5. 自己免费申请的公网IP搭网盘太爽了
  6. 梦幻西游原服务器物品,角色转移服务器说明 物品转移携带有限制
  7. 拿微软的英库做博士英语作业太爽了
  8. UI设计中Sketch使用指南—入门篇
  9. AMS TMF8820/21/28 confidence介绍
  10. 使用WinDbg调试SQL Server——入门