surfaceView.docx

上传人:b****1 文档编号:2376255 上传时间:2022-10-29 格式:DOCX 页数:11 大小:19.43KB
下载 相关 举报
surfaceView.docx_第1页
第1页 / 共11页
surfaceView.docx_第2页
第2页 / 共11页
surfaceView.docx_第3页
第3页 / 共11页
surfaceView.docx_第4页
第4页 / 共11页
surfaceView.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

surfaceView.docx

《surfaceView.docx》由会员分享,可在线阅读,更多相关《surfaceView.docx(11页珍藏版)》请在冰豆网上搜索。

surfaceView.docx

surfaceView

前面介绍的内容,还是比较简单的,应用这些知识,可以完成一些非实时游戏,比如井字棋

  等,或者一些画面刷新不是很频繁、实时性不强的游戏,比如我们前面做的扫雷。

但是我们

  的目标是坦克大战,对操作的实时性要求比较高,更有很多的NPC需要处理,绘图的工作

  量也很大,所以我们要用一个新的视图类SurfaceView代替View来完成显示工作。

  SurfaceView与View有一些不同,但是我们只用其中的一个特性:

在主线程之外的线程中向

  屏幕上绘图。

这样就可以避免在画图任务繁重的时候造成主线程阻塞,从而提高程序的反应

  速度。

  首先让我们重新定义一个GameView类,让他继承自SurfaceView,并且要实现

  SurfaceHolder.Callback接口。

为什么要实现Callback接口呢?

因为使用SurfaceView有一个

  原则,所有的绘图工作必须得在Surface被创建之后才能开始(Surface—表面,这个概念在

  图形编程中常常被提到。

基本上我们可以把它当作显存的一个映射,写入到Surface的内容

  可以被直接复制到显存从而显示出来,这使得显示速度会非常快),而在Surface被销毁之前

  必须结束。

所以Callback中的surfaceCreated和surfaceDestroyed就成了绘图处理代码的边界。

  我们直接让GameView类实现Callback接口,使程序更简洁一些。

  GameView被创建,并补充了构造函数之后就是这个样子(创建类和添加构造函数的方法前

  面有介绍哦)

  packageorg.yexing.android.games.tank;

  importandroid.content.Context;

  importandroid.view.SurfaceHolder;

  importandroid.view.SurfaceView;

  importandroid.view.SurfaceHolder.Callback;

  publicclassGameViewextendsSurfaceViewimplementsCallback{

  publicGameView(Contextcontext){

  super(context);

  //TODOAuto-generatedconstructorstub

  }

  publicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,

  intarg3){

  //TODOAuto-generatedmethodstub

  }

  publicvoidsurfaceCreated(SurfaceHolderarg0){

  //TODOAuto-generatedmethodstub

 }

  publicvoidsurfaceDestroyed(SurfaceHolderarg0){

  //TODOAuto-generatedmethodstub

  }

  }

  这里我们有看到了一个新的类SurfaceHolder,我们权且把它当作一个Surface的控制器,用

  它来操作Surface。

因为我们现在还不需要直接操作Surface,所以我们不做深入讲解。

而唯

  一要使用的是SurfaceHolder.addCallback,即为SurfaceHolder添加回调函数。

原因前面我已

  经说明了,方法如下:

  publicGameView(Contextcontext){

  super(context);

  //TODOAuto-generatedconstructorstub

  getHolder().addCallback(this);

  }

  现在我们可以运行一下,跟第一次使用View一样,界面上什么也没有。

因为我们还没有编

  写绘图的代码嘛。

  前面说过,我们之所以使用SurfaceView代替View,是因为SurfaceView可以在主线程之外

  的线程中进行绘图操作,从而提高界面的反应速度。

下面我们要做的就是创建一个用来绘图

  的线程。

不过在这之前我们可以先了解一些关于游戏循环的知识:

  我们知道,一般的应用程序是用户驱动的,就是用户操作了,程序再来响应。

而我们的游戏

  呢,不管用户有没有操作,都会有一些变化,最明显的就是npc会移动、发生世界事件等。

  因此,我们可以说,游戏程序在一个无限循环当中,我们就把它叫做游戏循环。

那么在游戏

  循环中要做哪些工作呢?

