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

下载本文档

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

文档简介

2d2d图形开发(四)图形开发(四) android平台手机应用开发技术培训 高级.第18讲 学习目标: 目标学员: 课程时长:45分钟 有java语言基础的开发者或在校计 算机相关专业大学生 学习和了解在android中怎样结合2d图 形技术进行简单的游戏开发。 游戏需求概述 概要设计 游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 游戏需求概述 本次课程将使用这前节课所介绍的2d图 形方面的知识,完成如右图所示的小游 戏的开发。 这个简单的游戏叫机器人吃苹果, 屏幕上方会不停掉下各种各样的苹果, 玩家可以使用键盘或者触摸屏控制机器 人左右移动,接住苹果,并且得分。 游戏需求概述 机器人吃苹果的具体功能需求如下: 进入游戏后,屏幕上方会在随机的时间和位置,落下三种不同的苹果。 并且苹果也有三种下落速度。 按下键盘左右键,或者用手指在屏幕上点击,可以操作下方的机器人以 一定的速度左右移动。 当落下的苹果碰到机器人,就代表被吃掉,将会增加玩家的得分,同时 播放一个被吃掉的特效动画。 游戏需求概述 概要设计概要设计 游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 概要设计 首先回顾一下上一次的课程的内容: 上一课我们使用surfaceview配合surfaceholder等,实现了一个高效的 小游戏框架samplegame(fps高于60,在真机上更高)。 同时还定义了一个精灵类samplesprite,并且能够让精灵在游戏框架中 进行显示并且接受玩家的控制。 然后我们再来想想如何在现有框架之上完成游戏的需求: samplegame有一个刷新线程,负责将游戏内容不停的更新到屏幕。同 时它接受玩家对手机的操作事件(如按键或触摸屏幕)。 因此,我们只要创建出合适的精灵(运动的机器人或下落的苹果),放 到samplegame框架中,同时控制好这些精灵的移动和碰撞,就可以轻易的 实现我们的游戏目标了。 概要设计 如右图,游戏中可以抽象出三种种实体: 游戏世界,机器人和很多的苹果。 游戏世界提供一个完整的坐标系,机器人和苹果 都在其中运动。直接借用屏幕本身的坐标系即可, 机器人和苹果都只能在屏幕内活动。因此游戏世 界可以直接利用samplegame类来表达。 游戏世界中存在一个机器人精灵,它只能在底端 左右移动(由玩家控制)。只需从samplesprite派生一个机器人类即可。 游戏世界中会随机从顶端掉下不同类型的苹果。同时它可能会被机器人吃掉。 它同样需要从samplesprite派生。不过它还有普通状态和被吃掉状态,以及 一个掉落方法,还有不同的类型也需要被定义。 概要设计 到此,游戏大概的设计已经变得清晰起来: 首先从samplesprite派生出机器人类和苹果类。 然后在samplegame中完成游戏世界的定义: 游戏世界包含一个机器人类spriteandroid,它对用户的键盘和触摸将作 出左移或右移的相应。 然后还包含玩家的得分score,它用来表达机器人吃掉苹果的数量。 最后还包含很多的苹果类(苹果类的集合),它们不断的向下掉落。一 旦碰到机器人,则会增加得分。 最后在samplegame中完成苹果掉落的控制逻辑,同时检测苹果和机器人是 否碰撞即可。 游戏需求概述 概要设计 游戏对象的设计游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 机器人精灵类的设计 根据需求定义,我们首先需要一个代表机器人的精灵 samplespriteandroid ,它继承自samplesprite。同时自己 又定义了moveleft与moveright方法。同时它还定义了一个 速度常量并且将一个bitmap引用作为自己的图片资源。 public class samplespriteandroid extends samplesprite private static final int speed = 10;/速度 public samplespriteandroid() setbitmap(samplegame.bitmapandroid); public void moveleft() move(-speed, 0); public void moveright() move(speed, 0); 状态模式 在讲解苹果精灵类的设计之前,有必要先讲讲什么是状态模式。 状态模式(state pattern),当一个对象的内在状态改变时允许改变其行为,这 个对象看起来像是改变了其类本身。它是设计模式的一种,属于行为模式。 简单的说,状态模式就是当一个对象在不同的状态时,调用其方法可能会有 不同的结果。状态模式在实际使用中比较多,尤其在游戏开发领域。 最简单的实现状态模式的编码,是采用条件判断语句(或者switch语句)。 if (state = state_normal) /做普通状态该做的事 else if(state = state_eaten) /做被吃掉状态该做的事 苹果精灵类的设计 代表机器人的精灵samplespriteandroid ,它也继承自samplesprite。但是, 除了掉落方法(fall)之外,它还有很多独特的地方。 首先,它具有两种状态:普通状态和被吃掉状态。 普通状态时,它会一直向下掉落。 被吃掉状态时,它会停住,但播放一个小动画。 其次,它还有三种类型,分别对应不同的bitmap图片以及不同的速度。 public static final int state_normal = 0; public static final int state_eaten = 1; 苹果精灵类的设计 最后,我们讲解一下被重载的ondraw方法。它会根据不同的状态绘画不同的 内容,但目前我们需要关注被吃掉状态时它制作动画的方法。 每次重绘时,alpha值都会减少(减少的值叫步长值),我们常常使用这种方 法来制作动画。步长还可以表示距离,这样就是运动动画;表示角度,就是 旋转动画。 paint.setalpha(alpha); c.drawbitmap(bitmap, x - hx, y - h, paint); / alpha值减小,变得更透明 alpha -= 5; if (alpha (s.x - s.hx) return false; 游戏需求概述 概要设计 游戏对象的设计 游戏逻辑和对象池的实现游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 对象池的使用 我们的游戏需要不停的掉落苹果。按照常规的思维,我们只要使用一个随机 规则,在合适的位置创建苹果精灵并使其下落即可。 但是,这样会导致java代码在重绘过程中不断创建并回收苹果对象。不仅创 建过程会耗时,当释放的对象足够多,java调用gc函数回收内存时,也会造 成屏幕的停顿(实际上游戏开发中,尤其忌讳在重绘线程中创建对象)。 下面,我们将使用对象池技术,来解决这个问题。 对象池技术可以有效减少创建对象的系统开销。一般可以先创建一些对象, 预先存放在对象池里。当需要使用时,则从池里取出一个,然后激活该对象 当使用完对象时,则把它放回池中,等待下一次使用。 (我们为苹果对象创建了苹果池applepool ,它是samplegame的内部类) 对象池的使用 下面来介绍samplegame.applepool(把苹果池作为samplegame的内部类 来实现,是因为它与游戏逻辑相关性太大,并且没有复用价值)。 首先定义并预先初始化了一个苹果精灵数组 注意samplesprite的alive属性,它用于表示该对象是否被激活 private samplespriteapple pool; public applepool() pool = new samplespriteapple256; for (int i = 0; i pool.length; i+) pooli = new samplespriteapple(); public boolean alive = false; 对象池的使用 接下来,我们需要为对象池实现获取对象的方法 用for循环遍历池中的数组,找到一个可用的(alive等于false),然后进行适 当的初始化并激活(alive=true)即可。 public void getsamplespriteapple(int x, int type) for (int i = 0; i pool.length; i+) if (!pooli.alive) samplespriteapple b = pooli; b.settype(type); b.alive = true; b.x = x; b.y = -50; return; 对象池的使用 然后,还需要实现对象池的gc方法,用于回收苹果精灵 毫无疑问,当苹果运动到屏幕下方,我们就应该回收该对象了。 此外,我们还需要实现对象池的ondraw方法,它会根据alive属性绘画出所有 被激活的苹果。 public void gc(int width, int height) for (int i = 0; i height + 30) b.alive = false; 对象池的使用 最后,还需要为对象池中的苹果完成更新方法update,一方面使其按照自己 的速度下落(调用精灵对象的fall方法)。另一方面执行碰撞检测。 public void update() / 更新苹果池中,正在使用中的苹果 for (int i = 0; i pool.length; i+) samplespriteapple b = pooli; if (b.alive) if (!b.iseaten() / 判断是否与机器人精灵发生碰撞 if (b.collision(spriteandroid) b.eaten(); b.fall(); 游戏逻辑 首先,是游戏的初始化 创建游戏的图片资源 创建机器人精灵及苹果精灵池 初始化机器人精灵的位置 然后修改游戏引擎的更新线程,使其同时处理三方面的任务: 更新用户输入,键盘或触摸 updateinput() 更新游戏逻辑 updatelogic() 更新游戏视图 updateview(c) 然后修改游戏输入函数,使游戏能对按键和触摸进行相应: 主要任务是控制机器人的左右移动,所以,我们定义了三个常量,用于 表示机器人向左移动,向右移动,和原地不动。然后只要在按键或触摸时, 改变机器人的方向direction即可(updateinput方法会检测到direction的改变 并指示机器人移动)。 游戏逻辑 下面讲解一下游戏逻辑的重点部分,首先是updateinput方法: 其中fixandroidposition方法用于修正机器人精灵的坐标,以免它走出屏幕。 private void updateinput() / 根据机器人当前方向执行机器人的移动方法 if (direction = direction_left) spriteandroid.moveleft(); else if (direction = direction_right) spriteandroid.moveright(); / 修正机器人坐标,以免出界 fixandroidposition(); 游戏逻辑 然后是游戏的主逻辑: private void updatelogic() applepool.gc(width, height); / 回收苹果池, applepool.update(); / 更新苹果池 / 以一定的概率掉下苹果 if (nextrandom() % 50 3) / 选择苹果的位置,按百分比与实际屏幕宽度进行计算 int px = nextrandom() % 100; / 随机选择三种类型的苹果 int type = nextrandom() % 3; / 从苹果池中获取一个苹果 applepool.getsamplespriteapple(width * px / 100, type); 游戏逻辑 最后是画面更新的逻辑: private void updateview(canvas c) / 画背景 c.drawbitmap(background, 0.0f, 0.0f, p); / 画苹果 applepool.ondraw(c); / 画精灵 spriteandroid.ondraw(c); / 画刷新率fps current = system.currenttimemillis(); fps = 1000 / (current - time); c.drawtext(“fps : “ + long.tostring(fps), 20, 30, p); time = current; / 画得分 c.drawtext(“score : “ + integer.tostring(score), width - 150, 30, p); 游戏需求概述 概要设计 游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望项目总结及展望 项目总结 到此为止我们完成了机器人吃苹果的 开发。这里面只是使用了一些非常基本的 技术。下面是技术方面的一些总结: 使用surfaceview直接绘制bitmap,不要 贪恋drawable的功能,它会

温馨提示

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

评论

0/150

提交评论