Presentation is loading. Please wait.

Presentation is loading. Please wait.

第八章 Android游戏开发 瞿绍军 powerhope@tom.com.

Similar presentations


Presentation on theme: "第八章 Android游戏开发 瞿绍军 powerhope@tom.com."— Presentation transcript:

1 第八章 Android游戏开发 瞿绍军

2 经典的MVC模式 用来显示界面的视图,Android中提供了View和 Surfaceview来实现这个视图。
控制游戏的整体结构,Android中可以通过 Activity来实现 需要实现一个逻辑类,专门用来处理游戏的逻辑计 算 游戏中另外一个重要的环节就是处理游戏界面和用 户交互所发生的事件。

3 View类开发框架  View类是Android的一个超类,这个类几乎包含 了所有的屏幕类型。每一个View都有一个用于绘图 的画布,这个画布可以进行任意扩展。在游戏开发 中叶可以自定义视图(View),这个画布的功能更能满 足我们在游戏开发中的需要。在Android中,任何 一个View类都只需重写onDraw 方法来实现界面显 示,自定义的视图可以是复杂的3D实现,也可以是 非常简单的文本形式等。 

4 View类开发框架 游戏中最重要的就是需要与玩家交互,比如键盘输 入、触笔点击事件,我们如何来处理这些事件呢? Android中提供了 onKeyUp、onKeyDown、 onKeyMultiple、onKeyPreIme、onTouchEvent、 onTrackballEvent等方法,可以轻松地处理游戏中 的事件信息。所以,在继承View时,需要重载这几 个方法,当有按键按下或弹起等事件时,按键代码 自动会传输给这些相应的方法来处理。 

5 View类开发框架 游戏的核心是不断地绘图和刷新界面。Android中 提供了 invalidate 方法来实现界面刷新,注意, invalidate 不能直接在线程中调用,因为它违背了 Android的单线程模型:Android UI操作并不是线 程安全的,并且这些操作必须在UI 线程中执行,因 此Android中最常用的方法就是利用Handler来实 现UI线程的更新。其实用 AsyncTask 也可以。

6 View类开发框架 在Android中还提供了一个更新界面的方法 postInvalidate,该方法使用起来更加简单,不在需 要Handler,可以直接在线程中更新。 

7 View类开发框架

8 SurfaceView类开发框架 当我们从事复杂的图像绘制或者对程序的执行效率要求 比较高的时候,我们会发现View是不能满足需求的。
在使用SurfaceView的时候我们需要注意的是,使用他 们绘图的时候,一般都是出现在最顶层的。使用时需要 对其进行创建、销毁、情况改变时进行监视,这个需要 实现SurfaceHolder.Callback接口。如果要对被绘制 的画布进行裁剪,控制其大小时都需要用 SurfaceHolder来 完成处理。 在SurfaceView的派生类中,使用getHolder方法来获 取SurfaceHolder对象。同时还需要addCallback方法 来添加回调函数。

9 SurfaceView类开发框架 surfaceChanged :在surfaceview的大小发生改变的时 候调用。
surfaceCreated  : 在创建Surface时激发。 surfacedestroyed:在销毁Surface时激发。 addCallback:给SurfaceView添加一个回调函数。 lockCanvas :锁定画布。绘图之前必须锁定画布才能够 得到画布对象。 unlockCanvasAndPost:开始绘制时锁定了画布,绘制 完成之后解锁画布。 removeCallback:从SurfaceView中移除回调函数。

10 SurfaceView类开发框架 SurfaceView不同于View之处在于,SurfaceView 不需要通过线程来更新视图,但是再绘制前需要使 用lockCanvas锁定画布,并且得到画布,然后在 画布上绘制你需要的图像。绘制完成之后需要使用 lockCanvasAndPost方法来解锁画布。于是才能 显示在屏幕之上。事件的处理规则和View是一样的。

11 SurfaceView类开发框架

12 Graphics类 在Android中需要通过graphics类来显示2D图形。
graphics类包括:Canvas(画布)、Paint(画 笔)、Color(颜色)、Bitmap(图像)、2D几何 图形等

