Android游戏开发研究帧动画实现



1.动画的原则框架

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

p=992" rel="bookmark">Android研究之游戏开发摄像头更新

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

\

" class="size-full wp-image-1001 aligncenter" alt="Android研究之游戏开发帧动画实现(三) - 第1张 | 成功智慧网-专注游戏编程开发!

" src="http://www.cgzhw.com/wp-content/uploads/2014/07/121.jpg" style="">

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

1.每一帧是一张png图片中

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

" src="http://www.cgzhw.com/wp-content/uploads/2014/07/216.jpg" style="">

2.全部动画帧都存在一张png图片中       如图所看到的一张png中存放了人物全部的帧动画,播放动画的时候程序须要计算出将要播放的图片在原始图片中的起始坐标和结束坐标,也就是说要从原始图片中把将要播放的图片扣出来。从而显示在手机屏幕上。

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

3.动画编辑器处理动画游戏公司都会有自己的动画编辑器 ,动画编辑器的优点是

1.降低图片大小节省内存空间

2. 缩短美工对坐标时间 ,由于假设没有编辑器美工非常痛苦的须要一张图片一张图片的对坐标。全是体力活。

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

BUG都是美术的 。呵呵。

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

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

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

源代码下载:AuroraGT

" class="alignnone size-full wp-image-1004" alt="Android研究之游戏开发帧动画实现(三) - 第4张 | 成功智慧网-专注游戏编程开发!" src="http://www.cgzhw.com/wp-content/uploads/2014/07/414.jpg" style="">

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

我用代码具体的说明一下第一种和另外一种游戏动画的代码实现方法。

       我自己写了一个动画类来处理播放动画。须要调用动画仅仅须要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  利用上下左右按键 播放向上 向下 向左 向右人物行走动画。

" class="size-full wp-image-1009 aligncenter" alt="Android研究之游戏开发帧动画实现(三) - 第8张 | 成功智慧网-专注游戏编程开发。" src="http://www.cgzhw.com/wp-content/uploads/2014/07/82.jpg" style="">

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

源代码下载:Animation

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

时间: 2024-12-19 14:01:41

Android游戏开发研究帧动画实现的相关文章

Android游戏开发设计步骤

如今搭载Android操作系统的手机数量比iPhone多得多.据悉,Android设备平均每天激活40万台.但iOS对开发商来说依旧是个更加有利可图.更受欢迎的平台.原因是:Android无需花钱买应用:众多设备和应用商店使得Android市场呈分散状态.那么怎么去有效的设计Android游戏开发呢,专业的IT培训扣丁学堂为你解答: 1 手机游戏开发简介 游戏的本质就是在屏幕上不断地显示和更新图片,只不过不是胡乱地更新,而是根据程序逻辑来控制.一款完整的游戏需要多方面的知识,比如游戏的创意.背景

Android游戏开发之主角的移动与地图的平滑滚动

人物移动地图的平滑滚动处理 玩过rpg游戏的朋友应该都知道RPG的游戏地图一般都比较大 今天我和大家分享一下在RPG游戏中如何来处理超出手机屏幕大小的游戏地图. 如图所示为程序效果动画图 地图滚动的原理 在本人之前博客的文章中介绍过人物在屏幕中的移动方式,因为之前拼的游戏地图是完全填充整个手机屏幕的,所以无需处理地图的平滑滚动.这篇文章我着重的向 大家介绍一下控制人物移动后地图滚动的处理方式.举个例子 如上图所示 比如人物向右移动,如果地图贴在屏幕左边边界 将先移动人物在地图的坐标,当人物在屏幕

【读书笔记-《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)

3.1 Button Button这控件不用多说,就是一个按钮,主要是点击后进行相应事件的响应. 给组件添加ID属性:定义格式为 android:id="@+id/name",这里的name是自定义的,不是索引变量."@+"表示新声明,"@"表示引用,例如:"@+id/tv" 表示新声明一个id,是id名为tv的组件:"@id/tv" 表示引用id名为tv的组件. 给按钮添加点击事件响应  想知道按钮是否被

Unity3D游戏开发之设置动画(Animations)属性

Unity3D游戏开发之设置动画(Animations)属性 通过创建角色动画Avatar,在新的动画系统Mecanim中,Unity就设置了角色动画的骨架和蒙皮信息,从而就可以在Unity中实现角色动画了. 切换到动画(Animations)选项卡.选中导入动画(Import Animation)的选项.如果该文件中有动画数据,可以看到动画剪辑的列表(Clips). Tips: Rig选项卡中动画类型(Animation Type)如果选则的是旧版(Legacy),Animations中的属性

[Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,一边自暴自弃的抱怨Android平台游戏开发难度太高,又连个像样的游 戏引擎也没有,甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情. 事实上,这种想法完全是没有必要且不符合实际的,作为能和苹果iOS分庭抗礼的Android(各种意义上),当然也会有相当数量的游戏引擎存

【读书笔记-《Android游戏编程之从零开始》】5.Android 游戏开发常用的系统控件(ProgressBar、Seekbar)

3.7 ProgressBar ProgressBar类官方文档地址:http://developer.android.com/reference/android/widget/ProgressBar.html 在Android应用开发中,ProgressBar(运行进度条)是比较常用到的组件,例如下载进度.安装程序进度.加载资源进度显示等.在Android中提供了两种样式来分别表示在不同状态下显示的进度条,下面来实现这两种样式.默认进度条是圆形,通过style属性来指定系统进度条的大小:sty

[Android游戏开发学习笔记]View和SurfaceView

本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在Android中涉及到显示的是View类,及继承自它的SurfaceView类和SurfaceView的其他子类等. 这里先只说View和SurfaceView.SurfaceView的直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及CAmera摄像头一般均使用Su

为android游戏开发-准备的地图编辑器-初步刷地图

采用多文理混合,单页面支持8张文理进行刷绘 为android游戏开发-准备的地图编辑器-初步刷地图,布布扣,bubuko.com

Android游戏开发:物理游戏之重力系统开发--圆形自由落体Demo

本节为大家提供有关物理游戏的知识,讲解了一个简单的圆形自由落体Demo的编写.. Java代码 package com.himi; import java.util.Random; import java.util.Vector; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import a