第五章android游戏开发.ppt
《第五章android游戏开发.ppt》由会员分享,可在线阅读,更多相关《第五章android游戏开发.ppt(77页珍藏版)》请在三一文库上搜索。
1、第五章 android游戏开发,本章的主要内容: 5.1、android游戏开发框架 5.2、Graphics类开发 5.3、动画实现 5.4、小结,5.1 View类开发框架,View这个类是描绘块状视图的基类。View会绘制一个包含的Drawing是event事件的方形块,是所有与用户交互的组件的Widgets的基类(Buttons,textField等),View的子类ViewGroup是layouts类的基类,layouts类可以包含其他的View/ViewGroup组件并且定义展示的属性。,游戏最重要的是与玩家交互,比如键盘输入、触笔点击等事件。android中提供了 onKeyUp
2、、onKeyDown、onKeyMultiple、onKeyPreIme、onTouchEvent、onTrackballEvent等方法,可以轻松地处理游戏中的时间消息。所以在继承View时,需要重载这几个方法,当有按键按下或弹起的时候,会自动调用方法来处理。,游戏的核心是不断地绘图和刷新界面,图我们可以通过onDraw方法绘制。android中提供了invalidate方法实现界面的刷新。 注意:invalidate不能直接在线程中调用,他违背了单线程模型。UI操作并不是线程安全的,这些操作必须在UI线程中执行。android中最常用的方法是利用Handler来实现UI的更新。,实例演示,
3、下面通过实现一个在屏幕上不停变换颜色的矩形来分析android的界面更新。该实例中,我们通过Handler对象并重写了handleMessage方法实现一个消息的接收器,然后在线程中通过sendMessage()方法发送更新界面信息,当接收器收到更新界面的信息时 ,便执行Invalidate方法 实现更新在屏幕上显示。(Example_05_1),运行结果如下,5.1.2 SurfaceView类开发框架,上一节讲解了View类的游戏开发框架,当需要开发复杂的游戏的时候,对程序的执行效率要求很高时,这时必须使用SurfaceView类进行开发。例如对于速度很高的游戏可以使用双缓冲技术来显示。游
4、戏中的人物、背景、动画等都需要画在一个画布上,而SurfaceView可以直接访问这个画布。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的。,android图形系统一个重要的概念是surface 、View 及其子类要画在画布上,每一个Surface创建一个Canvas对象。来管理View在Surface上的绘图操作。 在使用SurfaceView开发时需要注意的是,使用它绘图时,一般都是出现在最顶层。使用时还需要对其进行创建、销毁,情况改变时进行监视,这就要实现SurfaceHolder.Callback接口,如果要对被绘制的画布进行裁剪,控制其大小时都需要使用S
5、urfaceHolder来完成处理。在程序中,SurfaceHolder对象需要通过getHolder方法来获得,同时还需要addCallback方法来添加“回调函数”。,SurfaceView和View的明显不同之处在于,SurfaceView不需要通过线程来更新视图,但在绘制之前必须使用lockCanvas方法锁定画布,并得到画布,然后在画布上绘制;当绘制完成后,使用unlockCanvasAndPost方法来解锁画布,于是才能显示在屏幕之上。SurfaceView类的事件处理则和View一样。,实例演示,本例通过SurfaceView类实现一个游戏框架,该实例绘制了一个不断变换颜色的圆,
6、并且实现了SurfaceView的事件处理。我们按上下键时,图形可以移动。其控制整个应用流程的Activity类与上一节差不多。 下面是运行结果演示(具体代码见书本P115)。,运行结果展示,5.2 Graphics 类开发,前面我们已经分析了android中游戏开发中常用的两个视图类的开发框架,下面学习如何使用android中的Graphics类绘制图形。 要开发游戏,必须会在屏幕上绘制2D图形,在android中需要通过Graphics类来显示2D图形。Graphics类包含了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)、2D几何图形等常用类。,5.2
7、.1 Paint和Color类简介,要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法如下:,etAntiAlias: 设置画笔的锯齿效果。 setColor: 设置画笔颜色 setARGB: 设置画笔的a,r,p,g值。 setAlpha: 设置Alpha值 setTextSize: 设置字体尺寸。 setStyle: 设置画笔风格,空心或者实心。 setStrokeWidth: 设置空心的边框宽度。 getColor: 得到画笔的颜色 getAlpha:
8、 得到画笔的Alpha值。,Color类更加简单,主要定义了一些颜色常量,以及对颜色的转换等。主要的十二种颜色如下:,Color类还提供了Color.rgb的方法将整形的颜色转换成Color类型,如Color.red方法可以提取红色的值。下面我们来看一个实例,分别说明这些方法的使用,运行效果如后图所示。(具体代码见书P119),代码演示: package com.yarin.android.Examples_05_03; /导入的包略,详见源代码 public class GameView extends View implements Runnable public final static
9、 String TAG = “Examples_05_03_GameView“; / /* 声明Paint对象 */ private Paint mPaint = null; public GameView(Context context) super(context); /* 构建对象 */ mPaint = new Paint(); /* 开启线程 */ new Thread(this).start(); ,public void onDraw(Canvas canvas) super.onDraw(canvas); /* 设置Paint为无锯齿 */ mPaint.setAntiAlia
10、s(true); /* 设置Paint的颜色 */ mPaint.setColor(Color.RED); mPaint.setColor(Color.BLUE); mPaint.setColor(Color.YELLOW); mPaint.setColor(Color.GREEN); /* 同样是设置颜色 */ mPaint.setColor(Color.rgb(255, 0, 0); /* 提取颜色 */ Color.red(0xcccccc); Color.green(0xcccccc); /* 设置paint的颜色和Alpha值(a,r,g,b) */ mPaint.setARGB(2
11、55, 255, 0, 0); /* 设置paint的Alpha值 */ mPaint.setAlpha(220);,mPaint.setTextSize(14); / 设置paint的风格为“空心”. / 当然也可以设置为“实心”(Paint.Style.FILL) mPaint.setStyle(Paint.Style.STROKE); / 设置“空心”的外框的宽度。 mPaint.setStrokeWidth(5); /* 得到Paint的一些属性 */ Log.i(TAG, “paint的颜色:“ + mPaint.getColor(); Log.i(TAG, “paint的Alpha
12、:“ + mPaint.getAlpha(); Log.i(TAG, “paint的外框的宽度:“ + mPaint.getStrokeWidth(); Log.i(TAG, “paint的字体尺寸:“ + mPaint.getTextSize(); /* 绘制一个矩形 */ / 肯定是一个空心的举行 canvas.drawRect(320 - 80) / 2, 20, (320 - 80) / 2 + 80, 20 + 40, mPaint);,mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.GREEN); /* 绘制绿色实心
13、矩形 */ canvas.drawRect(0, 20, 40, 20 + 40, mPaint); / 触笔事件 public boolean onTouchEvent(MotionEvent event) return true; / 按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) return true; / 按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) return false; public boolean onKeyMultiple(in
14、t keyCode, int repeatCount, KeyEvent event) return true; ,public void run() while (!Thread.currentThread().isInterrupted() try Thread.sleep(100); catch (InterruptedException e) Thread.currentThread().interrupt(); / 使用postInvalidate可以直接在线程中更新面 postInvalidate(); ,测试结果演示,5.2.2 Canvas 类介绍,当我们调整好画笔之后,现在需
15、要绘制到画布上,这就得用Canvas类了。在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西。除了在画布上绘制之外,还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。 下面来分析Android中Canvas有哪些功能,Canvas提供了如下一些方法:,Canvas(): 创建一个空的画布,可以使用setBitmap()方法来设置绘制具体的画布。 Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,则将内容都绘制在bitmap上,因此bitmap不得为null。 Canvas(GL gl): 在绘制3D效果时使用,与OpenGL
16、相关。 drawColor: 设置Canvas的背景颜色。 setBitmap: 设置具体画布。 clipRect: 设置显示区域,即设置裁剪区。 isOpaque:检测是否支持透明。 rotate: 旋转画布 setViewport: 设置画布中显示窗口。 skew: 设置偏移量。,上面列举了几个常用的方法。在游戏开发中,我们可能需要对某个精灵执行旋转、缩放和一些其它操作。我们可以通过旋转画布来实现,但是旋转画布时会旋转画布上的所有对象,而我们只是需要旋转其中的一个,这时就需要用到save 方法来锁定需要操作的对象,在操作之后通过 restore 方法来解除锁定。,我们对左边的矩形执行了旋转
17、操作,而没有旋转右边的矩形,由于我们设置了裁剪区域,因此左边的矩形只能看到一部分,下面让我们来看看代码 这里我只贴出了我们自己的 View类 GameView, Activity类不贴出了 就在里边 new 一个GameView类 然后设置布局 然后main.xml也不贴出来了 因为它根本就没用到。,代码展示,package com.yarin.android.Examples_05_04; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import
18、android.graphics.Paint; import android.graphics.Rect; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; public class GameView extends View implements Runnable /* 声明Paint对象 */ private Paint mPaint = null; public GameView(Context context) super(context); /* 构建对象
19、*/ mPaint = new Paint(); /* 开启线程 */ new Thread(this).start(); ,public void onDraw(Canvas canvas) super.onDraw(canvas); /* 设置画布的颜色 */ canvas.drawColor(Color.BLACK); /* 设置取消锯齿效果 */ mPaint.setAntiAlias(true); /* 设置裁剪区域 */ canvas.clipRect(10, 10, 280, 260); /* 线锁定画布 */ canvas.save(); /* 旋转画布 */ canvas.r
20、otate(45.0f); /* 设置颜色及绘制矩形 */ mPaint.setColor(Color.RED); canvas.drawRect(new Rect(15,15,140,70), mPaint); /* 解除画布的锁定 */ canvas.restore(); /* 设置颜色及绘制另一个矩形 */ mPaint.setColor(Color.GREEN); canvas.drawRect(new Rect(150,75,260,120), mPaint); ,/ 触笔事件 public boolean onTouchEvent(MotionEvent event) return
21、 true; / 按键按下事件 public boolean onKeyDown(int keyCode, KeyEvent event) return true; / 按键弹起事件 public boolean onKeyUp(int keyCode, KeyEvent event) return false; public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) return true; ,public void run() while (!Thread.currentThread().isIn
22、terrupted() try Thread.sleep(100); catch (InterruptedException e) Thread.currentThread().interrupt(); / 使用postInvalidate可以直接在线程中更新界面 postInvalidate(); ,运行结果展示,5.2.3几何图形绘制,前面讲到的是画一般都是一些矩形,今天就看看怎么在android手机屏幕上绘制一些几何图形,如三角形、多边形、椭圆、圆形、正方形 等等。并且设置 空心、实心。下面我们先来看看 在android中可以绘制出那些几何图形 。,android 中可以绘制的几何图形,
23、方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制任意多边形 drawLine 绘制直线 drawPoin 绘制点,下面通过一个例子来看看如何绘制这些图形,运行结果如下。完整代码请参见本书P123,实例中分别绘制了空心和实心的几何图形。,5.2.4 字符串的绘制,在游戏开发中,我们不可能全部用图片来显示,很多时候需要绘制字符串,比如开发一个RPG游戏,有大量的对话内容,这时如果全部用图片来显示肯定不行。下面我们就看看如果在Canvas 画布中绘制字符串。,android中提供了一系列的drawText方法来绘制字符串,在绘
24、制字符串之前需要设置画笔对象,包括字符串的尺寸、颜色等属性。使用FontMetrics 来规划字体的属性,可以通过getFontMetrics 方法来获得系统字体的相关内容。下面来看一个大量文本自动换行、翻页和示例是如何操作字符串的,运行效果 见下图:,当我们按下方向键时就会换到下一行字体 上方向键换到上一行字体。下面我们列出在字符串处理时常用的方法: setTextSize: 设置字符串的尺寸 setARGB: 设置颜色(ARGB) getTextWidths: 取得字符串的宽度 setFlags (Paint.ANTI_ALIAS_FLAG): 消除锯齿。 由于这个示例的代码 比较长 ,在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 android 游戏 开发
链接地址:https://www.31doc.com/p-2561089.html