2D图形开发(四)(高级).pdf

上传人:爱问知识人 文档编号:3329509 上传时间:2019-08-13 格式:PDF 页数:31 大小:2.30MB
返回 下载 相关 举报
2D图形开发(四)(高级).pdf_第1页
第1页 / 共31页
2D图形开发(四)(高级).pdf_第2页
第2页 / 共31页
2D图形开发(四)(高级).pdf_第3页
第3页 / 共31页
2D图形开发(四)(高级).pdf_第4页
第4页 / 共31页
2D图形开发(四)(高级).pdf_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《2D图形开发(四)(高级).pdf》由会员分享,可在线阅读,更多相关《2D图形开发(四)(高级).pdf(31页珍藏版)》请在三一文库上搜索。

1、2D2D图形开发(四)图形开发(四) Android平台手机应用开发技术培训 高级.第18讲 学习目标: 目标学员: 课程时长:45分钟 有JAVA语言基础的开发者或在校计 算机相关专业大学生 学习和了解在Android中怎样结合2D图 形技术进行简单的游戏开发。 游戏需求概述 概要设计 游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 游戏需求概述 本次课程将使用这前节课所介绍的2D图 形方面的知识,完成如右图所示的小游 戏的开发。 这个简单的游戏叫机器人吃苹果, 屏幕上方会不停掉下各种各样的苹果, 玩家可以使用键盘或者触摸屏控制机器 人左右移动,接住苹果,并且得分。

2、 游戏需求概述 机器人吃苹果的具体功能需求如下: 进入游戏后,屏幕上方会在随机的时间和位置,落下三种不同的苹果。 并且苹果也有三种下落速度。 按下键盘左右键,或者用手指在屏幕上点击,可以操作下方的机器人以 一定的速度左右移动。 当落下的苹果碰到机器人,就代表被吃掉,将会增加玩家的得分,同时 播放一个被吃掉的特效动画。 游戏需求概述 概要设计概要设计 游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 概要设计 首先回顾一下上一次的课程的内容: 上一课我们使用SurfaceView配合SurfaceHolder等,实现了一个高效的 小游戏框架SampleGame(FPS高于

3、60,在真机上更高)。 同时还定义了一个精灵类SampleSprite,并且能够让精灵在游戏框架中 进行显示并且接受玩家的控制。 然后我们再来想想如何在现有框架之上完成游戏的需求: SampleGame有一个刷新线程,负责将游戏内容不停的更新到屏幕。同 时它接受玩家对手机的操作事件(如按键或触摸屏幕)。 因此,我们只要创建出合适的精灵(运动的机器人或下落的苹果),放 到SampleGame框架中,同时控制好这些精灵的移动和碰撞,就可以轻易的 实现我们的游戏目标了。 概要设计 如右图,游戏中可以抽象出三种种实体: 游戏世界,机器人和很多的苹果。 游戏世界提供一个完整的坐标系,机器人和苹果 都在其

4、中运动。直接借用屏幕本身的坐标系即可, 机器人和苹果都只能在屏幕内活动。因此游戏世 界可以直接利用SampleGame类来表达。 游戏世界中存在一个机器人精灵,它只能在底端 左右移动(由玩家控制)。只需从SampleSprite派生一个机器人类即可。 游戏世界中会随机从顶端掉下不同类型的苹果。同时它可能会被机器人吃掉。 它同样需要从SampleSprite派生。不过它还有普通状态和被吃掉状态,以及 一个掉落方法,还有不同的类型也需要被定义。 概要设计 到此,游戏大概的设计已经变得清晰起来: 首先从SampleSprite派生出机器人类和苹果类。 然后在SampleGame中完成游戏世界的定义:

5、 游戏世界包含一个机器人类spriteAndroid,它对用户的键盘和触摸将作 出左移或右移的相应。 然后还包含玩家的得分score,它用来表达机器人吃掉苹果的数量。 最后还包含很多的苹果类(苹果类的集合),它们不断的向下掉落。一 旦碰到机器人,则会增加得分。 最后在SampleGame中完成苹果掉落的控制逻辑,同时检测苹果和机器人是 否碰撞即可。 游戏需求概述 概要设计 游戏对象的设计游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望 机器人精灵类的设计 根据需求定义,我们首先需要一个代表机器人的精灵 SampleSpriteAndroid ,它继承自SampleSpr

6、ite。同时自己 又定义了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

