android游戏开发ppt课件_第1页
android游戏开发ppt课件_第2页
android游戏开发ppt课件_第3页
android游戏开发ppt课件_第4页
android游戏开发ppt课件_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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中提供了 onKeyU

2、p、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接口,假设要对被绘制的画布进展裁剪,控制其大小时都需求运用Surface

5、Holder来完成处置。在程序中,SurfaceHolder对象需求经过getHolder方法来获得,同时还需求addCallback方法来添加“回调函数。 SurfaceView和View的明显不同之处在于,SurfaceView不需求经过线程来更新视图,但在绘制之前必需运用lockCanvas方法锁定画布,并得到画布,然后在画布上绘制;当绘制完成后,运用unlockCanvasAndPost方法来解锁画布,于是才干显示在屏幕之上。SurfaceView类的事件处置那么和View一样。实例演示 本例经过SurfaceView类实现一个游戏框架,该实例绘制了一个不断变换颜色的圆,并且实现了Su

6、rfaceView的事件处置。我们按上下键时,图形可以挪动。其控制整个运用流程的Activity类与上一节差不多。 下面是运转结果演示详细代码见书本P115。运转结果展现5.2 Graphics 类开发 前面我们曾经分析了android中游戏开发中常用的两个视图类的开发框架,下面学习如何运用android中的Graphics类绘制图形。 要开发游戏,必需会在屏幕上绘制2D图形,在android中需求经过Graphics类来显示2D图形。Graphics类包含了Canvas画布、Paint画笔、Color颜色、Bitmap图像、2D几何图形等常用类。5.2.1 Paint和Color类简介 要绘

7、图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进展设置,主要方法如下: etAntiAlias: 设置画笔的锯齿效果。 setColor: 设置画笔颜色 setARGB: 设置画笔的a,r,p,g值。 setAlpha: 设置Alpha值 setTextSize: 设置字体尺寸。 setStyle: 设置画笔风格,空心或者实心。 setStrokeWidth: 设置空心的边框宽度。 getColor: 得到画笔的颜色 getAlpha: 得到画笔的Alpha值。 Color类

8、更加简单,主要定义了一些颜色常量,以及对颜色的转换等。主要的十二种颜色如下: Color类还提供了Color.rgb的方法将整形的颜色转换成Color类型,如Color.red方法可以提取红色的值。下面我们来看一个实例,分别阐明这些方法的运用,运转效果如后图所示。详细代码见书P119代码演示: package com.yarin.android.Examples_05_03;/导入的包略,详见源代码public class GameView extends View implements Runnablepublic final static String TAG= Examples_05_0

