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