博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android游戏开发研究帧动画实现
阅读量:5036 次
发布时间:2019-06-12

本文共 3733 字,大约阅读时间需要 12 分钟。



1.动画的原则框架

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

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

\

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

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

3.动画编辑器处理动画游戏公司都会有自己的动画编辑器 ,动画编辑器的优点是
 1.降低图片大小节省内存空间 
 2. 缩短美工对坐标时间 ,由于假设没有编辑器美工非常痛苦的须要一张图片一张图片的对坐标。全是体力活。

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

BUG都是美术的 。呵呵。

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

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

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

源代码下载:

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

       我自己写了一个动画类来处理播放动画。须要调用动画仅仅须要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源代码的下载欢迎大家下载阅读互相学习。互相研究。互相讨论 希望能够和大家一起进步。

源代码下载:

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

转载于:https://www.cnblogs.com/bhlsheji/p/4830425.html

你可能感兴趣的文章
Ubuntu安装UFW防火墙
查看>>
心有所向,逐之
查看>>
java test
查看>>
13.敏捷项目管理——超越范围、进度和成本笔记
查看>>
00.敏捷回顾——引言笔记
查看>>
3.2.3.1 匹配单个字符
查看>>
字符串逆序的方法
查看>>
该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改。...
查看>>
C50和机器学习
查看>>
Java中this用法总结
查看>>
Sharepoint学习笔记—习题系列--70-573习题解析 -(Q28-Q31)
查看>>
关于使用Timer定时监测网络是否ping通
查看>>
定时器setTimeout()的传参方法
查看>>
导出成WORD文档(转)
查看>>
MyCat 枚举分片设计思考,查询命中条件
查看>>
selenium 截图 java、python、ruby,
查看>>
Maven 的聚合
查看>>
sbt使用详解
查看>>
Mybatis初步
查看>>
vue+uwsgi+nginx部署luffty项目
查看>>