ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:19.43KB ,
资源ID:2376255      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2376255.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(surfaceView.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

surfaceView.docx

1、surfaceView前面介绍的内容,还是比较简单的,应用这些知识,可以完成一些非实时游戏,比如井字棋等,或者一些画面刷新不是很频繁、实时性不强的游戏,比如我们前面做的扫雷。但是我们的目标是坦克大战,对操作的实时性要求比较高,更有很多的NPC 需要处理,绘图的工作量也很大,所以我们要用一个新的视图类SurfaceView 代替View 来完成显示工作。SurfaceView 与View 有一些不同,但是我们只用其中的一个特性:在主线程之外的线程中向屏幕上绘图。这样就可以避免在画图任务繁重的时候造成主线程阻塞,从而提高程序的反应速度。首先让我们重新定义一个GameView 类, 让他继承自Sur

2、faceView , 并且要实现SurfaceHolder.Callback 接口。为什么要实现Callback 接口呢?因为使用SurfaceView 有一个原则,所有的绘图工作必须得在Surface 被创建之后才能开始(Surface表面,这个概念在图形编程中常常被提到。基本上我们可以把它当作显存的一个映射,写入到Surface 的内容可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface 被销毁之前必须结束。所以Callback 中的surfaceCreated 和surfaceDestroyed 就成了绘图处理代码的边界。我们直接让GameView 类实现Cal

3、lback 接口,使程序更简洁一些。GameView 被创建,并补充了构造函数之后就是这个样子(创建类和添加构造函数的方法前面有介绍哦)package org.yexing.android.games.tank;import android.content.Context;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.SurfaceHolder.Callback;public class GameView extends SurfaceView implements C

4、allback public GameView(Context context) super(context);/ TODO Auto-generated constructor stubpublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,int arg3) / TODO Auto-generated method stubpublic void surfaceCreated(SurfaceHolder arg0) / TODO Auto-generated method stubpublic void surfa

5、ceDestroyed(SurfaceHolder arg0) / TODO Auto-generated method stub这里我们有看到了一个新的类SurfaceHolder,我们权且把它当作一个Surface 的控制器,用它来操作Surface。因为我们现在还不需要直接操作Surface,所以我们不做深入讲解。而唯一要使用的是SurfaceHolder.addCallback,即为SurfaceHolder 添加回调函数。原因前面我已经说明了,方法如下:public GameView(Context context) super(context);/ TODO Auto-genera

6、ted constructor stubgetHolder().addCallback(this);现在我们可以运行一下,跟第一次使用View 一样,界面上什么也没有。因为我们还没有编写绘图的代码嘛。前面说过,我们之所以使用SurfaceView 代替View,是因为SurfaceView 可以在主线程之外的线程中进行绘图操作,从而提高界面的反应速度。下面我们要做的就是创建一个用来绘图的线程。不过在这之前我们可以先了解一些关于游戏循环的知识:我们知道,一般的应用程序是用户驱动的,就是用户操作了,程序再来响应。而我们的游戏呢,不管用户有没有操作,都会有一些变化,最明显的就是npc 会移动、发生世

7、界事件等。因此,我们可以说,游戏程序在一个无限循环当中,我们就把它叫做游戏循环。那么在游戏循环中要做哪些工作呢?让我们用一个流程图来说明游戏循环的过程:获取用户输入移动主角移动NPC 和子弹碰撞检测产生世界事件这只是我们假设的流程,不同的游戏肯定会都有些变化。而且细节上会有更多的差别。了解了游戏循环,下面的工作就是建立一个线程,线程中包含一个游戏循环,在游戏循环中更新游戏的各种数据,并根据这些数据将游戏画面绘制在Surface 上最终显示给玩家。创建线程的方法很简单,我们不需要知道Thread 的很多高级特性。只需要知道,在线程中完成具体的工作需要重载run()函数。线程通过start()函数

8、启动。然后就会执行run()函数中的内容,run()函数执行结束后线程就会终止。因此我们将游戏循环放在run()函数中。通过start()启动循环,并通过适当的方式结束循环进而结束整个线程。还要注意一点,所有对Surface 的操作都必须要保证同步,因此我们会使用Synchronized 关键字,同步SurfaceHolder。增加了GameThread 后的代码如下:public class GameView extends SurfaceView implements Callback public static final String tag = GameView;/声明GameThr

9、ead类实例GameThread gameThread;public GameView(Context context) super(context);/ TODO Auto-generated constructor stub/获取SurfaceHolderSurfaceHolder surfaceHolder = getHolder();/添加回调对象surfaceHolder.addCallback(this);/创建GameThread类实例gameThread = new GameThread(surfaceHolder);public void surfaceChanged(Sur

10、faceHolder arg0, int arg1, int arg2,int arg3) / TODO Auto-generated method stubLog.v(tag, surfaceChanged);public void surfaceCreated(SurfaceHolder arg0) / TODO Auto-generated method stubLog.v(tag, surfaceCreated);/启动gameThreadgameThread.start();public void surfaceDestroyed(SurfaceHolder arg0) / TODO

11、 Auto-generated method stubLog.v(tag, surfaceDestroyed);/通过结束run()函数的方法结束gameThread,详见GameThread类的定义gameThread.run = false;/* GameThread的定义* author xingye*/class GameThread extends Thread SurfaceHolder surfaceHolder;/run()函数中控制循环的参数。boolean run = true;public GameThread(SurfaceHolder surfaceHolder) t

12、his.surfaceHolder = surfaceHolder;Overridepublic void run() / TODO Auto-generated method stubint i = 0;while(run) Log.v(tag, GameThread);Canvas c = null;try synchronized (surfaceHolder) /我们在屏幕上显示一个计数器,每隔1秒钟刷新一次c = surfaceHolder.lockCanvas();c.drawARGB(255, 255, 255, 255);c.drawText( + i+, 100, 100,

13、new Paint();Thread.sleep(1000); catch (Exception e) / TODO Auto-generated catch blocke.printStackTrace(); finally if (c != null) surfaceHolder.unlockCanvasAndPost(c);如何在Android平台上开发游戏,又如何使Android开发效率更高?我们是选择Android开发平台中的View还是SurfaceView呢?在Android中开发游戏,一般来说,或想写一个复杂一点的游戏,是必须用到SurfaceView来开发的。经过这一阵子对a

14、ndroid的研究,我找到了在android中游戏开发的误区,不要老想着用Layout和view去实现,不要将某个游戏中的对象做成一个组件来处理。应该尽量想着在Canvas(画布)中画出游戏戏中的背景、人物、动画等.SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。SurfaceView是提供给需要直接画像素而不是使用窗体部件的应用使用的。Android图形系统中一个重要的概念和线索是surface。View及其子类(如TextView, Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。还要注意的是,使用它的时候,一般都是出现在最顶层的:The view hierarchy will take care of correctly compositingwith the Surface any siblings of t

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1