9、3_GameView;/ /* 声明Paint对象 */private PaintmPaint = null;public GameView(Context context)super(context);/* 构建对象 */mPaint = new Paint();/* 开启线程 */new Thread(this).start();public void onDraw(Canvas canvas)super.onDraw(canvas);/* 设置Paint为无锯齿 */mPaint.setAntiAlias(true);/* 设置Paint的颜色 */mPaint.setColor(Col

10、or.RED);mPaint.setColor(Color.BLUE);mPaint.setColor(Color.YELLOW);mPaint.setColor(Color.GREEN);/* 同样是设置颜色 */mPaint.setColor(Color.rgb(255, 0, 0);/* 提取颜色 */Color.red(0 xcccccc);Color.green(0 xcccccc);/* 设置paint的颜色和Alpha值(a,r,g,b) */mPaint.setARGB(255, 255, 0, 0);/* 设置paint的Alpha值 */mPaint.setAlpha(22

11、0);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: + mPaint.getAlpha();Log.i(TAG, paint的外框的宽度: + mPaint.getStrokeWidth(

12、);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);/* 绘制绿色实心矩形 */canvas.drawRect(0, 20, 40, 20 + 40, mPaint);/ 触笔事件public boolean onTouchEvent(M

13、otionEvent event)return 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.currentT

14、hread().isInterrupted()tryThread.sleep(100);catch (InterruptedException e)Thread.currentThread().interrupt();/ 运用postInvalidate可以直接在线程中更新面postInvalidate();测试结果演示5.2.2 Canvas 类引见 当我们调整好画笔之后,如今需求绘制到画布上,这就得用Canvas类了。在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西。除了在画布上绘制之外,还需求设置一些关于画布的属性,比如,画布的颜色、尺寸等。 下面来

15、分析Android中Canvas有哪些功能,Canvas提供了如下一些方法: Canvas(): 创建一个空的画布,可以运用setBitmap()方法来设置绘制详细的画布。 Canvas(Bitmap bitmap): 以bitmap对象创建一个画布,那么将内容都绘制在bitmap上,因此bitmap不得为null。 Canvas(GL gl): 在绘制3D效果时运用,与OpenGL相关。 drawColor: 设置Canvas的背景颜色。 setBitmap: 设置详细画布。 clipRect: 设置显示区域,即设置裁剪区。 isOpaque:检测能否支持透明。 rotate: 旋转画布 s

16、etViewport: 设置画布中显示窗口。 skew: 设置偏移量。 上面列举了几个常用的方法。在游戏开发中,我们能够需求对某个精灵执行旋转、缩放和一些其它操作。我们可以经过旋转画布来实现,但是旋转画布时会旋转画布上的一切对象,而我们只是需求旋转其中的一个,这时就需求用到save 方法来锁定需求操作的对象,在操作之后经过 restore 方法来解除锁定。 我们对左边的矩形执行了旋转操作,而没有旋转右边的矩形,由于我们设置了裁剪区域,因此左边的矩形只能看到一部分,下面让我们来看看代码 这里我只贴出了我们本人的 View类 GameView, Activity类不贴出了 就在里边 new 一个G

17、ameView类 然后设置规划 然后main.xml也不贴出来了 由于它根本就没用到。代码展现package com.yarin.android.Examples_05_04;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.view.KeyEvent;import android.view.MotionEvent;

18、import android.view.View;public class GameView extends View implements Runnable/* 声明Paint对象 */private PaintmPaint= null;public GameView(Context context)super(context);/* 构建对象 */mPaint = new Paint();/* 开启线程 */new Thread(this).start();public void onDraw(Canvas canvas)super.onDraw(canvas);/* 设置画布的颜色 */

19、canvas.drawColor(Color.BLACK);/* 设置取消锯齿效果 */mPaint.setAntiAlias(true);/* 设置裁剪区域 */canvas.clipRect(10, 10, 280, 260);/* 线锁定画布 */canvas.save();/* 旋转画布 */canvas.rotate(45.0f); /* 设置颜色及绘制矩形 */mPaint.setColor(Color.RED);canvas.drawRect(new Rect(15,15,140,70), mPaint);/* 解除画布的锁定 */canvas.restore(); /* 设置颜

20、色及绘制另一个矩形 */mPaint.setColor(Color.GREEN);canvas.drawRect(new Rect(150,75,260,120), 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;

21、public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)return true;public void run()while (!Thread.currentThread().isInterrupted()tryThread.sleep(100);catch (InterruptedException e)Thread.currentThread().interrupt();/ 运用postInvalidate可以直接在线程中更新界面postInvalidate();运转结果展现5.2.3几何图形绘制

22、前面讲到的是画普通都是一些矩形,今天就看看怎样在android手机屏幕上绘制一些几何图形,如三角形、多边形、椭圆、圆形、正方形 等等。并且设置 空心、实心。下面我们先来看看 在android中可以绘制出那些几何图形 。android 中可以绘制的几何图形 方法 阐明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制恣意多边形 drawLine 绘制直线 drawPoin 绘制点 下面经过一个例子来看看如何绘制这些图形,运转结果如下。完好代码请参见本书P123,实例中分别绘制了空心和实心的几何图形。5.2.4 字符串的绘制 在游戏开发

23、中,我们不能够全部用图片来显示,很多时候需求绘制字符串,比如开发一个RPG游戏,有大量的对话内容,这时假设全部用图片来显示一定不行。下面我们就看看假设在Canvas 画布中绘制字符串。 android中提供了一系列的drawText方法来绘制字符串,在绘制字符串之前需求设置画笔对象,包括字符串的尺寸、颜色等属性。运用FontMetrics 来规划字体的属性,可以经过getFontMetrics 方法来获得系统字体的相关内容。下面来看一个大量文本自动换行、翻页和例如是如何操作字符串的,运转效果 见以下图: 当我们按下方向键时就会换到下一行字体 上方向键换到上一行字体。下面我们列出在字符串处置时常

24、用的方法: setTextSize: 设置字符串的尺寸 setARGB: 设置颜色(ARGB) getTextWidths: 获得字符串的宽度 setFlags (Paint.ANTI_ALIAS_FLAG): 消除锯齿。 由于这个例如的代码 比较长 ,在这里 就不贴出来了,有时间并且感兴趣的没有可以看书根源码研讨。5.2.5 图像绘制 在android中,工程目录下“resdrawable用来放置一些该工程的图片资源,那么如何显示这些图片资源呢,android中提供了Bitmap来存放这些资源,如下代码可以经过一个资源索引来得到其图像对象Bitmap。 (BitmapDrawablegetR

25、esourses.getDrawable资源索引.getBitmap() Bitmap 还提供了一些方法,比如getHeight方法和getWidth方法可以获得这些图像的高度和宽度,我们将在下面的实例中分析如何运用这些方法,并将图像显示在屏幕上,运转效果如以下图所示,完好代码见书本P 图像旋转 在Android中进展图像旋转需求运用Matrix,它包含了一个3*3的矩阵,专门用于进展图像变换匹配。Matrix ,中文里叫矩阵,高等数学里有引见,在图像处置方面,主要是用于平面的缩放、平移、旋转等操作。Matrix没有机构体,它必需初始化,然后经过reset方法和set方法来实

26、现。 首先引见一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处置,主要用到的是乘法 。下面是一个乘法的公式: 在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如以下图。 解释一下,上面的 sinX 和 cosX ,表示旋转角度的 cos 值和 sin 值,留意,旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2,这样子。 Matrix的操作,总共分为translate平移,rotate旋转,scale缩

27、放和skew倾斜四种,每一种变换在Android的API里都提供了set,post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。 我们如今经过setRotate设置旋转角度,用creatBitmap创建一个经过旋转等处置的Bitmap对象,然后将Bitmap绘制到屏幕之上,于是就实现了旋转操作。运转结果展现如下5.2.7 图像的缩放 前面发过一篇如何利用Matrix来旋转图像,那么如何来缩放图像呢?其实旋转和缩放一样,不同的是需求运用Matrix 和 postScale 方法来设置图

28、像缩放的倍数。下面的例如可以经过上下键来缩放和放大图像。 至于怎样旋转图像 大家请看书上例子 ,当然我们需求先看运转效果。 缩放效果展现5.2.8 图像像素操作 在我们玩的游戏中我们会经常见到一些图像的特效,比如半透明等效果。要实现这种半透明效果其实并不难,需求我们懂得图像像素的操作。不要怕,其真实Android中Bitmap为我们提供了操作像素的根本方法。 我们可以经过getPixels()方法获得该图像的像素并放到一个数组中去,我们操作这个数组就可以了。最后经过setPixels方法设置这个数组到Bitmap中。 在Android中,每一个图像像素经过一个4字节整数来展现:最高位字节用作A

29、lpha通道,即用来实现透明与不透明控制,255代表完全不透明,0那么代表完全透明;接下来的一个字节是Red红色通道,255代表完全是红包。依次类推,接下来的两个字节相应地实现绿色和蓝色通道。5.2.9 Shader类引见 Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进展梯度渲染,RadialGradient

30、用来进展环形渲染,SweepGradient 用来进展梯度渲染,ComposeShader那么是一个 混合渲染,可以和其它几个子类组合起来运用。 Shader类的运用,都需求先构建Shader对象,然后经过Paint的setShader方法设置渲染对象,然后设置渲染对象,然后再绘制时运用这个Paint对象即可。当然,用不同的渲染时需求构建不同的对象。 下面是一个简单的例如,其适用起来比较简单了 只是方法参数比较多。但是还比较容易了解。大家可以去翻翻API 这里就不深化讨论了,以后用到再说吧。 运转效果展现5.2.10 双缓冲技术 Android中的SurfaceView类就是双缓冲机制。因此,

31、开发游戏时尽量运用SurfaceView而不要运用View,这样的话效率较高,而且SurfaceView的功能也更加完善。为了更容易的了解双缓冲技术,下面引见用View实现双缓冲的方法。 先概述一下,双缓冲的中心技术就是先经过setBitmap方法将要绘制的一切的图形会知道一个Bitmap上,然后再来调用drawBitmap方法绘制出这个Bitmap,显示在屏幕上。详细的实现代码如下:package com.yarin.android.Examples_05_12;import android.content.Context;public class GameView extends View

32、 implements Runnable/* 声明Bitmap对象 */BitmapmBitQQ= null;Paint mPaint = null;/* 创建一个缓冲区 */BitmapmSCBitmap = null;/* 创建Canvas对象 */Canvas mCanvas = null; public GameView(Context context)super(context);/* 装载资源 */mBitQQ = (BitmapDrawable) getResources().getDrawable(R.drawable.).getBitmap();/* 创建屏幕大小的缓冲区 *

33、/mSCBitmap=Bitmap.createBitmap(320, 480, Config.ARGB_8888); /* 创建Canvas */mCanvas = new Canvas(); /* 设置将内容绘制在mSCBitmap上 */mCanvas.setBitmap(mSCBitmap); mPaint = new Paint();/* 将mBitQQ绘制到mSCBitmap上 */mCanvas.drawBitmap(mBitQQ, 0, 0, mPaint);/* 开启线程 */new Thread(this).start();public void onDraw(Canvas

34、 canvas)super.onDraw(canvas);/* 将mSCBitmap显示到屏幕上 */canvas.drawBitmap(mSCBitmap, 0, 0, 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 fal

35、se;public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)return true;/* * 线程处置 */public void run()while (!Thread.currentThread().isInterrupted()tryThread.sleep(100);catch (InterruptedException e)Thread.currentThread().interrupt();/运用postInvalidate可以直接在线程中更新界面postInvalidate();运转效果

36、展现5.2.11 全屏显示 我们前面所写的程序在运转时屏幕顶部都带有标题栏和系统信息栏,但在开发游戏时,会由于界面美观等要素不需求显示这些多余的界面,而将更多的区域留给游戏界面来控制,这就需求实现设置全屏方式。经过requestWindowFeature方法可以设置标题栏能否显示,经过setFlags方法设置全屏方式。案例代码package com.yarin.android.Examples_05_13;import android.app.Activity;import android.content.pm.ActivityInfo;import android.os.Bundle;imp

37、ort android.view.Window;import android.view.WindowManager;public class Activity01 extends Activity/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);/* 设置为无标题栏 */requestWindowFeature(Window.FEATURE_NO_TITLE); /* 设

38、置为全屏方式 */ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); /* 设置为横屏 */setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); setContentView(R.layout.main);运转结果如下5.2.12 获得屏幕属性 市面上手机款式非常多,而且屏幕大小不一,大家一定希望本人开发的程序能适宜各种屏幕大小的手机。这就需求我

39、们在开发时不要把一些坐标设置为定值,而是经过计算得出。这样不论安装在什么手机,都不需求做很大的改动就能正常显示。要计算坐标等变量的值,一定需求一个值作为参考,这里做好的参考值就是屏幕的宽度和高度。 Android 中的DisplayMetrics定义一些屏幕属性,可以经过getMetrics方法得到当前的屏幕的DisplayMetrics属性,从而获得屏幕的宽和高下面经过一个例子详细展现,详细运转结果如下:源代码如下public void onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);setConte

