手机游戏开发课件.pptx
2019 年5 月8 日感谢你的观看 兰州石化学院 Page 1 第7章 手机游戏开发2019 年5 月8 日感谢你的观看 兰州石化学院 Page 2 游戏是策划、美工和程序三者的协调及创意和商业运作的平衡。集美术、音乐、动画、人工智能等元素于一身。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 3 目前支持Java的手机性能越来越强大,同时,手机的价格在不断地下降,因此,手机游戏的市场前景将是非常良好的。本章将从图片的处理、动画的制作和音效的实现来学习手机游戏开发的基础知识。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 4 手机游戏开发简介7.1 PNG图像格式介绍7.2游戏设计中的动画7.3手机游戏2D动画开发7.42019 年5 月8 日感谢你的观看 兰州石化学院 Page 5 手机音效开发7.5综合示例:飞机碰撞7.6小结7.72019 年5 月8 日感谢你的观看 兰州石化学院 Page 67.1 手机游戏开发简介现在的移动电话可以看作小型的计算机,只是它的处理能力与PC相比很有限,但是足够运行一个小型的游戏。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 7 另一个特性就是它们还是网络计算机,能够高速发送和接收数字数据。除了语音数据以外,它们还可以发送和接收其他类型的数据。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 8 所以类似传奇、千年这样的网络游戏将来也可以在手机上实现。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 9 但是与PC相比,它们的输入和显示功能也很有限。手机的屏幕都较小,其对声音处理能力也很有限。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 10 开发者在这样的平台上开发应用,必须认真的考虑这些特点。本节将重点讨论手机本身的特点和手机游戏开发的特点。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 11 7.1.1 手机游戏的类型 1嵌入式游戏 2短信息服务游戏 3WAP浏览器游戏2019 年5 月8 日感谢你的观看 兰州石化学院 Page 12 图7-1 WAP游戏的工作原理图2019 年5 月8 日感谢你的观看 兰州石化学院 Page 13 7.1.2 手机游戏开发特点 1庞大的潜在用户群 2便携性 3屏幕小2019 年5 月8 日感谢你的观看 兰州石化学院 Page 14 4有限的颜色和声音支持 5应用程序大小限制 6高等待时间 7可中断性是关键2019 年5 月8 日感谢你的观看 兰州石化学院 Page 15 7.1.3 扬长避短的手机游戏开发 1缩短每回合的游戏时间 2合理处理等待时间2019 年5 月8 日感谢你的观看 兰州石化学院 Page 16 7.2 PNG图像格式介绍 7.2.1 PNG的由来PNG全名PortableNetworkGraphics,字面意思是“可移植性网络用图形”,从这简单几个字已经明白定义了PNG的用途以及主要发展方向。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 17 1996年,PNGGroup向W3C(WorldWideWebConsortium)提出一种多媒体图形格式,重点在于改进现有JPG跟GIF的缺点,并且提供更多新的概念与压缩模式,在提出后得到W3C的认可与推荐。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 18 在1996年10月1号,W3C正式发函公告,推荐PNG为最佳的图形格式,并且以“PNGDeliversHigherQualityGraphicsforWebPageDesign”的文字作为该文件的标头。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 19 7.2.2 PNG的图档格式特性PNG保留了大部分GIF的特性,PNG的压缩率很高,尤其是图表型的图片2019 年5 月8 日感谢你的观看 兰州石化学院 Page 20 7.2.3 PNG格式图像的压缩及处理PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNGfilesignature)域和按照特定结构组织的3个以上的数据块(chunk)组成。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 21 PNG定义了两种类型的数据块,一种是称为关键数据块(criticalchunk),这是标准的数据块,另一种叫做辅助数据块(ancillarychunks),这是可选的数据块。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 22 7.2.4 使用PNG图片在MIDP具体实现中,Images可以是可变的也可以是不可变的。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 23 不可变的Image可以从二进制图像文件创建,如果要用二进制图像数据来创建Image,这些数据必须是设备支持的格式。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 24 有的设备可能会支持额外的一些格式,不过所有设备都必须支持PNG格式。在手机中使用PNG图片,必须先把图片加载到内存,并且实例化成为一个Image对象。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 25 Image对象的构造方法如下:publicstaticImagecreateImage(Stringname)2019 年5 月8 日感谢你的观看 兰州石化学院 Page 26 图7-2 旋转的“X”2019 年5 月8 日感谢你的观看 兰州石化学院 Page 27 7.2.5 游戏菜单制作当玩家在菜单项中选择了某选项后,系统给玩家返回的界面应该不同。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 28 下例菜单选项包括:新游戏、高分榜、帮助和退出。其他屏幕包括:游戏中的界面、查看高分榜的界面、查看帮助的界面。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 29 图7-3 游戏的菜单界面2019 年5 月8 日感谢你的观看 兰州石化学院 Page 30 7.3 游戏设计中的动画 7.3.1 动画基础 1什么是动画动画是通过连续播放一系列画面,给人的视觉造成连续变化的图画。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 31 2动画制作应注意的问题(1)速度的处理(2)循环动画(3)夸张与拟人2019 年5 月8 日感谢你的观看 兰州石化学院 Page 32 7.3.2 双缓冲技术双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 33 造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它。解决办法就是在内存中开辟一片区域作为后台画面,程序对它更新、修改,完成后再显示它。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 34 这样被显示的图像永远是已经完全画好的图像,程序修改的将不是正在被显示的图像。当然还有其他方法可以解决屏幕闪烁问题,但使用双缓冲技术是一种值得推荐的解决方案。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 35 双缓冲思想体现在程序上就是要依次完成以下几步工作。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 36(1)定义一个Graphics 对象bg 和一个Image 对象buf,按屏幕大小建立一个缓冲对象附给buf,然后取得buf 的Graphics 对象附给bg。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 37(2)在bg(缓冲屏幕)上用drawImage()和drawString 等语句画图,相当于在缓冲屏幕上画图。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 38(3)调用repaint()语句,它的功能是告知系统调用paint()来完成真实屏幕的显示。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 39(4)在paint(Graphicsg)方法里,将buf(缓冲屏幕上的图片)画到真实屏幕上。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 40 7.3.3 图片的裁剪我们可以通过设定裁剪的区域来显示图片的一个片断,使用前面讲的方法:setClip()getClipX()getClipY()getClipWidth()getClipHeight()2019 年5 月8 日感谢你的观看 兰州石化学院 Page 41 创建裁剪区域的步骤如下。(1)声明类的引用。(2)创建类的实例,并赋值给这些类引用。(3)当程序开始时,显示Canvas 类的实例。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 42(4)当Exit 时,终止MIDlet。(5)定义Canvas 的派生类,并实现CommandListener。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 43(6)请求保存图片所需的足够内存块。如果使用动态图像,就创建图像。否则确定图像包含什么静态图片文件名。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 44(7)从Paint()方法中判断图像是否创建成功或者图像是否打开成功。如果是创建一个新的裁剪区域,在画布上绘制图像。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 45 7.3.4 播放动画框架开发MIDP的程序员经常会在一个MIDlet上显示动画。MIDP1.0没有直接提供对动画的支持(正在开发中的MIDP2.0支持),但真要是自己去实现,其实也并非是一件很难的事。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 46 任何动画的最基本的前提,是要在足够快的时间内显示和更换一张张的图片,让人的眼睛看到动的画面效果。图片必须按照顺序画出来。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 47 从一张图片到下一张图片之间的变化越小,效果会越好。首先要做的,是使用你的图片处理软件(比如Photoshop或者Firework)创建一系列相同大小的图片来组成动画。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 48 每张图片代表动画一帧。你需要制作一定数量的帧越多的帧会让你的动画看上去越平滑。制作好的图片一定要保存成PNG格式。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 49 有两个办法让你刚做好的图片在MIDlet上变成动画。第一,把图片都放到一个Web服务器上,让MIDlet下载他们,MIDP内置的HTTP支持。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 50 第二个办法更简单,把图片用MIDlet打包成JAR文件。如果你使用的是J2ME开发工具,把PNG文件放到你的项目文件里面就可以了。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 51 动画的过程其实更像账本记录:显示当前帧,然后适当地更换到下一帧。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 527.4 手机游戏2D动画开发 7.4.1 MIDP 2.0 2D游戏开发MIDP2.0相对于1.0来说,最大的变化就是新添加了用于支持游戏的API,它们被放在javax.microedition.lcdui.game包中。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 53 游戏API包提供了一系列针对无线设备的游戏开发类。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 54 由于无线设备仅有有限的计算能力,因此许多API的目的在于提高Java游戏的性能,并且把原来很多需要手动编写的代码如屏幕双缓冲、图像剪裁等都交给API间接调用本地代码来实现。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 55 各厂家有相当大的自由来优化它们。游戏API使用了MIDP的低级图形类接口(Graphics,Image等)。整个游戏包仅有5个Class。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 56 1GameCanvas 2Layer 3LayerManager 4Sprite 5TiledLayer2019 年5 月8 日感谢你的观看 兰州石化学院 Page 57 7.4.2 GameCanvas的使用GameCanvas类提供了基本的游戏用户接口。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 58 除了从Canvas继承下来的特性(命令,输入事件等)以外,它还提供了专门针对游戏的功能,如后备屏幕缓冲和键盘状态查询的能力。每个GameCanvas实例都会有一个唯一的缓冲区。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 59 1绘图 2键盘2019 年5 月8 日感谢你的观看 兰州石化学院 Page 60 7.4.3 Sprite的使用Sprite是一个基本的可视元素,可以用存储在图像中的一帧或多帧来渲染它;轮流显示不同的帧可以令Sprite实现动画。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 61 翻转、旋转等几种变换方式也能应用于Sprite使其外观改变。作为Layer子类,Sprite的位置可以改变,并且还能设置其可视与否。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 62 1Sprite 帧用于渲染Sprite的原始帧由一个单独的Image对象提供,此Image可以是可变的,也可以是不可变的。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 63 图7-4 帧的分解2019 年5 月8 日感谢你的观看 兰州石化学院 Page 64 2帧序列Sprite的帧序列定义了帧以什么样的顺序来显示。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 65 图7-5 帧的序列 2019 年5 月8 日感谢你的观看 兰州石化学院 Page 66 图7-6 帧的特定序列 2019 年5 月8 日感谢你的观看 兰州石化学院 Page 67 图7-7 更新显示2019 年5 月8 日感谢你的观看 兰州石化学院 Page 68 3Reference Pixel作为Layer的一个子类,Sprite继承了很多方法来设置和获取位置,如setPosition(x,y),getX()和getY()。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 69 4Sprite 的变换几种变换可应用于Sprite。可用的变换包括旋转几个90度加上镜像(沿垂直轴)。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 70 图7-8 Reference Pixel2019 年5 月8 日感谢你的观看 兰州石化学院 Page 71 图7-9 参考像素点被定位在树枝末端2019 年5 月8 日感谢你的观看 兰州石化学院 Page 72 图7-10 Sprite的变换 2019 年5 月8 日感谢你的观看 兰州石化学院 Page 73 图7-11 90度旋转的变换2019 年5 月8 日感谢你的观看 兰州石化学院 Page 74 7.4.4 碰撞检测Sprite非常适合移动的物体,如游戏主角、敌人等,在游戏中,可以使用Sprite提供的碰撞检测功能来简化游戏逻辑。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 75 Sprite的碰撞检测可以分两种:一种是矩形碰撞检测,另一种是像素碰撞检测。游戏中Sprite的大小往往是用包围它的矩形的大小来表示的,如在图7-12中的飞机和导弹并没有发生碰撞但检查的结果却发生了碰撞。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 76 图7-12 矩形碰撞检测 2019 年5 月8 日感谢你的观看 兰州石化学院 Page 77 对于像素碰撞检测,往往把Sprite的背景色设置为相同的颜色,碰撞检查的时候就只判断两个图片除背景色以外的其他像素是否发生了重叠。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 78 像素碰撞检测比较精确,但计算复杂,一般没有特殊要求都使用矩形碰撞检测。下面的例子两个矩形发生了碰撞但飞机和导弹并没有发生碰撞,如图7-13所示。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 79 图7-13 像素碰撞检测2019 年5 月8 日感谢你的观看 兰州石化学院 Page 80 要判断两个Sprite是否碰撞,或者与其他Layer是否碰撞,可以使用collidesWith()方法。CollidesWith()共有三种形式:2019 年5 月8 日感谢你的观看 兰州石化学院 Page 81(1)publicfinalbooleancollidesWith(Sprites,BooleanpixelLevel)2019 年5 月8 日感谢你的观看 兰州石化学院 Page 82(2)publicfinalbooleancollidesWith(TitledLayert,BooleanpixelLevel)2019 年5 月8 日感谢你的观看 兰州石化学院 Page 83(3)publicfinalbooleancollidesWith(Imageimage,intx,inty,BooleanpixelLevel)2019 年5 月8 日感谢你的观看 兰州石化学院 Page 84 7.4.5 Layer的使用Layer是一个抽象类,表示游戏中的一个可视元素。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 85 1TiledLayerTiledLayer由一系列单元格组成,单元格可被一组贴图填充。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 86 图7-14 TiledLayer2019 年5 月8 日感谢你的观看 兰州石化学院 Page 87 每个贴图都被赋予一个唯一的索引号。除了静态贴图外,开发者同样能够定义一系列动态贴图(animatedtiles)。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 88 动态贴图允许开发者能非常容易地改变一组单元格的外观。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 89 图7-15 TiledLayer背景2019 年5 月8 日感谢你的观看 兰州石化学院 Page 90 图7-16 TiledLayer动态贴图2019 年5 月8 日感谢你的观看 兰州石化学院 Page 91 2LayerManagerLayerManager管理一系列的Layer。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 92 可视窗口(viewwindow)控制着可视区域及其在LayerManager的坐标系统中的位置。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 93 图7-17 相对原点2019 年5 月8 日感谢你的观看 兰州石化学院 Page 94 paint(Graphics,int,int)方法包含一个(x,y)坐标,控制可视窗口在屏幕中的显示位置。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 95 图7-18 控制可视窗口显示位置2019 年5 月8 日感谢你的观看 兰州石化学院 Page 96 为了添加一个Layer,使用append()方法向这个LayerManager添加一个Layer。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 977.5 手机音效开发现在能播放音乐的手机已经是很常见的了,同时手机游戏也需要声音来增加动感效果,所以手机音效也成为了开发热点。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 98 J2ME针对多种媒体格式,提供了一套播放接口,那就是:MMAPI(MobileMediaAPI)。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 99 7.5.1 MMAPI体系结构现在多媒体的格式很多,要顺利地播放这些不同格式的音乐,一种比较好的方式就是把这些不同格式的数据都转换为统一的格式,然后统一使用一个播放器接口类来播放。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 100 在MMAPI中,首先从数据源(如一个文件、一个捕获装置或一个流式服务)上读取媒体数据内容后,然后传输给专门的处理程序进行处理。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 101 处理过程主要是由DataSource类和Player类完成。DataSource类的作用就是读取和转换多媒体数据,Player类的作用就是播放这类数据。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 102 然后提供一系列的播放、暂停、停止等播放器相关功能,DataSource类和Player类的工作过程如图7-19所示。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 103 图7-19 数据流图2019 年5 月8 日感谢你的观看 兰州石化学院 Page 104 7.5.2 Player接口要使用MMAPI进行音效开发,首先需要导入相关的开发包,例如:importjavax.microedition.media.*2019 年5 月8 日感谢你的观看 兰州石化学院 Page 105 创建一个Player对象有3种不同的方式,也就是用Manager类的不同构造方法,Manager类一共有三个构造方。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 106(1)PublicstaticPlayercreatePlayer(java.lang.stringlocator)throwsjava.io.IOException,MediaException2019 年5 月8 日感谢你的观看 兰州石化学院 Page 107(2)PublicstaticPlayercreatePlayer(DataSourcesource)throwsjava.io.IOException,MediaException2019 年5 月8 日感谢你的观看 兰州石化学院 Page 108(3)PublicstaticPlayercreatePlayer(java.io.InputStreamstream,java.lang.Stringtrpe)throwsjava.io.IOException,MediaException2019 年5 月8 日感谢你的观看 兰州石化学院 Page 109 这三个方法分别可以读取指定路径的数据源或者DataSource和InpurStream类型的数据源,分别返回一个Player,当一个Player对象被创建以后,使用Player接口的start()方法就会尽可能快地启动数据的播放,当数据播放完毕以后,Player会自动关闭。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 110 1UNREALIZED 状态 2REALIZED状态 3PREFETCHED状态 4STARTED状态 5CLOSED状态2019 年5 月8 日感谢你的观看 兰州石化学院 Page 111 图7-20 状态转换图2019 年5 月8 日感谢你的观看 兰州石化学院 Page 112 7.5.3 播放简单音调声音的高低叫音调,也就是音符的频率,J2ME提供了对简单音调播放的支持,MMAPI提供了一个Manager.playTone()方法来播放音调。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 113 使用Manager.playTone(),需要指定三个参数:音符、播放时间和声音的大小。例如下面的代码播放了一个C4的音调,C4音调是由ToneControl类的常量C4指定的。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 114 7.5.4 播放歌曲使用MMAPI播放歌曲很简单,主要是用Player的createPlayer构造方法,只要指定网络地址,Player就会自动的下载歌曲并播放,具体构造方法如下。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 115 publicstaticPlayercreatePlayer(Stringlocator)throwsIOException,MediaException2019 年5 月8 日感谢你的观看 兰州石化学院 Page 116 为了很好地控制歌曲的播放状态,需要MIDlet程序实现一个PlayerListener接口,同时实现该接口中的playerUpdate()方法。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 117 publicvoidplayerUpdate(Playerplayer,Stringevent,ObjecteventDate)2019 年5 月8 日感谢你的观看 兰州石化学院 Page 118 在playerUpdate方法里可以判断播放的状态,例如判断播放是否结束可以用PlayerListener.END_OF_MEDIA进行判断。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 119 publicvoidplayerUpdate(Playerplayer,Stringevent,ObjecteventDate)if(event=PlayerListener.END_OF_MEDIA)2019 年5 月8 日感谢你的观看 兰州石化学院 Page 120 为了提高播放效率,又不影响其他程序的运行,可以使用线程,只要实现Runnable接口即可。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 121 如果想在播放过程中,对播放进行暂停或者停止等操作,都要对播放器的各种状态进行判断,2019 年5 月8 日感谢你的观看 兰州石化学院 Page 122 图7-21 播放网络资源2019 年5 月8 日感谢你的观看 兰州石化学院 Page 123 7.5.5 控制音量音量的控制可以使用VolumeControl控件接口,它允许设置音量的变化范围是从0100,其中0表示静音。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 124 VolumeControl控件接口的使用很简单,使用getLevel()方法得到当前的音量级别,也可以使用setLevel()方法设置音量级别,静音使用setMute()方法来设置,要判断是否静音可以使用isMute()方法。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 125 具体获得一个VolumeControl控件的代码如下:VolumeControlvolume=(VolumeControl)player.getControl(VolumeControl);volume.setLevel(VOLUME_LEVEL);2019 年5 月8 日感谢你的观看 兰州石化学院 Page 1267.6 综合示例:飞机碰撞本例子是在背景为星空的屏幕上显示两架飞机,通过手机的键盘可以控制飞机的相对位置,当两架飞机碰撞的时候可以显示爆炸。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 127 同时播放爆炸的声音。本例用到了前面学习过的动画和音效开发的知识。由于飞机的碰撞除了背景还有两个飞机和一个爆炸图层,所以使用了一个LayerManager类来管理多个图层,这样能很方便的使用碰撞方法。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 128 碰撞的检测很简单,可以使用collidesWith()方法,如果碰撞该方法返回true。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 129 Spriteplane1,plane2;/使用像素碰撞检测,如果碰撞该方法返回trueBooleancollide=plane1.collidesWith(plane2);2019 年5 月8 日感谢你的观看 兰州石化学院 Page 130 当发生碰撞时,把两个飞机设置为不可见,把爆炸的图片显示出来,这样就构成了爆炸的场景。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 131 为了具有声音效果,要有一个用来播放音乐的类PlayMusic,在这个类里完成读取和播放音乐文件的功能。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 132 图7-22 执行效果图2019 年5 月8 日感谢你的观看 兰州石化学院 Page 1337.7 小 结本章的内容很多,主要介绍了PNG格式图像的由来,详细介绍了PNG格式图像的特性和压缩处理。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 134 针对手机的特点,详细的给读者介绍了如何在手机游戏中使用PNG格式图像,由于游戏菜单是游戏的一个必须部分,最后使用范例介绍了游戏菜单的制作。2019 年5 月8 日感谢你的观看 兰州石化学院 Page 135 及在J2ME中如何实现动画,由于在J2ME中实现动画要涉及多线程技术,所以详细介绍了Java中的线程技术,双缓存技术以及图片的裁剪技术,让读者掌握什么是线程及怎样使用多线程实现动画。2019 年5 月8 日2019 年5 月8 日感谢你的观看 兰州石化学院 Page 137 最后提供了一个播放动画程序框架。让读者对实现动画有一个完整的概念和理解。在最后介绍了手机音效的开发,介绍了如何播放简单音调和歌曲及音量的控制。2019 年5 月8 日