2D图形开发(三)(高级).pdf_第1页
2D图形开发(三)(高级).pdf_第2页
2D图形开发(三)(高级).pdf_第3页
2D图形开发(三)(高级).pdf_第4页
2D图形开发(三)(高级).pdf_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

2d2d图形开发(三)图形开发(三) android平台手机应用开发技术培训 高级.第17讲 学习目标: 目标学员: 课程时长:45分钟 有java语言基础的开发者或在校计 算机相关专业大学生 掌握surfaceview的使用方法。 学习和了解游戏开发方面的基础知识。 课程简介课程简介 surfaceview介绍 游戏开发基础 项目演练 课程目录课程目录 课程简介 之前的两个课时,我们介绍了android的2d图形开发的一些基础概念。接下 来的这两个课时,将通过一个小游戏的开发过程,向大家更深入的介绍2d图 形在游戏方面的使用技巧。 本次课程的主要目的是建立基本的游戏框架,完成游戏场景和简单精灵的控 制。而游戏的其它部分,如精灵动画,游戏逻辑等,将在下节课介绍。 首先我们会讲解surfaceview及其使用方法。然后会在此基础上增加基本的用 户交互能力。最后还会介绍一些游戏开发的基础知识。 课程简介 surfaceviewsurfaceview介绍介绍 游戏开发基础 项目演练 课程目录课程目录 surfaceview介绍 surfaceview,可以理解为包含一个 surface的view。 surface的含义是“表面”。如右图所示, surface位于应用层绘图框架,甚至是 绘图引擎skia的底层。它可以被理解为 一个可绘制的物理表面。 简单的说,surfaceview是一种特殊的view,它允许应用直接访问底层的 surface,以便获取更高的性能。 对绘图性能要求比较高的应用(如游戏),往往会采用surfaceview进行开发。 surfaceview介绍 surfaceview提供了一个专用的绘图表面(surface)的视图(view)。 该绘图表面位于应用窗体(window)的后面。所以survaceview相当于在应 用的窗体与底层的绘图表面之间打了一个洞。这使得开发者可以直接访问底 层绘图表面(跨过了应用层以及绘图框架)。 实际上,android提供的源代码中,摄像头以及视频播放器等部分的应用都使 用了surfaceview 。而且,glsurfaceview(3d视图)和videoview(视频 视图)这样的高级视图,都是继承自surfaceview(毫无疑问,这样做是为了 能够直接访问到底层的surface,获取更高的性能)。 surfaceview介绍 void draw(canvas canvas) 用于手工的调用surfaceview进行重绘。 boolean gathertransparentregion(region region) 合并需要重绘的区域。同时适用于一个或多个surfaceview的情况,可 用于提高绘图的性能。 surfaceholder getholder() 获取当前的surfaceholder( 它是操作surfaceview 的关键句柄)。 surfaceview介绍 void setvisibility(int visibility) 设置是否显示。 void setzordermediaoverlay(boolean ismediaoverlay) 将surface置于window的顶部(但是低于window)。 void setzorderontop(boolean ontop) 将surface置于顶部(高于window)。 surfaceholder介绍 surfaceholder是surface的操作接口。我们只有使用它才能控制surfaceview 中对应的surface进行绘图。 下面是surfaceholder的重要方法摘要: void addcallback(surfaceholder.callback callback) 添加一个回调接口(该接口用于接收surfaceview的创建, 变更,销毁等事件) canvas lockcanvas() canvas lockcanvas(rect dirty) 锁定canvas。只有锁定后才能得到surface对应的canvas, 然后才能操作canvas进行绘画。 void unlockcanvasandpost(canvas canvas) 解除对canvas的锁定,同时提交lockcanvas后所作的操作。 void setkeepscreenon(boolean screenon) 保持屏幕不会进入自动休眠。 surfaceholder.callback介绍 surfaceholder.callback是一个回调接口,用于接收surfaceview的创建,变 更,销毁等事件。 surfacechanged(surfaceholder holder, int format, int width, int height) 当surface发生变化(尺寸或者像素格式)时将会调用该方法。 surfacecreated(surfaceholder holder) 当surface被成功创建时将会调用该方法。 surfacedestroyed(surfaceholder holder) 当surface被销毁是将会调用该方法。 surfaceview的使用 surfaceview的使用,需要配合刚才所讲到的surfaceholder和 surfaceholder.callback。 操作sufaceview的关键在于surfaceholder ,于是,使用如下代码创建一个 sufaceview,并且获取其surfaceholder即可。 然后就可以直接操作surfaceholder对sufaceview进行绘画。当然,必须先使 用lockcanvas方法锁定并获得一个canvas对象。绘画完成之后,必须调用 unlockcanvasandpost方法解锁canvas并提交更改。 surfaceview gameview = new surfaceview(this); surfaceholder holder = gameview.getholder(); canvas c = holder.lockcanvas(null); c.drawcolor(color.black); holder.unlockcanvasandpost(c); surfaceview的使用 通常,我们还需要配合surfaceholder.callback来监控surface的一些变化。 例如我们将要讲到的小游戏,就在surfacecreated时启动重绘线程,同时在 surfacedestroyed时,关闭重绘线程。 private surfaceholder.callback callback = new surfaceholder.callback() public void surfacedestroyed(surfaceholder holder) public void surfacecreated(surfaceholder holder) public void surfacechanged(surfaceholder holder, int format, int width,int height) ; 课程简介 surfaceview介绍 游戏开发基础游戏开发基础 项目演练 课程目录课程目录 游戏的输入方式 对于游戏而言,单纯的使用ui控件或键盘,往往达不到要求的效果 不必担心,android为我们提供了丰富的api。只需要对他们稍加调整,就可 以作为游戏的输入。例如: 传感器(陀螺仪,方位,加速度) 将手机的平衡,方向的改变,晃动等,作为游戏事件 可以实现目前的一些体感游戏(例如高尔夫,仓鼠球) 手势 在触摸屏上按一定的规则去划手势,如滑动,双击等 语音识别 通过阅读一定的指令来控制游戏 目前的示范我们只用到了最简单的输入事件,同学们可以参考我们其它相关 的课程,来实现上述的特殊输入,让游戏拥有更好的体验感。 android的基本输入方式 通常我们可以使用activity或者view的onkeydown,以及ontouchevent等类 似的函数来处理键盘或者触摸事件。例如下面的按键处理函数,它是对 activity对应方法的重载。 注意:如果我们的代码处理了该事件,则应该返回true,表示已经做过处理。 这样,事件就不会再接着向下传递,而直接返回。 如果我们的代码没有处理,则返回false,这样事件还会接着向下传递,直到 没有合适的响应者。 public boolean onkeydown(int keycode, keyevent event) if (samplegame.onkeydown(keycode, event) return true; else return super.onkeydown(keycode, event); 刷新率 fps(frames per second),每秒显示多少次游戏画面。这个数值越高, 画面就月流畅,数值太低,就会感觉画面闪烁甚至停顿。 早期电影的fps是24(每秒24个画面),一般的游戏能达到这个级别基本上 就可以了(除了一些fps要求比较高的游戏,例如射击类游戏)。 不过,android毕竟是手持设备,在电源与游戏的流畅与华丽之间,应该做一 些权衡。该华丽的地方华丽,能省电的地方省点,应该是一个开发准则。 在使用surfaceview的情况下,刷新率基本上能够保证比其它的view要高一 些(模拟器上极限能达到60,真机上也差不多。当然这也取决于游戏算法)。 需要注意的是,在lockcanvas和unlockcanvasandpost方法之间,尽量不要 做无用的操作,尤其要注意这种会因为刷新而反复执行的代码,千万不要在 这种片段里面创建复杂对象。 游戏精灵 精灵,是构成游戏中活动体(比如飞机、野兽等)的 最基本单元的总称。任何一个活动体可以由一个或多 个精灵组合而成,它能够进行自身的绘制,移动等等 (更复杂的还可以旋转)基本动作。 精灵被广泛应用与游戏开发技术,不论是2d还是3d。 开发过程中我们可以抽象出一些通用的精灵操作,然后通过继承与组合,实 现更复杂的精灵(例如,动画精灵可以进一步派生出英雄,妖怪等等)。然 后在这些抽象接口的基础上,我们无需担心精灵类的具体实现方法。 此外,专业的游戏开发者都会使用精灵编辑器来完成精灵的制作。这样有利 于分工,也可以让美术更专注于制作出更绚丽的精灵特效。 课程简介 surfaceview介绍 游戏开发基础 项目演练项目演练 课程目录课程目录 项目演练概述 本次演练,需要实现三个类:testgameactivity(游戏容器), samplegame(游戏的实体),samplesprite(简单的精灵)。 samplesprite很简单,它代表一个机器人,可以自由移动。并且拥有代表机 器人的图片,可以被绘画出来。 samplegame是我们的游戏实体,到目前为止,我们只实现了它的基本框架 可以处理用户输入,并且能够将当前的游戏内容绘制到surface上(游戏的逻 辑等实体的其它部分,再下节课进一步讲解)。 testgameactivity将作为游戏容器,负责将手机的按键及触摸事件发送给游 戏。同时,游戏实体也可以把自身的游戏内容绘制到testgameactivity中的 surfaceview上面。 游戏精灵的实现 创建samplesprite类,它包含三个参数:坐标x,坐标y,及精灵的图像 然后为其实现基本的移动和绘画方法 public samplesprite(bitmap bitmap, float x, float y) this.x = x; this.y = y; this.bitmap = bitmap; public void move(float x, float y) this.x += x; this.y += y; public void ondraw(canvas c) c.drawbitmap(bitmap, x, y, paintdefault); 游戏实体的实现 游戏实体必须处理游戏内容的绘画,它将持有一个surfaceholder,同时,它 还需要管理surfaceholder.callback对应的事件。因此,它需要实现 surfacecreated, surfacechanged, surfacedestroyed三个方法。我们在 surfacecreated方法被调用时,将会启动游戏的刷新线程。 然后在surfacedestroyed中结束刷新线程。 public void surfacecreated(surfaceholder holder) this.holder = holder; drawthread = new thread(this); drawthread.start(); public void surfacedestroyed(surfaceholder holder) running = false; 游戏实体的实现 游戏实体需要一个刷新线程,不停的重绘游戏界面。因此samplegame将实 现runnable的接口run函数 public void run() while (running) canvas c = holder.lockcanvas(null); / 锁定整个画布 try synchronized (holder) updateview(c); catch (exception ex) ex.printstacktrace(); finally holder.unlockcanvasandpost(c); / 更新屏幕显示内容 游戏实体的实现 接下来实现samplegame的updateview更新游戏绘图的界面。 private void updateview(canvas c) c.drawcolor(color.black); / 画背景 / 计算并绘画刷新率fps current = system.currenttimemillis(); p.setcolor(color.red); fps = 1000 / (current - time); c.drawtext(“fps : “ + long.tostring(fps), 20, 30, p); time = current; spriteicon.ondraw(c); / 画精灵 游戏实体的实现 最后还需为samplegame完成游戏的事件响应代码。 当onkeydown被调用时,根据用户所按的方向键,将决定精灵的移动方向。 只需要调用精灵对应的move方法即可。 当ontouchevent被调用时,如果是按下或者移动事件,则会让精灵朝按下的 点的方向移动。 游戏容器的实现 首先创建testgameactivity。需要注意我们对activity做了特殊设置 此外这里使用了surfaceview替代了以前的view。请务必留意setfocusable 和setfocusableintouchmode,不设置的话,无法响应按键和触摸。 requestwindowfeature(window.feature_no_title); / 去除title getwindow().setformat(pixelformat.transparent); / 支持透明 getwindow().setflags(windowmanager.layoutparams.flag_fullscreen, windowmanager.l

温馨提示

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

评论

0/150

提交评论