《手机游戏开发》由会员分享,可在线阅读,更多相关《手机游戏开发(136页珍藏版)》请在金锄头文库上搜索。
1、 第第7 7章章 手机游戏开发手机游戏开发游戏是策划、美工和程序三者的协调 及创意和商业运作的平衡。集美术、音乐 、动画、人工智能等元素于一身。目前支持Java的手机性能越来越强大 ,同时,手机的价格在不断地下降,因此 ,手机游戏的市场前景将是非常良好的。 本章将从图片的处理、动画的制作和音效 的实现来学习手机游戏开发的基础知识。 手机游戏开发简介7.1PNG图像格式介绍7.2游戏设计中的动画7.3手机游戏2D动画开发7.4手机音效开发7.5综合示例:飞机碰撞7.6小结7.77.1 手机游戏开发简介现在的移动电话可以看作小型的计算 机,只是它的处理能力与PC相比很有限, 但是足够运行一个小型的
2、游戏。另一个特性就是它们还是网络计算机 ,能够高速发送和接收数字数据。 除了语 音数据以外,它们还可以发送和接收其他 类型的数据。所以类似传奇、千年这样的 网络游戏将来也可以在手机上实现。但是与PC相比,它们的输入和显示功 能也很有限。手机的屏幕都较小,其对声 音处理能力也很有限。开发者在这样的平台上开发应用,必 须认真的考虑这些特点。本节将重点讨论 手机本身的特点和手机游戏开发的特点。7.1.1 手机游戏的类型1嵌入式游戏2短信息服务游戏3WAP浏览器游戏图7-1 WAP游戏的工作原理图7.1.2 手机游戏开发特点1庞大的潜在用户群2便携性3屏幕小4有限的颜色和声音支持5应用程序大小限制6高
3、等待时间7可中断性是关键7.1.3 扬长避短的手机游戏 开发1缩短每回合的游戏时间2合理处理等待时间7.2 PNG图像格式介绍7.2.1 PNG的由来PNG全名Portable Network Graphics ,字面意思是“可移植性网络用图形”,从 这简单几个字已经明白定义了PNG的用途 以及主要发展方向。1996年,PNG Group向W3C(World Wide Web Consortium)提出一种多媒体 图形格式,重点在于改进现有JPG跟GIF的 缺点,并且提供更多新的概念与压缩模式 ,在提出后得到W3C的认可与推荐。在1996年10月1号,W3C正式发函公 告,推荐PNG为最佳的图
4、形格式,并且以 “PNG Delivers Higher Quality Graphics for Web Page Design”的文字作为该文件的 标头。7.2.2 PNG的图档格式特性PNG保留了大部分GIF的特性, PNG 的压缩率很高,尤其是图表型的图片 7.2.3 PNG格式图像的压缩及 处理PNG图像格式文件(或者称为数据流 )由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以 上的数据块(chunk)组成。PNG定义了两种类型的数据块,一种 是称为关键数据块(critical chunk),这 是标准的数据块,另一种叫做辅助数据块
5、(ancillary chunks),这是可选的数据块 。 7.2.4 使用PNG图片在MIDP具体实现中,Images可以是 可变的也可以是不可变的。不可变的Image可以从二进制图像文件 创建,如果要用二进制图像数据来创建 Image,这些数据必须是设备支持的格式。有的设备可能会支持额外的一些格式 ,不过所有设备都必须支持PNG格式。在 手机中使用PNG图片,必须先把图片加载 到内存,并且实例化成为一个Image对象。Image对象的构造方法如下: public static Image createImage(String name) 图7-2 旋转的“X”7.2.5 游戏菜单制作当玩家
6、在菜单项中选择了某选项后, 系统给玩家返回的界面应该不同。下例菜单选项包括:新游戏、高分榜 、帮助和退出。其他屏幕包括:游戏中的 界面、查看高分榜的界面、查看帮助的界 面。 图7-3 游戏的菜单界面7.3 游戏设计中的动画7.3.1 动画基础1什么是动画动画是通过连续播放一系列画面,给 人的视觉造成连续变化的图画。 2动画制作应注意的问题 (1)速度的处理 (2)循环动画 (3)夸张与拟人7.3.2 双缓冲技术双缓冲技术是编写J2ME游戏程序的关 键技术之一。实际上,双缓冲技术是计算 机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面 在显示的同时,程序又在改变它。解决办 法就是在内存中开
7、辟一片区域作为后台画 面,程序对它更新、修改,完成后再显示 它。这样被显示的图像永远是已经完全画 好的图像,程序修改的将不是正在被显示 的图像。当然还有其他方法可以解决屏幕 闪烁问题,但使用双缓冲技术是一种值得 推荐的解决方案。双缓冲思想体现在程序上就是要依次 完成以下几步工作。(1)定义一个Graphics对象bg和一 个Image对象buf,按屏幕大小建立一 个缓冲对象附给buf,然后取得buf的 Graphics对象附给bg。 (2)在bg(缓冲屏幕)上用 drawImage()和drawString等语句画 图,相当于在缓冲屏幕上画图。(3)调用repaint()语句,它的功能 是告知
8、系统调用paint()来完成真实屏 幕的显示。 (4)在paint(Graphics g)方法里,将 buf(缓冲屏幕上的图片)画到真实 屏幕上。7.3.3 图片的裁剪我们可以通过设定裁剪的区域来显示 图片的一个片断,使用前面讲的方法:setClip()getClipX() getClipY()getClipWidth() getClipHeight()创建裁剪区域的步骤如下。 (1)声明类的引用。 (2)创建类的实例,并赋值给这些 类引用。 (3)当程序开始时,显示Canvas类 的实例。(4)当Exit时,终止MIDlet。 (5)定义Canvas的派生类,并实现 CommandListe
9、ner。(6)请求保存图片所需的足够内存 块。如果使用动态图像,就创建图像 。否则确定图像包含什么静态图片文 件名。(7)从Paint()方法中判断图像是否 创建成功或者图像是否打开成功。如 果是创建一个新的裁剪区域,在画布 上绘制图像。7.3.4 播放动画框架开发MIDP的程序员经常会在一个 MIDlet上显示动画。MIDP 1.0没有直接提 供对动画的支持(正在开发中的MIDP 2.0 支持),但真要是自己去实现,其实也并 非是一件很难的事。任何动画的最基本的前提,是要在足 够快的时间内显示和更换一张张的图片, 让人的眼睛看到动的画面效果。图片必须 按照顺序画出来。从一张图片到下一张图片之
10、间的变化 越小,效果会越好。首先要做的,是使用 你的图片处理软件(比如Photoshop或者 Firework)创建一系列相同大小的图片来 组成动画。每张图片代表动画一帧。你需要制作 一定数量的帧越多的帧会让你的动画 看上去越平滑。制作好的图片一定要保存 成PNG格式。有两个办法让你刚做好的图片在 MIDlet上变成动画。第一,把图片都放到 一个Web服务器上,让MIDlet下载他们, MIDP内置的HTTP支持。第二个办法更简单,把图片用MIDlet 打包成JAR文件。如果你使用的是J2ME开 发工具,把PNG文件放到你的项目文件里 面就可以了。动画的过程其实更像账本记录:显示 当前帧,然后
11、适当地更换到下一帧。 7.4 手机游戏2D动画开发7.4.1 MIDP 2.0 2D游戏开发MIDP 2.0相对于1.0来说,最大的变化 就是新添加了用于支持游戏的API,它们 被放在javax.microedition.lcdui.game 包中 。游戏API包提供了一系列针对无线设 备的游戏开发类。由于无线设备仅有有限的计算能力, 因此许多API的目的在于提高Java游戏的 性能,并且把原来很多需要手动编写的代 码如屏幕双缓冲、图像剪裁等都交给API 间接调用本地代码来实现。各厂家有相当大的自由来优化它们。 游戏API使用了MIDP的低级图形类接口( Graphics,Image等)。整个
12、游戏包仅有5 个Class。1GameCanvas2Layer3LayerManager4Sprite5TiledLayer7.4.2 GameCanvas的使用GameCanvas类提供了基本的游戏用 户接口。除了从Canvas 继承下来的特性(命令 ,输入事件等)以外,它还提供了专门针 对游戏的功能,如后备屏幕缓冲和键盘状 态查询的能力。每个GameCanvas 实例都 会有一个唯一的缓冲区。 1绘图2键盘7.4.3 Sprite的使用Sprite 是一个基本的可视元素,可以 用存储在图像中的一帧或多帧来渲染它; 轮流显示不同的帧可以令Sprite 实现动画 。翻转、旋转等几种变换方式也能
13、应用 于Sprite 使其外观改变。作为Layer 子类, Sprite 的位置可以改变,并且还能设置其 可视与否。1Sprite 帧用于渲染Sprite的原始帧由一个单独的 Image对象提供,此Image可以是可变的, 也可以是不可变的。 图7-4 帧的分解2帧序列Sprite 的帧序列定义了帧以什么样的 顺序来显示。 图7-5 帧的序列 图7-6 帧的特定序列 图7-7 更新显示3Reference Pixel作为Layer 的一个子类,Sprite 继承了 很多方法来设置和获取位置,如 setPosition(x,y),getX()和getY()。 4Sprite 的变换几种变换可应用
14、于Sprite。可用的变换 包括旋转几个90 度加上镜像(沿垂直轴) 。 图7-8 Reference Pixel图7-9 参考像素点被定位在树枝末端图7-10 Sprite的变换 图7-11 90度旋转的变换7.4.4 碰撞检测Sprite 非常适合移动的物体,如游戏 主角、敌人等,在游戏中,可以使用Sprite 提供的碰撞检测功能来简化游戏逻辑。Sprite的碰撞检测可以分两种:一种是 矩形碰撞检测,另一种是像素碰撞检测。 游戏中Sprite的大小往往是用包围它的矩形 的大小来表示的,如在图7-12中的飞机和 导弹并没有发生碰撞但检查的结果却发生 了碰撞。图7-12 矩形碰撞检测 对于像素
15、碰撞检测,往往把Sprite的背 景色设置为相同的颜色,碰撞检查的时候 就只判断两个图片除背景色以外的其他像 素是否发生了重叠。像素碰撞检测比较精确,但计算复杂 ,一般没有特殊要求都使用矩形碰撞检测 。下面的例子两个矩形发生了碰撞但飞机 和导弹并没有发生碰撞,如图7-13所示。图7-13 像素碰撞检测要判断两个Sprite 是否碰撞,或者与 其他Layer 是否碰撞,可以使用 collidesWith()方法。CollidesWith()共有三 种形式:(1)public final boolean collidesWith(Sprite s,Boolean pixelLevel)(2)pub
16、lic final boolean collidesWith(TitledLayer t,Boolean pixelLevel)(3)public final boolean collidesWith(Image image,int x,int y,Boolean pixelLevel)7.4.5 Layer的使用Layer 是一个抽象类,表示游戏中的 一个可视元素。 1TiledLayerTiledLayer 由一系列单元格组成,单 元格可被一组贴图填充。 图7-14 TiledLayer每个贴图都被赋予一个唯一的索引号 。 除了静态贴图外,开发者同样能够定义一 系列动态贴图(animated tiles)。 动态贴图允许开发者能非常容易地改 变一组单元格的外观。 图7-15 TiledLayer背景图7-16 TiledLayer动态贴图2LayerManagerLayerMan