13 Paint和Color类 要绘图,首先得调整画笔,待画笔调整好之后,再 将图像绘制到画布上,这样才可以显示在手机屏幕 上。Android 中的画笔是 Paint类,Paint 中包含 了很多方法对其属性进行设置,主要方法如下: 

14 Paint类    setAntiAlias: 设置画笔的锯齿效果。     setColor: 设置画笔颜色     setARGB:  设置画笔的a,r,p,g值。     setAlpha:  设置Alpha值     setTextSize: 设置字体尺寸。     setStyle:  设置画笔风格,空心或者实心。     setStrokeWidth: 设置空心的边框宽度。     getColor:  得到画笔的颜色     getAlpha:  得到画笔的Alpha值。 

15 Color类 Color类主要定义了一些颜色常量,以及对颜色的 转换等。

16

17

18 Canvas类 画笔调整好后,需要绘制到画布。
oid/graphics/Canvas.html

19

20 Bitmap 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来 获取资源中的位图。
当然,首先需要获取资源:         Resources res=getResources();

21 Bitmap 使用BitmapDrawable获取位图
使用BitmapDrawable (InputStream is)构造一个 BitmapDrawable; 使用BitmapDrawable类的getBitmap()获取得到位图; // 读取InputStream并得到位图 InputStream is= res.openRawResource(R.drawable.pic1); BitmapDrawable bmpDraw=new BitmapDrawable(is); Bitmap bmp=bmpDraw.getBitmap();

22 Bitmap 或者采用下面的方式: BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable( R.drawable.pic1); Bitmap bmp=bmpDraw.getBitmap();

23 Bitmap 使用BitmapFactory获取位图
使用BitmapFactory类 decodeStream(InputStream is)解码位图资源, 获取位图。 Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic1); BitmapFactory的所有函数都是static,这个辅助 类可以通过资源ID、路径、文件、数据流等方式来 获取位图。

24 Bitmap 显示位图 显示位图可以使用核心类Canvas,通过Canvas类 的drawBitmap()显示位图,或者借助于 BitmapDrawable来将Bitmap绘制到Canvas。当 然,也可以通过BitmapDrawable将位图显示到 View中。

25 Bitmap 转换为BitmapDrawable对象显示位图
   // 获取位图 Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic1); // 转换为BitmapDrawable对象 BitmapDrawable bmpDraw=new BitmapDrawable(bmp); // 显示位图 ImageView iv = (ImageView)findViewById(R.id.ImageView);        iv.setImageDrawable(bmpDraw);

26 Bitmap 使用Canvas类显示位图 Paint p = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources( ), R.drawable.ic_launcher); canvas.drawBitmap(bitmap, 250,360, p);

27 图像旋转

28 Shader类 在Android中,提供了Shader类专门用来渲染图像 以及一些几何图形。
Shader类包括了5个直接子类,分别为: BitmapShader用于图像渲染;ComposeShader 用于混合渲染;LinearGradient用于线性渲染; RadialGradient用于环形渲染;而SweepGradient 则用于梯度渲染。

29 Shader类 使用Shader类进行图像渲染时,首先需要构建 Shader对象,然后通过Paint的setShader()方法来 设置渲染对象,最后将这个Paint对象绘制到屏幕上 即可。 需要注意,使用不同的方式渲染图像时需要构建不 同的对象。

30 BitmapShader(图像渲染) 使用一张位图作为纹理来对某一区域进行填充。可以想象成 在一块区域内铺瓷砖,只是这里的瓷砖是一张张位图而已。 public BitmapShader (Bitmap bitmap, Shader.TileMode t ileX, Shader.TileMode tileY); 其中,参数bitmap表示用来作为纹理填充的位图;参数 tileX表示在位图X方向上位图衔接形式;参数tileY表示在位 图Y方向上位图衔接形式。 Shader.TileMode有3种参数可供选择,分别为CLAMP、 REPEAT和MIRROR。 CLAMP的作用是如果渲染器超出原始边界范围,则会复制 边缘颜色对超出范围的区域进行着色。REPEAT的作用是在 横向和纵向上以平铺的形式重复渲染位图。MIRROR的作用 是在横向和纵向上以镜像的方式重复渲染位图。