7、(SPEED, 0); 状态模式 在讲解苹果精灵类的设计之前,有必要先讲讲什么是状态模式。 状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这 个对象看起来像是改变了其类本身。它是设计模式的一种,属于行为模式。 简单的说,状态模式就是当一个对象在不同的状态时,调用其方法可能会有 不同的结果。状态模式在实际使用中比较多,尤其在游戏开发领域。 最简单的实现状态模式的编码,是采用条件判断语句(或者switch语句)。 if (state = STATE_NORMAL) /做普通状态该做的事 else if(state = STATE_EATEN) /做被吃掉状态该做

8、的事 苹果精灵类的设计 代表机器人的精灵SampleSpriteAndroid ,它也继承自SampleSprite。但是, 除了掉落方法(fall)之外,它还有很多独特的地方。 首先,它具有两种状态:普通状态和被吃掉状态。 普通状态时,它会一直向下掉落。 被吃掉状态时,它会停住,但播放一个小动画。 其次,它还有三种类型,分别对应不同的Bitmap图片以及不同的速度。 public static final int STATE_NORMAL = 0; public static final int STATE_EATEN = 1; 苹果精灵类的设计 最后,我们讲解一下被重载的onDraw方法。

9、它会根据不同的状态绘画不同的 内容,但目前我们需要关注被吃掉状态时它制作动画的方法。 每次重绘时,alpha值都会减少(减少的值叫步长值),我们常常使用这种方 法来制作动画。步长还可以表示距离,这样就是运动动画;表示角度,就是 旋转动画。 paint.setAlpha(alpha); c.drawBitmap(bitmap, x - hx, y - h, paint); / alpha值减小,变得更透明 alpha -= 5; if (alpha (s.x - s.hx) 对象池的使用 最后,还需要为对象池中的苹果完成更新方法update,一方面使其按照自己 的速度下落(调用精灵对象的fall

10、方法)。另一方面执行碰撞检测。 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(); 游戏逻辑 首先,是游戏的初始化 创建游戏的图片资源 创建机器人精灵及苹果精灵池 初始化机器人精灵的位置 然后修改游戏引擎的更新线程,使其同时处理三方面的任务: 更新

11、用户输入,键盘或触摸 updateInput() 更新游戏逻辑 updateLogic() 更新游戏视图 updateView(c) 然后修改游戏输入函数,使游戏能对按键和触摸进行相应: 主要任务是控制机器人的左右移动,所以,我们定义了三个常量,用于 表示机器人向左移动,向右移动,和原地不动。然后只要在按键或触摸时, 改变机器人的方向direction即可(updateInput方法会检测到direction的改变 并指示机器人移动)。 游戏逻辑 下面讲解一下游戏逻辑的重点部分,首先是updateInput方法: 其中fixAndroidPosition方法用于修正机器人精灵的坐标,以免它走出

12、屏幕。 private void updateInput() / 根据机器人当前方向执行机器人的移动方法 if (direction = DIRECTION_LEFT) spriteAndroid.moveLeft(); else if (direction = DIRECTION_RIGHT) spriteAndroid.moveRight(); / 修正机器人坐标,以免出界 fixAndroidPosition(); 游戏逻辑 然后是游戏的主逻辑: private void updateLogic() applePool.gc(width, height); / 回收苹果池, appleP

13、ool.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(ba

14、ckground, 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,

15、 30, p); 游戏需求概述 概要设计 游戏对象的设计 游戏逻辑和对象池的实现 课程目录课程目录 项目总结及展望项目总结及展望 项目总结 到此为止我们完成了机器人吃苹果的 开发。这里面只是使用了一些非常基本的 技术。下面是技术方面的一些总结: 使用SurfaceView直接绘制Bitmap,不要 贪恋Drawable的功能,它会使游戏变慢。 使用对象池技术可以有效避免对象创建和 回收,游戏过程中基本不会遇到gc。 动画绘制也没有使用Android的类,那样 会很慢。 关于此游戏的展望 虽然这个游戏还有很多缺陷,但希望它能起到抛砖引玉的作用,让更多初学 者能够尽快开始游戏编程之旅。 关于游戏,我们可以做的还有很多: 为游戏添加音效 操作方面,建议增加陀螺仪的支持 制作更精美的动画(基本只要替换精灵类的onDraw方法即可) 增加可玩性,例如为不同类型的苹果增加不同的影响,增加新的游戏元 素等。 增加关卡设计(没有目的的游戏不是好游戏) 总结 简单的游戏框架 动画的制作 对象池的使用 本课程到此结束,谢谢!

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

当前位置:首页 > 建筑/环境 > 装饰装潢


经营许可证编号:宁ICP备18001539号-1