让我们用一个流程图来说明游戏循环的过程:

  获取用户输入

  移动主角

  移动NPC和子弹

  碰撞检测

  产生世界事件

  这只是我们假设的流程,不同的游戏肯定会都有些变化。

而且细节上会有更多的差别。

  了解了游戏循环,下面的工作就是建立一个线程,线程中包含一个游戏循环,在游戏循环中

  更新游戏的各种数据,并根据这些数据将游戏画面绘制在Surface上最终显示给玩家。

  创建线程的方法很简单,我们不需要知道Thread的很多高级特性。

只需要知道,在线程中

  完成具体的工作需要重载run()函数。

线程通过start()函数启动。

然后就会执行run()函数中

  的内容,run()函数执行结束后线程就会终止。

因此我们将游戏循环放在run()函数中。

通过

start()启动循环,并通过适当的方式结束循环进而结束整个线程。

还要注意一点,所有对

  Surface的操作都必须要保证同步,因此我们会使用Synchronized关键字,同步SurfaceHolder。

  增加了GameThread后的代码如下:

  publicclassGameViewextendsSurfaceViewimplementsCallback{

  publicstaticfinalStringtag="GameView";

  //声明GameThread类实例

  GameThreadgameThread;

  publicGameView(Contextcontext){

  super(context);

  //TODOAuto-generatedconstructorstub

  //获取SurfaceHolder

  SurfaceHoldersurfaceHolder=getHolder();

  //添加回调对象

  surfaceHolder.addCallback(this);

  //创建GameThread类实例

  gameThread=newGameThread(surfaceHolder);

  }

  publicvoidsurfaceChanged(SurfaceHolderarg0,intarg1,intarg2,

  intarg3){

  //TODOAuto-generatedmethodstub

  Log.v(tag,"surfaceChanged");

  }

  publicvoidsurfaceCreated(SurfaceHolderarg0){

  //TODOAuto-generatedmethodstub

  Log.v(tag,"surfaceCreated");

  //启动gameThread

  gameThread.start();

  }

  publicvoidsurfaceDestroyed(SurfaceHolderarg0){

  //TODOAuto-generatedmethodstub

  Log.v(tag,"surfaceDestroyed");

  //通过结束run()函数的方法结束gameThread,详见GameThread类的定义

  gameThread.run=false;

  }

  /**

  *GameThread的定义

  *@authorxingye

  *

  */

  classGameThreadextendsThread{

  SurfaceHoldersurfaceHolder;

  //run()函数中控制循环的参数。

  booleanrun=true;

  publicGameThread(SurfaceHoldersurfaceHolder){

  this.surfaceHolder=surfaceHolder;

  }

  @Override

  publicvoidrun(){

  //TODOAuto-generatedmethodstub

inti=0;

  while(run){

  Log.v(tag,"GameThread");

  Canvasc=null;

  try{

  synchronized(surfaceHolder){

  //我们在屏幕上显示一个计数器,每隔1秒钟刷新一次

  c=surfaceHolder.lockCanvas();

  c.drawARGB(255,255,255,255);

  c.drawText(""+i++,100,100,newPaint());

  Thread.sleep(1000);

  }

  }catch(Exceptione){

  //TODOAuto-generatedcatchblock

  e.printStackTrace();

  }finally{

  if(c!

=null){

  surfaceHolder.unlockCanvasAndPost(c);

  }

  }

  }

  }

  }

  }

 如何在Android平台上开发游戏,又如何使Android开发效率更高?

我们是选择Android开发平台中的View还是SurfaceView呢?

  在Android中开发游戏,一般来说,或想写一个复杂一点的游戏,是必须用到SurfaceView来开发的。

  经过这一阵子对android的研究,我找到了在android中游戏开发的误区,不要老想着用Layout和view去实现,不要将某个游戏

  中的对象做成一个组件来处理。

应该尽量想着在Canvas(画布)中画出游戏戏中的背景、人物、动画等...

  SurfaceView提供直接访问一个可画图的界面,可以控制在界面顶部的子视图层。

SurfaceView是提供给需要直接画像素而不是使用

  窗体部件的应用使用的。

Android图形系统中一个重要的概念和线索是surface。

View及其子类(如TextView,Button)

  要画在surface上。

每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。

  还要注意的是,使用它的时候,一般都是出现在最顶层的:

Theviewhierarchywilltakecareofcorrectlycompositing

  withtheSurfaceanysiblingsoft

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

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

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