31 LinearGradient(线性渲染)
实现某一区域内颜色的线性渐变效果。 public LinearGradient (float x0, float y0, float x1,  float y1, int[] colors, float[] positions, Shader.Tile Mode tile); 其中,参数x0表示渐变的起始点x坐标;参数y0表示渐 变的起始点y坐标;参数x1表示渐变的终点x坐标;参 数y1表示渐变的终点y坐标;参数colors表示渐变的颜 色数组;参数positions用来指定颜色数组的相对位置; 参数tile表示平铺方式。 通常,参数positions设为null,表示颜色数组以斜坡 线的形式均匀分布。

32 ComposeShader(混合渲染) 实现渲染效果的叠加,如BitmapShader与 LinearGradient的混合渲染效果等。
public ComposeShader (Shader shaderA, Shader s haderB, PorterDuff.Mode mode); 其中,参数shaderA表示某一种渲染效果;参数 shaderB也表示某一种渲染效果;参数mode表示两种 渲染效果的叠加模式。 PorterDuff.Mode有16种参数可供选择,分别为: CLEAR、SRC、DST、SRC_OVER、DST_OVER、 SRC_IN、DST_IN、SRC_OUT、DST_OUT、 SRC_ATOP、DST_ATOP、XOR、DARKEN、 LIGHTEN、MULTIPLY、SCREEN。

33 16种叠加模式的具体叠加效果

34 RadialGradient(环形渲染)
在某一区域内实现环形的渐变效果。 public RadialGradient (float x, float y, float ra dius, int[] colors, float[] positions, Shader.Tile Mode tile); 其中,参数x表示环形的圆心x坐标;参数y表示环 形的圆心y坐标;参数radius表示环形的半径;参 数colors表示环形渐变的颜色数组;参数positions 用来指定颜色数组的相对位置;参数tile表示平铺 的方式。

35 SweepGradient(梯度渲染) 在某一中心以x轴正方向逆时针旋转一周而形成的 扫描效果的渲染形式。
public SweepGradient (float cx, float cy, int[] c olors, float[] positions); 其中,参数cx表示扫描的中心x坐标;参数cy表示 扫描的中心y坐标;参数colors表示梯度渐变的颜 色数组;参数positions用来指定颜色数组的相对 位置。

36

37 动画实现 android平台提供了两种动画,一种是Tween动画, 即通过对场景里的对象不断进行图像变换(平移,缩 放,旋转) 来产生动画效果; 第二种就是 Frame 动画,即顺序播放事先做好的 图像,和电影类似。 

38 Tween动画 Tween动画通过对View 的内容完成一系列的的图 形变换(包括平移、缩放、旋转、改变透明度)来实 现动画效果。它主要包括以下四种动画效果:  Alpha: 渐变透明度动画效果。 Scale: 渐变尺寸伸缩动画效果。  Translate: 画面转移位置移动动画效果  Rotate: 画面转移旋转动画效果。 

39 Tween动画 Tween动画是通过预先定义一组指令,这些指令指 定了图形变换的类型、触发时间、持续时间。程序 沿着时间线执行这些指令就可以实现动画效果。 因此我们首先需要定义Animation动画对象 然后设置该动画的一些属性 最后通过 startAnimation 方法来开始动画。

40 Tween动画  AlphaAnimation(float fromAlpha, float toAlpha)    功能:构建一个渐变透明度动画    参数: fromAlpha 为动画起始透明度;toAlpha 为动画结束透明度(0.0表示完全透明,1.0表示完 全不透明)。

41 Tween动画 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)     功能:构建一个渐变尺寸伸缩动画。     参数:fromX、toX 分别是起始和结束时X坐标上的 伸缩尺寸。fromY、toY分别是起始和结束时 Y坐标上 的伸缩尺寸。pivotXValue、pivotYValue 分别为动画 相对于物件的X、Y坐标的开始位置  pivotYType pivotXType 分别为x、y的伸缩模式。 

42 Tween动画 TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)      功能:构建一个画面转换位置移动动画。      参数:fromXDelta、fromXDelta分别为起始坐 标; toXDelta、toYDelta分别为结束坐标。 

