Android游戏开发之游戏帧动画的播放与处理七.docx
《Android游戏开发之游戏帧动画的播放与处理七.docx》由会员分享,可在线阅读,更多相关《Android游戏开发之游戏帧动画的播放与处理七.docx(6页珍藏版)》请在冰点文库上搜索。
Android游戏开发之游戏帧动画的播放与处理七
Android游戏开发之游戏帧动画的播放与处理(七)
带你走进游戏开发的世界之游戏帧动画的处理2011-9-222:
42上传下载附件(34.59KB)
1.帧动画的原理帧动画帧动画顾名思义,一帧一帧播放的动画就是帧动画。
帧动画和我们小时候看的动画片的原理是一样的,在相同区域快速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,其实不过是N张图片在一帧一帧的切换罢了。
如图所示:
人物行走动画的实现方式,4帧行走动画在播放区域一帧一帧向左切换播放给人们一种播放动画的假象,图片就动了起来,很简单吧,其它三方向播放动画的方法类似我就不再一一举例。
2011-9-222:
42上传下载附件(23.1KB)
2.动画资源的原始文件动画资源的原始文件PNG一般有三种形式的呈现方式请听我细细道来。
1.每一帧是一张png图片中如图所示上下左右方向每一组动画中的每一帧都是一张png图片,播放动画须要切换整张图片,实现动画效果。
代码中只需要将下一帧图片完整的覆盖住上一帧的图片就OK了,这种资源的排列方式在程序算法上是最简单的。
2011-9-222:
42上传下载附件(47.07KB)
2.所有动画帧都存在一张png图片中如图所示一张png中存放了人物所有的帧动画,播放动画的时候程序需要计算出将要播放的图片在原始图片中的起始坐标和结束坐标,也就是说要从原始图片中把将要播放的图片扣出来,从而显示在手机屏幕上。
这种资源的排列方式程序需要编写计算图片坐标位置的算法。
2011-9-222:
42上传下载附件(65.05KB)
3.动画编辑器处理动画游戏公司都会有自己的动画编辑器,动画编辑器的好处是
1.减少图片大小节省内存空间
2.缩短美工对坐标时间,因为如果没有编辑器美工很痛苦的需要一张图片一张图片的对坐标,全是体力活。
3.完全数据驱动动画,动画出问题程序不用改代码。
BUG都是美术的,呵呵。
动画编辑器生成出来的其实就是坐标告诉图片的每一个点每个动画的点拼接起来的每一个坐标程序须要编辑对动画编辑器生成的xml文件根据生成出来的坐标进行解析然后绘制出游戏动画。
AuroraGT动画编辑器是笔者使用最多的一款动画编辑器它的功能非常强大可以编出任意动画。
由于考虑到商业用途对于这个编辑器的解析与使用我不做任何解释。
如果只是单纯的想学习我把编辑器的下载地址贴出来,大家可以互相研究互相讨论互相学习。
下载地址:
AuroraGT.rar(1.51MB,下载次数:
1081)
2011-9-222:
46上传点击文件名下载附件
下载积分:
下载豆-22011-9-222:
42上传下载附件(183.71KB)
给大家看看生成出来的动画效果很绚丽吧,是不是很给力呢呵呵呵呵。
2011-9-222:
42上传下载附件(120.99KB)2011-9-222:
42上传下载附件(49.98KB)
我用代码详细的说明一下第一种和第二种游戏动画的代码实现方法。
我自己写了一个动画类来处理播放动画,需要调用动画只需要new一个Animation对象传入动画所需要的参数通过调用DrawAnimation方法就可以按帧播放绘制动画。
如果是单纯的学习的话我觉得这个类已经够学习使用了。
packagecn.m15.xys;importjava.io.InputStream;importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;publicclassAnimation{/**上一帧播放时间**/
privatelongmLastPlayTime=0;
/**播放当前帧的ID**/
privateintmPlayID=0;
/**动画frame数量**/
privateintmFrameCount=0;
/**用于储存动画资源图片**/
privateBitmap[]mframeBitmap=null;
/**是否循环播放**/
privatebooleanmIsLoop=false;
/**播放结束**/
privatebooleanmIsend=false;
/**动画播放间隙时间**/
privatestaticfinalintANIM_TIME=100;/**
*构造函数
*@paramcontext
*@paramframeBitmapID
*@paramisloop
*/
publicAnimation(Contextcontext,int[]frameBitmapID,booleanisloop){
mFrameCount=frameBitmapID.length;
mframeBitmap=newBitmap[mFrameCount];
for(inti=0;imframeBitmap[i]=ReadBitMap(context,frameBitmapID[i]);
}
mIsLoop=isloop;
}/**
*构造函数
*@paramcontext
*@paramframeBitmap
*@paramisloop
*/
publicAnimation(Contextcontext,Bitmap[]frameBitmap,booleanisloop){
mFrameCount=frameBitmap.length;
mframeBitmap=frameBitmap;
mIsLoop=isloop;
}/**
*绘制动画中的其中一帧
*@paramCanvas
*@parampaint
*@paramx
*@paramy
*@paramframeID
*/
publicvoidDrawFrame(CanvasCanvas,Paintpaint,intx,inty,intframeID){
Canvas.drawBitmap(mframeBitmap[frameID],x,y,paint);
}/**
*绘制动画
*@paramCanvas
*@parampaint
*@paramx
*@paramy
*/
publicvoidDrawAnimation(CanvasCanvas,Paintpaint,intx,inty){
//如果没有播放结束则继续播放
if(!
mIsend){
Canvas.drawBitmap(mframeBitmap[mPlayID],x,y,paint);
longtime=System.currentTimeMillis();
if(time-mLastPlayTime>ANIM_TIME){
mPlayID++;
mLastPlayTime=time;
if(mPlayID>=mFrameCount){
//标志动画播放结束
mIsend=true;
if(mIsLoop){
//设置循环播放
mIsend=false;
mPlayID=0;
}
}
}
}
}/**
*读取图片资源
*@paramcontext
*@paramresId
*@return
*/
publicBitmapReadBitMap(Contextcontext,intresId){
BitmapFactory.Optionsopt=newBitmapFactory.Options();
opt.inPreferredConfig=Bitmap.Config.RGB_565;
opt.inPurgeable=true;
opt.inInputShareable=true;
//获取资源图片
InputStreamis=context.getResources().openRawResource(resId);
returnBitmapFactory.decodeStream(is,null,opt);
}
}
复制代码大家看看我做的游戏demo利用上下左右按键播放向上向下向左向右人物行走动画。
2011-9-222:
42上传下载附件(72.45KB)2011-9-222:
42上传下载附件(71.41KB)2011-9-222:
42上传下载附件(73.05KB)
最后由于代码较多我就不贴在博客中了,下面给出Demo源码的下载地址欢迎大家下载阅读互相学习,互相研究