40、ntView(R.layout.main);/* 定义DisplayMetrics对象 */DisplayMetrics dm = new DisplayMetrics();/* 获得窗口属性 */getWindowManager().getDefaultDisplay().getMetrics(dm);/* 窗口的宽度 */int screenWidth = dm.widthPixels;/* 窗口的高度 */int screenHeight = dm.heightPixels;mTextView = (TextView) findViewById(R.id.TextView01);mTex

41、tView.setText(屏幕宽度: + screenWidth + n屏幕高度: + screenHeight);5.3 动画实现 Android平台提供了两类动画,一类是Tween动画,即经过对场景里的对象不断进展图像变换平移、旋转、缩放来产生动画效果;第二类是Frame动画化,及顺序播放事先做好的图像,和电影类似,本节我们将分别学习这两种动画的实现原理,最后会结合Java ME 开发阅历讲解GIF动画实现的原理。5.3.1 Tween 动画 首先来分析 Tween动画,Tween动画经过对View 的内容完成一系列的的图形变换(包括平移、缩放、旋转、改动透明度)来实现动画效果。它主要包

42、括以下四种动画效果: Alpha: 渐变透明度动画效果。 Scale: 渐变尺寸伸缩动画效果。 Translate: 画面转移位置挪动动画效果 Rotate: 画面转移旋转动画效果。 详细来讲,Tween动画是经过预先定义一组指令,这些指令指定了图形变换的类型、触发时间、继续时间。程序沿着时间线执行这些指令就可以实现动画效果。因此我们首先需求定义Animation动画对象,然后设置该动画的一些属性,最后经过 startAnimation 方法来开场动画。网上的大多数例子都是以 xml文件的方式配置的 我们这里用代码实现一下。其实能够也不难就是参数有些多。下面就引见 各个动画的属性: Alpha

43、Animation(float fromAlpha, float toAlpha) 功能:构建一个渐变透明度动画 参数: fromAlpha 为动画起始透明度;toAlpha为动画终了透明度(0.0表示完全透明,1.0表示完全不透明)。 ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 功能:构建一个渐变尺寸伸缩动画。 参数:fromX、toX 分别是起始和终了时X坐标上的伸缩尺寸。fromY、toY分别是起始和终了时 Y坐标上的伸缩

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论