版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019-7-13谢谢欣赏兰州石化学院Page1
第7章手机游戏开发2019-7-13谢谢欣赏兰州石化学院Page2
游戏是策划、美工和程序三者的协调及创意和商业运作的平衡。集美术、音乐、动画、人工智能等元素于一身。2019-7-13谢谢欣赏兰州石化学院Page3
目前支持Java的手机性能越来越强大,同时,手机的价格在不断地下降,因此,手机游戏的市场前景将是非常良好的。本章将从图片的处理、动画的制作和音效的实现来学习手机游戏开发的基础知识。2019-7-13谢谢欣赏兰州石化学院Page4
手机游戏开发简介7.1PNG图像格式介绍7.2游戏设计中的动画7.3手机游戏2D动画开发7.42019-7-13谢谢欣赏兰州石化学院Page5
手机音效开发7.5综合示例:飞机碰撞7.6小结7.72019-7-13谢谢欣赏兰州石化学院Page67.1手机游戏开发简介
现在的移动电话可以看作小型的计算机,只是它的处理能力与PC相比很有限,但是足够运行一个小型的游戏。2019-7-13谢谢欣赏兰州石化学院Page7
另一个特性就是它们还是网络计算机,能够高速发送和接收数字数据。除了语音数据以外,它们还可以发送和接收其他类型的数据。2019-7-13谢谢欣赏兰州石化学院Page8
所以类似《传奇》、《千年》这样的网络游戏将来也可以在手机上实现。2019-7-13谢谢欣赏兰州石化学院Page9
但是与PC相比,它们的输入和显示功能也很有限。手机的屏幕都较小,其对声音处理能力也很有限。2019-7-13谢谢欣赏兰州石化学院Page10
开发者在这样的平台上开发应用,必须认真的考虑这些特点。本节将重点讨论手机本身的特点和手机游戏开发的特点。2019-7-13谢谢欣赏兰州石化学院Page11
7.1.1手机游戏的类型
1.嵌入式游戏
2.短信息服务游戏
3.WAP浏览器游戏2019-7-13谢谢欣赏兰州石化学院Page12
图7-1WAP游戏的工作原理图2019-7-13谢谢欣赏兰州石化学院Page13
7.1.2手机游戏开发特点
1.庞大的潜在用户群
2.便携性
3.屏幕小2019-7-13谢谢欣赏兰州石化学院Page14
4.有限的颜色和声音支持
5.应用程序大小限制
6.高等待时间
7.可中断性是关键2019-7-13谢谢欣赏兰州石化学院Page15
7.1.3扬长避短的手机游戏开发
1.缩短每回合的游戏时间
2.合理处理等待时间2019-7-13谢谢欣赏兰州石化学院Page167.2PNG图像格式介绍7.2.1PNG的由来
PNG全名PortableNetworkGraphics,字面意思是“可移植性网络用图形”,从这简单几个字已经明白定义了PNG的用途以及主要发展方向。2019-7-13谢谢欣赏兰州石化学院Page17
1996年,PNGGroup向W3C(WorldWideWebConsortium)提出一种多媒体图形格式,重点在于改进现有JPG跟GIF的缺点,并且提供更多新的概念与压缩模式,在提出后得到W3C的认可与推荐。2019-7-13谢谢欣赏兰州石化学院Page18
在1996年10月1号,W3C正式发函公告,推荐PNG为最佳的图形格式,并且以“PNGDeliversHigherQualityGraphicsforWebPageDesign”的文字作为该文件的标头。2019-7-13谢谢欣赏兰州石化学院Page19
7.2.2PNG的图档格式特性
PNG保留了大部分GIF的特性,PNG的压缩率很高,尤其是图表型的图片2019-7-13谢谢欣赏兰州石化学院Page20
7.2.3PNG格式图像的压缩及处理
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNGfilesignature)域和按照特定结构组织的3个以上的数据块(chunk)组成。2019-7-13谢谢欣赏兰州石化学院Page21
PNG定义了两种类型的数据块,一种是称为关键数据块(criticalchunk),这是标准的数据块,另一种叫做辅助数据块(ancillarychunks),这是可选的数据块。2019-7-13谢谢欣赏兰州石化学院Page22
7.2.4使用PNG图片在MIDP具体实现中,Images可以是可变的也可以是不可变的。2019-7-13谢谢欣赏兰州石化学院Page23
不可变的Image可以从二进制图像文件创建,如果要用二进制图像数据来创建Image,这些数据必须是设备支持的格式。2019-7-13谢谢欣赏兰州石化学院Page24
有的设备可能会支持额外的一些格式,不过所有设备都必须支持PNG格式。在手机中使用PNG图片,必须先把图片加载到内存,并且实例化成为一个Image对象。2019-7-13谢谢欣赏兰州石化学院Page25
Image对象的构造方法如下:publicstaticImagecreateImage(Stringname)2019-7-13谢谢欣赏兰州石化学院Page26
图7-2旋转的“X”2019-7-13谢谢欣赏兰州石化学院Page27
7.2.5游戏菜单制作当玩家在菜单项中选择了某选项后,系统给玩家返回的界面应该不同。2019-7-13谢谢欣赏兰州石化学院Page28
下例菜单选项包括:新游戏、高分榜、帮助和退出。其他屏幕包括:游戏中的界面、查看高分榜的界面、查看帮助的界面。2019-7-13谢谢欣赏兰州石化学院Page29
图7-3游戏的菜单界面2019-7-13谢谢欣赏兰州石化学院Page307.3游戏设计中的动画7.3.1动画基础
1.什么是动画动画是通过连续播放一系列画面,给人的视觉造成连续变化的图画。2019-7-13谢谢欣赏兰州石化学院Page31
2.动画制作应注意的问题
(1)速度的处理(2)循环动画(3)夸张与拟人2019-7-13谢谢欣赏兰州石化学院Page32
7.3.2双缓冲技术双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。2019-7-13谢谢欣赏兰州石化学院Page33
造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它。解决办法就是在内存中开辟一片区域作为后台画面,程序对它更新、修改,完成后再显示它。2019-7-13谢谢欣赏兰州石化学院Page34
这样被显示的图像永远是已经完全画好的图像,程序修改的将不是正在被显示的图像。当然还有其他方法可以解决屏幕闪烁问题,但使用双缓冲技术是一种值得推荐的解决方案。2019-7-13谢谢欣赏兰州石化学院Page35
双缓冲思想体现在程序上就是要依次完成以下几步工作。2019-7-13谢谢欣赏兰州石化学院Page36
(1)定义一个Graphics对象bg和一个Image对象buf,按屏幕大小建立一个缓冲对象附给buf,然后取得buf的Graphics对象附给bg。2019-7-13谢谢欣赏兰州石化学院Page37
(2)在bg(缓冲屏幕)上用drawImage()和drawString等语句画图,相当于在缓冲屏幕上画图。2019-7-13谢谢欣赏兰州石化学院Page38
(3)调用repaint()语句,它的功能是告知系统调用paint()来完成真实屏幕的显示。2019-7-13谢谢欣赏兰州石化学院Page39
(4)在paint(Graphicsg)方法里,将buf(缓冲屏幕上的图片)画到真实屏幕上。2019-7-13谢谢欣赏兰州石化学院Page40
7.3.3图片的裁剪我们可以通过设定裁剪的区域来显示图片的一个片断,使用前面讲的方法:
setClip()getClipX()getClipY()getClipWidth()getClipHeight()2019-7-13谢谢欣赏兰州石化学院Page41
创建裁剪区域的步骤如下。(1)声明类的引用。(2)创建类的实例,并赋值给这些类引用。(3)当程序开始时,显示Canvas类的实例。2019-7-13谢谢欣赏兰州石化学院Page42
(4)当Exit时,终止MIDlet。(5)定义Canvas的派生类,并实现CommandListener。2019-7-13谢谢欣赏兰州石化学院Page43
(6)请求保存图片所需的足够内存块。如果使用动态图像,就创建图像。否则确定图像包含什么静态图片文件名。2019-7-13谢谢欣赏兰州石化学院Page44
(7)从Paint()方法中判断图像是否创建成功或者图像是否打开成功。如果是创建一个新的裁剪区域,在画布上绘制图像。2019-7-13谢谢欣赏兰州石化学院Page45
7.3.4播放动画框架开发MIDP的程序员经常会在一个MIDlet上显示动画。MIDP1.0没有直接提供对动画的支持(正在开发中的MIDP2.0支持),但真要是自己去实现,其实也并非是一件很难的事。2019-7-13谢谢欣赏兰州石化学院Page46
任何动画的最基本的前提,是要在足够快的时间内显示和更换一张张的图片,让人的眼睛看到动的画面效果。图片必须按照顺序画出来。2019-7-13谢谢欣赏兰州石化学院Page47
从一张图片到下一张图片之间的变化越小,效果会越好。首先要做的,是使用你的图片处理软件(比如Photoshop或者Firework)创建一系列相同大小的图片来组成动画。2019-7-13谢谢欣赏兰州石化学院Page48
每张图片代表动画一帧。你需要制作一定数量的帧——越多的帧会让你的动画看上去越平滑。制作好的图片一定要保存成PNG格式。2019-7-13谢谢欣赏兰州石化学院Page49
有两个办法让你刚做好的图片在MIDlet上变成动画。第一,把图片都放到一个Web服务器上,让MIDlet下载他们,MIDP内置的HTTP支持。2019-7-13谢谢欣赏兰州石化学院Page50
第二个办法更简单,把图片用MIDlet打包成JAR文件。如果你使用的是J2ME开发工具,把PNG文件放到你的项目文件里面就可以了。2019-7-13谢谢欣赏兰州石化学院Page51
动画的过程其实更像账本记录:显示当前帧,然后适当地更换到下一帧。2019-7-13谢谢欣赏兰州石化学院Page527.4手机游戏2D动画开发
7.4.1MIDP2.02D游戏开发
MIDP2.0相对于1.0来说,最大的变化就是新添加了用于支持游戏的API,它们被放在javax.microedition.lcdui.game包中。2019-7-13谢谢欣赏兰州石化学院Page53
游戏API包提供了一系列针对无线设备的游戏开发类。2019-7-13谢谢欣赏兰州石化学院Page54
由于无线设备仅有有限的计算能力,因此许多API的目的在于提高Java游戏的性能,并且把原来很多需要手动编写的代码如屏幕双缓冲、图像剪裁等都交给API间接调用本地代码来实现。2019-7-13谢谢欣赏兰州石化学院Page55
各厂家有相当大的自由来优化它们。游戏API使用了MIDP的低级图形类接口(Graphics,Image等)。整个游戏包仅有5个Class。2019-7-13谢谢欣赏兰州石化学院Page56
1.GameCanvas2.Layer3.LayerManager4.Sprite5.TiledLayer2019-7-13谢谢欣赏兰州石化学院Page57
7.4.2GameCanvas的使用
GameCanvas类提供了基本的游戏用户接口。2019-7-13谢谢欣赏兰州石化学院Page58
除了从Canvas继承下来的特性(命令,输入事件等)以外,它还提供了专门针对游戏的功能,如后备屏幕缓冲和键盘状态查询的能力。每个GameCanvas实例都会有一个唯一的缓冲区。2019-7-13谢谢欣赏兰州石化学院Page59
1.绘图
2.键盘2019-7-13谢谢欣赏兰州石化学院Page60
7.4.3Sprite的使用
Sprite是一个基本的可视元素,可以用存储在图像中的一帧或多帧来渲染它;轮流显示不同的帧可以令Sprite实现动画。2019-7-13谢谢欣赏兰州石化学院Page61
翻转、旋转等几种变换方式也能应用于Sprite使其外观改变。作为Layer子类,Sprite的位置可以改变,并且还能设置其可视与否。2019-7-13谢谢欣赏兰州石化学院Page62
1.Sprite帧用于渲染Sprite的原始帧由一个单独的Image对象提供,此Image可以是可变的,也可以是不可变的。2019-7-13谢谢欣赏兰州石化学院Page63
图7-4帧的分解2019-7-13谢谢欣赏兰州石化学院Page64
2.帧序列
Sprite的帧序列定义了帧以什么样的顺序来显示。2019-7-13谢谢欣赏兰州石化学院Page65
图7-5帧的序列2019-7-13谢谢欣赏兰州石化学院Page66
图7-6帧的特定序列2019-7-13谢谢欣赏兰州石化学院Page67
图7-7更新显示2019-7-13谢谢欣赏兰州石化学院Page68
3.ReferencePixel
作为Layer的一个子类,Sprite继承了很多方法来设置和获取位置,如setPosition(x,y),getX()和getY()。2019-7-13谢谢欣赏兰州石化学院Page69
4.Sprite的变换几种变换可应用于Sprite。可用的变换包括旋转几个90度加上镜像(沿垂直轴)。2019-7-13谢谢欣赏兰州石化学院Page70
图7-8ReferencePixel2019-7-13谢谢欣赏兰州石化学院Page71
图7-9参考像素点被定位在树枝末端2019-7-13谢谢欣赏兰州石化学院Page72
图7-10Sprite的变换2019-7-13谢谢欣赏兰州石化学院Page73
图7-1190度旋转的变换2019-7-13谢谢欣赏兰州石化学院Page74
7.4.4碰撞检测
Sprite非常适合移动的物体,如游戏主角、敌人等,在游戏中,可以使用Sprite提供的碰撞检测功能来简化游戏逻辑。2019-7-13谢谢欣赏兰州石化学院Page75
Sprite的碰撞检测可以分两种:一种是矩形碰撞检测,另一种是像素碰撞检测。游戏中Sprite的大小往往是用包围它的矩形的大小来表示的,如在图7-12中的飞机和导弹并没有发生碰撞但检查的结果却发生了碰撞。2019-7-13谢谢欣赏兰州石化学院Page76
图7-12矩形碰撞检测2019-7-13谢谢欣赏兰州石化学院Page77
对于像素碰撞检测,往往把Sprite的背景色设置为相同的颜色,碰撞检查的时候就只判断两个图片除背景色以外的其他像素是否发生了重叠。2019-7-13谢谢欣赏兰州石化学院Page78
像素碰撞检测比较精确,但计算复杂,一般没有特殊要求都使用矩形碰撞检测。下面的例子两个矩形发生了碰撞但飞机和导弹并没有发生碰撞,如图7-13所示。2019-7-13谢谢欣赏兰州石化学院Page79
图7-13像素碰撞检测2019-7-13谢谢欣赏兰州石化学院Page80
要判断两个Sprite是否碰撞,或者与其他Layer是否碰撞,可以使用collidesWith()方法。CollidesWith()共有三种形式:2019-7-13谢谢欣赏兰州石化学院Page81
(1)publicfinalbooleancollidesWith(Sprites,BooleanpixelLevel)2019-7-13谢谢欣赏兰州石化学院Page82
(2)publicfinalbooleancollidesWith(TitledLayert,BooleanpixelLevel)2019-7-13谢谢欣赏兰州石化学院Page83
(3)publicfinalbooleancollidesWith(Imageimage,intx,inty,BooleanpixelLevel)2019-7-13谢谢欣赏兰州石化学院Page84
7.4.5Layer的使用
Layer是一个抽象类,表示游戏中的一个可视元素。2019-7-13谢谢欣赏兰州石化学院Page85
1.TiledLayerTiledLayer由一系列单元格组成,单元格可被一组贴图填充。2019-7-13谢谢欣赏兰州石化学院Page86
图7-14TiledLayer2019-7-13谢谢欣赏兰州石化学院Page87
每个贴图都被赋予一个唯一的索引号。除了静态贴图外,开发者同样能够定义一系列动态贴图(animatedtiles)。2019-7-13谢谢欣赏兰州石化学院Page88
动态贴图允许开发者能非常容易地改变一组单元格的外观。2019-7-13谢谢欣赏兰州石化学院Page89
图7-15TiledLayer背景2019-7-13谢谢欣赏兰州石化学院Page90
图7-16TiledLayer动态贴图2019-7-13谢谢欣赏兰州石化学院Page91
2.LayerManagerLayerManager管理一系列的Layer。2019-7-13谢谢欣赏兰州石化学院Page92
可视窗口(viewwindow)控制着可视区域及其在LayerManager的坐标系统中的位置。2019-7-13谢谢欣赏兰州石化学院Page93
图7-17相对原点2019-7-13谢谢欣赏兰州石化学院Page94
paint(Graphics,int,int)方法包含一个(x,y)坐标,控制可视窗口在屏幕中的显示位置。2019-7-13谢谢欣赏兰州石化学院Page95
图7-18控制可视窗口显示位置2019-7-13谢谢欣赏兰州石化学院Page96
为了添加一个Layer,使用append()方法向这个LayerManager添加一个Layer。2019-7-13谢谢欣赏兰州石化学院Page977.5手机音效开发
现在能播放音乐的手机已经是很常见的了,同时手机游戏也需要声音来增加动感效果,所以手机音效也成为了开发热点。2019-7-13谢谢欣赏兰州石化学院Page98
J2ME针对多种媒体格式,提供了一套播放接口,那就是:MMAPI(MobileMediaAPI)。2019-7-13谢谢欣赏兰州石化学院Page99
7.5.1MMAPI体系结构现在多媒体的格式很多,要顺利地播放这些不同格式的音乐,一种比较好的方式就是把这些不同格式的数据都转换为统一的格式,然后统一使用一个播放器接口类来播放。2019-7-13谢谢欣赏兰州石化学院Page100
在MMAPI中,首先从数据源(如一个文件、一个捕获装置或一个流式服务)上读取媒体数据内容后,然后传输给专门的处理程序进行处理。2019-7-13谢谢欣赏兰州石化学院Page101
处理过程主要是由DataSource类和Player类完成。DataSource类的作用就是读取和转换多媒体数据,Player类的作用就是播放这类数据。2019-7-13谢谢欣赏兰州石化学院Page102
然后提供一系列的播放、暂停、停止等播放器相关功能,DataSource类和Player类的工作过程如图7-19所示。2019-7-13谢谢欣赏兰州石化学院Page103
图7-19数据流图2019-7-13谢谢欣赏兰州石化学院Page104
7.5.2Player接口要使用MMAPI进行音效开发,首先需要导入相关的开发包,例如:
importjavax.microedition.media.*2019-7-13谢谢欣赏兰州石化学院Page105
创建一个Player对象有3种不同的方式,也就是用Manager类的不同构造方法,Manager类一共有三个构造方。2019-7-13谢谢欣赏兰州石化学院Page106
(1)PublicstaticPlayercreatePlayer(java.lang.stringlocator)throwsjava.io.IOException,MediaException2019-7-13谢谢欣赏兰州石化学院Page107
(2)PublicstaticPlayercreatePlayer(DataSourcesource)throwsjava.io.IOException,MediaException2019-7-13谢谢欣赏兰州石化学院Page108
(3)
PublicstaticPlayercreatePlayer(java.io.InputStreamstream,java..lang.Stringtrpe)throwsjava.io.IOException,MediaException2019-7-13谢谢欣赏兰州石化学院Page109
这三个方法分别可以读取指定路径的数据源或者DataSource和InpurStream类型的数据源,分别返回一个Player,当一个Player对象被创建以后,使用Player接口的start()方法就会尽可能快地启动数据的播放,当数据播放完毕以后,Player会自动关闭。2019-7-13谢谢欣赏兰州石化学院Page110
1.UNREALIZED状态
2.REALIZED状态
3.PREFETCHED状态
4.STARTED状态
5.CLOSED状态2019-7-13谢谢欣赏兰州石化学院Page111
图7-20状态转换图2019-7-13谢谢欣赏兰州石化学院Page112
7.5.3播放简单音调声音的高低叫音调,也就是音符的频率,J2ME提供了对简单音调播放的支持,MMAPI提供了一个Manager.playTone()方法来播放音调。2019-7-13谢谢欣赏兰州石化学院Page113
使用Manager.playTone(),需要指定三个参数:音符、播放时间和声音的大小。例如下面的代码播放了一个C4的音调,C4音调是由ToneControl类的常量C4指定的。2019-7-13谢谢欣赏兰州石化学院Page114
7.5.4播放歌曲使用MMAPI播放歌曲很简单,主要是用Player的createPlayer构造方法,只要指定网络地址,Player就会自动的下载歌曲并播放,具体构造方法如下。2019-7-13谢谢欣赏兰州石化学院Page115
publicstaticPlayercreatePlayer(Stringlocator)throwsIOException,MediaException2019-7-13谢谢欣赏兰州石化学院Page116
为了很好地控制歌曲的播放状态,需要MIDlet程序实现一个PlayerListener接口,同时实现该接口中的playerUpdate()方法。2019-7-13谢谢欣赏兰州石化学院Page117
publicvoidplayerUpdate(Playerplayer,Stringevent,ObjecteventDate)2019-7-13谢谢欣赏兰州石化学院Page118
在playerUpdate方法里可以判断播放的状态,例如判断播放是否结束可以用PlayerListener.END_OF_MEDIA进行判断。2019-7-13谢谢欣赏兰州石化学院Page119
publicvoidplayerUpdate(Playerplayer,Stringevent,ObjecteventDate){if(event==PlayerListener.END_OF_MEDIA){
……}}2019-7-13谢谢欣赏兰州石化学院Page120
为了提高播放效率,又不影响其他程序的运行,可以使用线程,只要实现Runnable接口即可。2019-7-13谢谢欣赏兰州石化学院Page121
如果想在播放过程中,对播放进行暂停或者停止等操作,都要对播放器的各种状态进行判断,2019-7-13谢谢欣赏兰州石化学院Page122
图7-21播放网络资源2019-7-13谢谢欣赏兰州石化学院Page123
7.5.5控制音量音量的控制可以使用VolumeControl控件接口,它允许设置音量的变化范围是从0~100,其中0表示静音。2019-7-13谢谢欣赏兰州石化学院Page124
VolumeControl控件接口的使用很简单,使用getLevel()方法得到当前的音量级别,也可以使用setLevel()方法设置音量级别,静音
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论