zoukankan      html  css  js  c++  java
  • Android游戏开发研究帧动画实现

    

    1.动画的原则框架

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

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

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

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

    Android研究之游戏开发帧动画实现(三) - 第3张  | 成功智慧网-专注游戏编程开发!
    3.动画编辑器处理动画游戏公司都会有自己的动画编辑器 ,动画编辑器的优点是
     1.降低图片大小节省内存空间 
     2. 缩短美工对坐标时间 ,由于假设没有编辑器美工非常痛苦的须要一张图片一张图片的对坐标。全是体力活。


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

    BUG都是美术的 。呵呵。

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

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

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

    源代码下载:AuroraGT

    Android研究之游戏开发帧动画实现(三) - 第4张  | 成功智慧网-专注游戏编程开发!

    给大家看看生成出来的动画效果非常绚丽吧,是不是非常给力呢 呵呵呵呵。
    Android研究之游戏开发帧动画实现(三) - 第5张  | 成功智慧网-专注游戏编程开发!
    我用代码具体的说明一下第一种和另外一种游戏动画的代码实现方法。

           我自己写了一个动画类来处理播放动画。须要调用动画仅仅须要new一个Animation对象传入动画所须要的參数通过调用 DrawAnimation 方法就能够按帧播放绘制动画。假设是单纯的学习的话我认为这个类已经够学习使用了。
    <strong>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);
        }
    }</strong>
    大家看看我做的游戏demo  利用上下左右按键 播放向上 向下 向左 向右人物行走动画。

    Android研究之游戏开发帧动画实现(三) - 第6张  | 成功智慧网-专注游戏编程开发。Android研究之游戏开发帧动画实现(三) - 第7张  | 成功智慧网-专注游戏编程开发!

    Android研究之游戏开发帧动画实现(三) - 第8张  | 成功智慧网-专注游戏编程开发。

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

    源代码下载:Animation

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

  • 相关阅读:
    [IOS/翻译]Core Services Layer
    JEval使用实例
    Spring面试总结
    对easyui datagrid进行扩展,当滚动条拉直最下面就异步加载数据。
    虚拟机无法安装64位系统,是否说明硬件不支持?
    zh-cn,zh-tw,en-us,en-gb等网页语言代码一览表
    Python 计算程序运行时间
    美国教授是如何评价中国研究生的
    过来人谈在美国大学里的中国研究生
    javascript 十六进制与RGB颜色值的相互转换
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4830425.html
Copyright © 2011-2022 走看看