43 Tween动画 RotateAnimation(float fromDegress, float toDegress, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)      功能:构建一个旋转动画。      参数:fromDegress 为开始的角度; toDegress 为结束的角度。 pivotXType、 pivotYType分别为x、y 的伸缩模式。 pivotXValue、pivotYValue 分别为伸缩动画相对 于x、y的坐标的开始位置。 

44 Tween动画 setDuration(long durationMillis) 功能:设置动画显示的时间 以毫秒为单位。
startAnimation(Animation animation)     功能:开始播放动画     参数:animation为要播放的动画。

45

46 通过XML布局文件实现动画 /* 装载动画布局 */
mAnimationAlpha = AnimationUtils.loadAnimation(mContext,R.anim.a lpha_animation);

47 Frame动画 Frame动画使用更加简单,只需要创建一个 AnimationDrawabledF对象来表示Frame动画, 然后通过addFrame 方法把每一帧要显示的内容添 加进去,最后通过start 方法就可以播放这个动画 了,同时还可以通过 setOneShot方法设置是否重 复播放。下面就是一个用Frame动画模拟日全食的 效果。先看看效果。 

48

49 游戏引擎 物理引擎通过给物体赋予真实的物理属性来模拟物 体的运动,包括碰撞,移动,旋转等.并不是所有的游戏 都需要使用独立的引擎,一些简单的游戏可以通过自 行开发碰撞检测及实现力学公式来实现对刚体及质 点的模拟来达到游戏相应的效果. 当游戏需要实现比较复杂的刚体碰撞,滚动或者弹跳 时,通过全部自行编程的方式就会变得非常困难,成 本也很高.这时我们就需要使用独立的物理引擎来模 拟物体的运动,使用这样的物理引擎不仅可以得到更 加真实的效果,也可以使得游戏开发更加高效.

50 开源 Android 游戏引擎 Angle Angle是一款专为Android平台设计的,敏捷且适 合快速开发的2D游戏引擎,基于OpenGL ES技术 开发。该引擎全部用Java代码编写,并且可以根据 自己的需要替换里面的实现。 Rokon rokon是一款Android 2D游戏引擎,基于OpenGL ES技术开发,物理引擎为Box2D,因此能够实现一 些较为复杂的物理效果。

51 开源 Android 游戏引擎 Lgame LGame是一款国人开发的Java游戏引擎,有 Android及PC(J2SE)两个开发版本,其底层绘图器 LGrpaphics封装有J2SE以及J2ME提供的全部 Graphics API(PC版采用Graphics2D封装, Android版采用Canvas模拟实现),该引擎除了基 本的音效、图形、物理、精灵等常用组件以外,也 内置有Ioc、xml、http等常用Java组件的封装。

52 开源 Android 游戏引擎 AndEngine andengine同样是一款基于OpenGL ES技术的 Android游戏引擎,物理引擎同样为Box2D(标配 |||)。 Libgdx libgdx是一款基于OpenGL ES技术开发的Android 游戏引擎,支持Android平台下的2D游戏开发,物 理引擎采用Box2D实现。

53 开源 Android 游戏引擎 jPCT jPCT是一款基于OpenGL技术开发的3D图形引擎 (PC环境为标准OpenGL,Android为OpenGL ES), 以Java语言为基础的,拥有功能强大的Java 3D解 决方案。该引擎与LGame(此为2D游戏引擎)相 类似,目前拥有PC(J2SE)以及Android两个开发版 本。

54 libgdx游戏引擎的使用 首先下载最新的jar 地址:

55 libgdx游戏引擎的使用 新建一个Android项目,File -> New -> Project -> Android Project。选SDK,最低选择应该是 1.5. 新建一个文件夹libs(这个名字是固定的,不能随 意改),将下载到的jar复制进去,android平台只 需要复制gdx.jar和gdx-backend-android.jar。 增加引用,然后将armeabi和armeabi-v7a两个文 件夹复制到libs文件夹中。

56 libgdx游戏引擎的使用

57 libgdx游戏引擎的使用 测试 新建类GameLibgdxActivity ,继承 AndroidApplication类。

58 libgdx游戏引擎的使用 FirstGame是一个实现了ApplicationListener的类

