陈海燕 王丽芬 张燕宁 张景峰
摘要:随着智能手机的迅速发展,各种手机平台上的软件开发逐渐形成一项庞大的产业。与应用程序开发相比,游戏开发显得更加灵活多变。而利用游戏引擎制作手机游戏可以让开发者能容易和快速地上手而不用从零开始。AndEngine是一款基于OpenGL ES技术的Android游戏引擎,为开发者提供了免费且易用的游戏框架,可以让经验不多的开发者迅速投入到快速增长的市场中来,同时又不会限制专业级游戏开发者的创意。该文着重介紹如何利用AndEngine引擎制作手机游戏动画。
关键词:AndEngine;游戏引擎;动画;瓦片贴图
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)31-0265-02
1 制作动画所需要的素材
游戏中的动画指的是会根据游戏动作改变其形态的精灵。在AndEngine中,动画有别于不改变物体形态的简单变换与旋转。播放动画效果,需要有描述该物体各种形态的帧图像。帧动画就是在时间轴的每帧上逐帧绘制不同的内容,使其连续播放而成动画。开发者可以使用任何绘图工具来制作帧动画所需要的图片,也可以使用动画制作软件来做动画图像。本文以一个跳远的人为例,在跳远动画范例中,有12帧图像,每幅图像的大小为52像素×63像素。
2 制作动画的瓦片贴图
将所有的动画帧都做成一张共用的精灵表并载入,可以大大提升绘制速度。AndEngine要求瓦片贴图以矩阵方式排列,而且每张瓦片贴图必须大小相同且按播放动画的顺序放置。可以将帧图像用拼图软件按照要求拼成如下的大图,图像大小为312像素×126像素。
3 AndEngine的动画所用到的类和主要方法
AndEngine中有专门为动画精灵设置的名为AnimatedSprite的类,它从TiledTextureRegion对象中提取动画的帧。
3.1 AnimatedSprite类有四个构造方法:
AnimatedSprite(final float pX, final float pY, final TiledTextureRegion pTiledTextureRegion)
AnimatedSprite(final float pX, final float pY, final float pTileWidth, final float pTileHeight, final TiledTextureRegion pTiledTextureRegion)
AnimatedSprite(final float pX, final float pY, final TiledTextureRegion pTiledTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer)
AnimatedSprite(final float pX, final float pY, final float pTileWidth, final float pTileHeight, final TiledTextureRegion pTiledTextureRegion, final RectangleVertexBuffer pRectangleVertexBuffer)
其中的参数意义如下:
float pX和 final float pY:精灵对象的位置,它是相对于上级对象的。
TiledTextureRegion pTiledTextureRegion:存放精灵的动画帧的TiledTextureRegion对象。与普通的精灵对象一样,需要通过TiledRegionFactory用一张图片创建TextureRegion对象,并载入到Texture中去,然后再用TextureManager将Texture载入到缓存中。
RectangleVertexBuffer pRectangleVertexBuffer:是OpenGL的数据结构,用于修改精灵显示的方式。
pTileWidth和float pTileHeight:可以指定TiledTextureRegion对象中每个瓦片贴图的大小,如果不指定的话,AndEngine将使用TiledTextureRegion的默认设定。
3.2 AnimatedSprite类控制动画的方法
AnimatedSprite类播放动画的方式是先用上述构造方法创建AnimatedSprite类的对象,然后调用animate()方法来启动动画效果。
4 利用AndEngine引擎制作的动画的实例
AndEngine的基本运行流程中有四个必须被重载的函数,它们启动顺序如下: onLoadEngine→onLoadResources→onLoadScene→onLoadComplete
具体的讲,AndEngine会首先加载Engine类实例通知系统游戏引擎的基本运行方式,而后通过onLoadResources()加载游戏资源,其次通过onLoadScene()加载游戏场景实例,最后通过onLoadComplete()通知用户加载完毕并于此进行善后工作。
在制作游戏动画时,关键的代码在onLoadResources()和onLoadScene()中。
4.1 onLoadResources()中加载资源
引入Texture对象mJumpTexture,用于载入保存跳远动画帧的TileTextureRegion对象,由于瓦片贴图的大小是312像素×126像素,所以要选择Texture的尺寸为更大一点的2的整数次幂(512×256)
this.mJumpTexture= new Texture(512, 256, TextureOptions.DEFAULT);
mJumpTextureRegion:用代表跳远动画帧的瓦片貼图创建这个TextureRegion对象,瓦片贴图共有2行6列。
this.mJumpTextureRegion = TextureRegionFactory.createTiledFromAsset(this. mJumpTexture, this, “jump.png”, 0, 0, 6, 2);
最后用TextureManager将Texture对象载入缓存
this.mEngine.getTextureManager().loadTexture(this. mJumpTexture);
4.2 onLoadScene()中加载场景
创建用于显示跳远动画的AnimatedSprite对象,将其放置在背景图中的坐标(50,200)处
final AnimatedSprite jump = new AnimatedSprite(50, 200, this.mJumpTextureRegion);
让跳远的每个动画帧播放100毫秒(即每秒10帧),以造成运动效果。
jump.animate(100);
最后,将跳远对象加入到场景对象中,这样它就显示出来了。
scene.getLastChild().attachChild(jump);
return scene;
5 总结
AndEngine显示动画贴图所使用的TiledTextureRegion对象要求所有的瓦片贴图必须大小相同,而且最好是完全占满整个对象区域。当显示动画时,将按照从左至右,由上到下的顺序依次显示每张瓦片贴图,并在达到最后一张后返回到第一张贴图。在调用简单形式的createTiledFromAsset()、createTiledFromResource()和createTiledFromSource()方法时,并不需要告知AndEngine瓦片贴图的大小,只需要简单地说明要创建的TledTextureRegion对象有几行几列即可,AndEngine会根据这些值平均地将大图分割为小瓦片贴图。
想做好的动画是非常困难的,这是一门艺术,即使新的工具能够使生成动画的过程更加简单快捷,要想做出流畅且逼真的动画效果,依然要花费大量的时间与精力。
参考文献:
[1] 翟继斌,王世旭. 《游戏动画设计》 化学工业出版社,2016.
[2] 胡昭民,吴灿铭 .《游戏设计概论》 清华大学出版社,2017.
[3] http://code.google.com/p/andengineexamples/.