J2ME_第七节-手机游戏开发

上传人:da****ge 文档编号:242865366 上传时间:2024-09-10 格式:PPT 页数:136 大小:2.12MB
返回 下载 相关 举报
J2ME_第七节-手机游戏开发_第1页
第1页 / 共136页
J2ME_第七节-手机游戏开发_第2页
第2页 / 共136页
J2ME_第七节-手机游戏开发_第3页
第3页 / 共136页
点击查看更多>>
资源描述
Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,第,7,章 手机游戏开发,游戏是策划、美工和程序三者的协调及创意和商业运作的平衡。集美术、音乐、动画、人工智能等元素于一身。,目前支持,Java,的手机性能越来越强大,同时,手机的价格在不断地下降,因此,手机游戏的市场前景将是非常良好的。本章将从图片的处理、动画的制作和音效的实现来学习手机游戏开发的基础知识。,手机游戏开发简介,7.1,PNG,图像格式介绍,7.2,游戏设计中的动画,7.3,手机游戏,2D,动画开发,7.4,手机音效开发,7.5,综合示例:飞机碰撞,7.6,小结,7.7,7.1,手机游戏开发简介,现在的移动电话可以看作小型的计算机,只是它的处理能力与,PC,相比很有限,但是足够运行一个小型的游戏。,另一个特性就是它们还是网络计算机,能够高速发送和接收数字数据。 除了语音数据以外,它们还可以发送和接收其他类型的数据。,所以类似,传奇,、,千年,这样的网络游戏将来也可以在手机上实现。,但是与,PC,相比,它们的输入和显示功能也很有限。手机的屏幕都较小,其对声音处理能力也很有限。,开发者在这样的平台上开发应用,必须认真的考虑这些特点。本节将重点讨论手机本身的特点和手机游戏开发的特点。,7.1.1,手机游戏的类型,1,嵌入式游戏,2,短信息服务游戏,3,WAP,浏览器游戏,图,7-1 WAP,游戏的工作原理图,7.1.2,手机游戏开发特点,1,庞大的潜在用户群,2,便携性,3,屏幕小,4,有限的颜色和声音支持,5,应用程序大小限制,6,高等待时间,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,为最佳的图形格式,并且以“,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,),这是标准的数据块,另一种叫做辅助数据块(,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,游戏菜单制作,当玩家在菜单项中选择了某选项后,系统给玩家返回的界面应该不同。,下例菜单选项包括:新游戏、高分榜、帮助和退出。其他屏幕包括:游戏中的界面、查看高分榜的界面、查看帮助的界面。,图,7-3,游戏的菜单界面,7.3,游戏设计中的动画,7.3.1,动画基础,1,什么是动画,动画是通过连续播放一系列画面,给人的视觉造成连续变化的图画。,2,动画制作应注意的问题,(,1,)速度的处理,(,2,)循环动画,(,3,)夸张与拟人,7.3.2,双缓冲技术,双缓冲技术是编写,J2ME,游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。,造成屏幕闪烁的主要原因在于,画面在显示的同时,程序又在改变它。解决办法就是在内存中开辟一片区域作为后台画面,程序对它更新、修改,完成后再显示它。,这样被显示的图像永远是已经完全画好的图像,程序修改的将不是正在被显示的图像。当然还有其他方法可以解决屏幕闪烁问题,但使用双缓冲技术是一种值得推荐的解决方案。,双缓冲思想体现在程序上就是要依次完成以下几步工作。,(,1,)定义一个,Graphics,对象,bg,和一个,Image,对象,buf,,按屏幕大小建立一个缓冲对象附给,buf,,然后取得,buf,的,Graphics,对象附给,bg,。,(,2,)在,bg,(缓冲屏幕)上用,drawImage,(),和,drawString,等语句画图,相当于在缓冲屏幕上画图。,(,3,)调用,repaint(),语句,它的功能是告知系统调用,paint(),来完成真实屏幕的显示。,(,4,)在,paint(Graphics,g),方法里,将,buf,(缓冲屏幕上的图片)画到真实屏幕上。,7.3.3,图片的裁剪,我们可以通过设定裁剪的区域来显示图片的一个片断,使用前面讲的方法:,setClip,(),getClipX,(),getClipY,(),getClipWidth,(),getClipHeight,(),创建裁剪区域的步骤如下。,(,1,)声明类的引用。,(,2,)创建类的实例,并赋值给这些类引用。,(,3,)当程序开始时,显示,Canvas,类的实例。,(,4,)当,Exit,时,终止,MIDlet,。,(,5,)定义,Canvas,的派生类,并实现,CommandListener,。,(,6,)请求保存图片所需的足够内存块。如果使用动态图像,就创建图像。否则确定图像包含什么静态图片文件名。,(,7,)从,Paint(),方法中判断图像是否创建成功或者图像是否打开成功。如果是创建一个新的裁剪区域,在画布上绘制图像。,7.3.4,播放动画框架,开发,MIDP,的程序员经常会在一个,MIDlet,上显示动画。,MIDP 1.0,没有直接提供对动画的支持(正在开发中的,MIDP 2.0,支持),但真要是自己去实现,其实也并非是一件很难的事。,任何动画的最基本的前提,是要在足够快的时间内显示和更换一张张的图片,让人的眼睛看到动的画面效果。图片必须按照顺序画出来。,从一张图片到下一张图片之间的变化越小,效果会越好。首先要做的,是使用你的图片处理软件(比如,Photoshop,或者,Firework,)创建一系列相同大小的图片来组成动画。,每张图片代表动画一帧。你需要制作一定数量的帧,越多的帧会让你的动画看上去越平滑。制作好的图片一定要保存成,PNG,格式。,有两个办法让你刚做好的图片在,MIDlet,上变成动画。第一,把图片都放到一个,Web,服务器上,让,MIDlet,下载他们,,MIDP,内置的,HTTP,支持。,第二个办法更简单,把图片用,MIDlet,打包成,JAR,文件。如果你使用的是,J2ME,开发工具,把,PNG,文件放到你的项目文件里面就可以了。,动画的过程其实更像账本记录:显示当前帧,然后适当地更换到下一帧。,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,等)。整个游戏包仅有,5,个,Class,。,1,GameCanvas,2,Layer,3,LayerManager,4,Sprite,5,TiledLayer,7.4.2,GameCanvas,的使用,GameCanvas,类提供了基本的游戏用户接口。,除了从,Canvas,继承下来的特性(命令,输入事件等)以外,它还提供了专门针对游戏的功能,如后备屏幕缓冲和键盘状态查询的能力。每个,GameCanvas,实例都会有一个唯一的缓冲区。,1,绘图,2,键盘,7.4.3 Sprite,的使用,Sprite,是一个基本的可视元素,可以用存储在图像中的一帧或多帧来渲染它;轮流显示不同的帧可以令,Sprite,实现动画。,翻转、旋转等几种变换方式也能应用于,Sprite,使其外观改变。作为,Layer,子类,,Sprite,的位置可以改变,并且还能设置其可视与否。,1,Sprite,帧,用于渲染,Sprite,的原始帧由一个单独的,Image,对象提供,此,Image,可以是可变的,也可以是不可变的。,图,7-4,帧的分解,2,帧序列,Sprite,的帧序列定义了帧以什么样的顺序来显示。,图,7-5,帧的序列,图,7-6,帧的特定序列,图,7-7,更新显示,3,Reference Pixel,作为,Layer,的一个子类,,Sprite,继承了很多方法来设置和获取位置,如,setPosition(x,y,),,,getX,(),和,getY,(),。,4,Sprite,的变换,几种变换可应用于,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,矩形碰撞检测,对于像素碰撞检测,往往把,Sprite,的背景色设置为相同的颜色,碰撞检查的时候就只判断两个图片除背景色以外的其他像素是否发生了重叠。,像素碰撞检测比较精确,但计算复杂,一般没有特殊要求都使用矩形碰撞检测。下面的例子两个矩形发生了碰撞但飞机和导弹并没有发生碰撞,如图,7-13,所示。,图,7-13,像素碰撞检测,要判断两个,Sprite,是否碰撞,或者与其他,Layer,是否碰撞,可以使用,collidesWith,(),方法。,CollidesWith,(),共有三种形式:,(,1,),public final,boolean,collidesWith(Sprite,s,Boolean,pixelLevel,),(,2,),public 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,是一个抽象类,表示游戏中的一个可视元素。,1,TiledLayer,TiledLayer,由一系列单元格组成,单元格可被一组贴图填充。,图,7-14,TiledLayer,每个贴图都被赋予一个唯一的索引号。,除了静态贴图外,开发者同样能够定义一系列动态贴图(,animated tiles,)。,动态贴图允许开发者能非常容易地改变一组单元格的外观。,图,7-15,TiledLayer,背景,图,7-16,TiledLayer,动态贴图,2,LayerManager,LayerManager,管理一系列的,Layer,。,可视窗口(,view window,)控制着可视区域及其在,LayerManager,的坐标系统中的位置。,图,7-17,相对原点,paint(Graphics,int,int,),方法包含一个,(,x,y,),坐标,控制可视窗口在屏幕中的显示位置。,图,7-18,控制可视窗口显示位置,为了添加一个,Layer,,使用,append(),方法向这个,LayerManager,添加一个,Layer,。,7.5,手机音效开发,现在能播放音乐的手机已经是很常见的了,同时手机游戏也需要声音来增加动感效果,所以手机音效也成为了开发热点。,J2ME,针对多种媒体格式,提供了一套播放接口,那就是:,MMAPI,(,Mobile Media API,)。,7.5.1 MMAPI,体系结构,现在多媒体的格式很多,要顺利地播放这些不同格式的音乐,一种比较好的方式就是把这些不同格式的数据都转换为统一的格式,然后统一使用一个播放器接口类来播放。,在,MMAPI,中,首先从数据源(如一个文件、一个捕获装置或一个流式服务)上读取媒体数据内容后,然后传输给专门的处理程序进行处理。,处理过程主要是由,DataSource,类和,Player,类完成。,DataSource,类的作用就是读取和转换多媒体数据,,Player,类的作用就是播放这类数据。,然后提供一系列的播放、暂停、停止等播放器相关功能,,DataSource,类和,Player,类的工作过程如图,7-19,所示。,图,7-19,数据流图,7.5.2 Player,接口,要使用,MMAPI,进行音效开发,首先需要导入相关的开发包,例如:,import,javax.microedition.media,.*,创建一个,Player,对象有,3,种不同的方式,也就是用,Manager,类的不同构造方法,,Manager,类一共有三个构造方。,(,1,),Public static Player,createPlayer,(,java.lang.string,locator) throws,java.io.IOException,MediaException,(,2,),Public static Player,createPlayer,(,DataSource,source) throws,java.io.IOException,MediaException,(,3,),Public static Player,createPlayer,(java.,io.InputStream,stream, java.,lang.String,trpe,) throws,java.io.IOException,MediaException,这三个方法分别可以读取指定路径的数据源或者,DataSource,和,InpurStream,类型的数据源,分别返回一个,Player,,当一个,Player,对象被创建以后,使用,Player,接口的,start(),方法就会尽可能快地启动数据的播放,当数据播放完毕以后,,Player,会自动关闭。,1,UNREALIZED,状态,2,REALIZED,状态,3,PREFETCHED,状态,4,STARTED,状态,5,CLOSED,状态,图,7-20,状态转换图,7.5.3,播放简单音调,声音的高低叫音调,也就是音符的频率,,J2ME,提供了对简单音调播放的支持,,MMAPI,提供了一个,Manager.playTone,(),方法来播放音调。,使用,Manager.playTone,(),,需要指定三个参数:音符、播放时间和声音的大小。例如下面的代码播放了一个,C4,的音调,,C4,音调是由,ToneControl,类的常量,C4,指定的。,7.5.4,播放歌曲,使用,MMAPI,播放歌曲很简单,主要是用,Player,的,createPlayer,构造方法,只要指定网络地址,,Player,就会自动的下载歌曲并播放,具体构造方法如下。,public static Player,createPlayer(String,locator)throws,IOException,MediaException,为了很好地控制歌曲的播放状态,需要,MIDlet,程序实现一个,PlayerListener,接口,同时实现该接口中的,playerUpdate,(),方法。,public void,playerUpdate(Player,player,String,event,Object,eventDate,),在,playerUpdate,方法里可以判断播放的状态,例如判断播放是否结束可以用,PlayerListener.END_OF_MEDIA,进行判断。,public void,playerUpdate(Player,player,String,event,Object,eventDate,),if(event,=,PlayerListener.END_OF_MEDIA,),为了提高播放效率,又不影响其他程序的运行,可以使用线程,只要实现,Runnable,接口即可。,如果想在播放过程中,对播放进行暂停或者停止等操作,都要对播放器的各种状态进行判断,,图,7-21,播放网络资源,7.5.5,控制音量,音量的控制可以使用,VolumeControl,控件接口,它允许设置音量的变化范围是从,0,100,,其中,0,表示静音。,VolumeControl,控件接口的使用很简单,使用,getLevel,(),方法得到当前的音量级别,也可以使用,setLevel,(),方法设置音量级别,静音使用,setMute,(),方法来设置,要判断是否静音可以使用,isMute,(),方法。,具体获得一个,VolumeControl,控件的代码如下:,VolumeControl,volume = (,VolumeControl,),player.getControl(VolumeControl,);,volume.setLevel(VOLUME_LEVEL,);,7.6,综合示例:飞机碰撞,本例子是在背景为星空的屏幕上显示两架飞机,通过手机的键盘可以控制飞机的相对位置,当两架飞机碰撞的时候可以显示爆炸。,同时播放爆炸的声音。本例用到了前面学习过的动画和音效开发的知识。由于飞机的碰撞除了背景还有两个飞机和一个爆炸图层,所以使用了一个,LayerManager,类来管理多个图层,这样能很方便的使用碰撞方法。,碰撞的检测很简单,可以使用,collidesWith,(),方法,如果碰撞该方法返回,true,。,Sprite plane1,plane2;,/,使用像素碰撞检测,如果碰撞该方法返回,true,Boolean collide = plane1. collidesWith(plane2);,当发生碰撞时,把两个飞机设置为不可见,把爆炸的图片显示出来,这样就构成了爆炸的场景。,为了具有声音效果,要有一个用来播放音乐的类,PlayMusic,,在这个类里完成读取和播放音乐文件的功能。,图,7-22,执行效果图,7.7,小 结,本章的内容很多,主要介绍了,PNG,格式图像的由来,详细介绍了,PNG,格式图像的特性和压缩处理。,针对手机的特点,详细的给读者介绍了如何在手机游戏中使用,PNG,格式图像,由于游戏菜单是游戏的一个必须部分,最后使用范例介绍了游戏菜单的制作。,及在,J2ME,中如何实现动画,由于在,J2ME,中实现动画要涉及多线程技术,所以详细介绍了,Java,中的线程技术,双缓存技术以及图片的裁剪技术,让读者掌握什么是线程及怎样使用多线程实现动画。,最后提供了一个播放动画程序框架。让读者对实现动画有一个完整的概念和理解。在最后介绍了手机音效的开发,介绍了如何播放简单音调和歌曲及音量的控制。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业管理 > 营销创新


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!