59 libgdx游戏引擎的使用 public class MyGame implements ApplicationListener {
public void create () { // STUB } public void render () { public void resize (int width, int height) { public void pause () { public void resume () { public void dispose () {

60 libgdx游戏引擎的使用

61 libgdx游戏引擎的使用

62 libgdx游戏引擎的使用 在屏幕上打印一些标识
先记得在create()函数中初始化一下相应的变量, 否则会得到空指针。绘图用SpriteBatch,以及字 体类BitmapFont。  这里还有非常重要的一点,就是绘图用 SpriteBatch在绘图前一定要调用begin()方法,而 在调用后一定要调用end()方法,否则程序都会 报错。一旦ApplicationListener开始运行, render函数就会不停执行,里面的语句也一样被不 停地执行。

63 libgdx游戏引擎的使用 Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
 Gdx.gl.glClearColor(0f,0f,0f,0f);    这是一个清屏的函数,清除了颜色缓存,并把刷新 后的屏幕的颜色置为(0,0,0,0),也就是黑 色,如果(1,1,1,0)那么就是白色了。 另外,在dispose()函数中不要忘了对变量执行 dispose()方法,在libgdx中,很多资源必须手动 释放,否则将一直占用着内存,很可能就此发生 OOM(OutOfMemory)的错误。

64 libgdx游戏引擎的使用

65 libgdx游戏引擎的使用 一个游戏引擎要做出精美的游戏出来,有两个类是 必不可少的,一个是精灵类,一个是粒子系统。粒子 系统可以做出各种精妙的效果,如水流,火焰,烟 雾等等,制作精美的粒子系统甚至可以以假乱,制 作出令人惊叹的效果。 Libgdx也提供了粒子系统的支持,而且令人兴奋的 是,libgdx提供了一个可视化的粒子系统编辑器, 我们可以采取边编辑边预览的方式,“所见即所 得”,很快就能做出不错的粒子系统效果。

66 libgdx游戏引擎的使用 Libgdx粒子系统编辑器—Particle Editor Particle Editor下载地址: le-editor.jnlp

67 libgdx游戏引擎的使用

68 libgdx游戏引擎的使用 软件中的各个参数的解释如下: Delay: 当粒子系统开始后,发射器等待多少时间开始 发射
Duration:发射器生存跨度,也就是粒子效果持续的 的时间,注意这个时间和粒子生存时间不同 Count: 顾名思义,同一时间可出现的粒子个数,有一 个上限一下下限。 Life: 一个粒子的生存时间, Life Offset: 决定粒子在显示之前已经用掉它生命多少 值 ,这样可以实现让一个粒子在它生命50%时再显现

69 libgdx游戏引擎的使用 Emission: 每秒钟发射多少个粒子,这个参数带了 一张图表,图表中间写着duration,代表图表X轴. 表示发射器生存时间,意思是说发射器的生存时间 内,该图表控制各个时间点粒子每秒钟发射多少个, 左边的上下两个文本框用于控制生成初始值时的范 围,左边的'>'字符用于输入另外一个数值,比如说 下面那个”>“, 发射器会在这两个值中间选择一下 随机值作为上限值,Relative,如果选中,表示图 表中的值是相对值,相对于初始值。否则是个绝对 值.

70 libgdx游戏引擎的使用 X Offset and Y Offset: 粒子出现在位置相对中心位置 的像素偏移
Spawn: 用于产生粒子的发射器的形状 Spawn Width and Spawn Height: 发射器的形状的宽, 高 Size: 粒子的大小 Velocity: Angle: Rotation: 这个几值用于控制粒子的运动轨迹:

71 libgdx游戏引擎的使用 Wind and Gravity: 烟为生存时间内在X轴和Y轴上 每秒种的像素偏移值
Tint: 粒子的颜色,可以在粒子生存期内变化任意 多个颜色 Transparency:粒子的透明度

72 libgdx游戏引擎的使用

73 libgdx游戏引擎的使用 移植俄罗斯方块 1.html


Download ppt "第八章 Android游戏开发 瞿绍军 powerhope@tom.com."

Similar presentations


Ads by Google