




已阅读5页,还剩131页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章手机游戏开发 游戏是策划 美工和程序三者的协调及创意和商业运作的平衡 集美术 音乐 动画 人工智能等元素于一身 目前支持Java的手机性能越来越强大 同时 手机的价格在不断地下降 因此 手机游戏的市场前景将是非常良好的 本章将从图片的处理 动画的制作和音效的实现来学习手机游戏开发的基础知识 7 1手机游戏开发简介 现在的移动电话可以看作小型的计算机 只是它的处理能力与PC相比很有限 但是足够运行一个小型的游戏 另一个特性就是它们还是网络计算机 能够高速发送和接收数字数据 除了语音数据以外 它们还可以发送和接收其他类型的数据 但是与PC相比 它们的输入和显示功能也很有限 手机的屏幕都较小 其对声音处理能力也很有限 开发者在这样的平台上开发应用 必须认真的考虑这些特点 本节将重点讨论手机本身的特点和手机游戏开发的特点 7 1 1手机游戏的类型1 嵌入式游戏2 短信息服务游戏3 WAP浏览器游戏 图7 1WAP游戏的工作原理图 7 1 2手机游戏开发特点1 庞大的潜在用户群2 便携性3 屏幕小 4 有限的颜色和声音支持5 应用程序大小限制6 高等待时间7 可中断性是关键 7 1 3扬长避短的手机游戏开发1 缩短每回合的游戏时间2 合理处理等待时间 7 2PNG图像格式介绍 7 2 1PNG的由来PNG全名PortableNetworkGraphics 字面意思是 可移植性网络用图形 从这简单几个字已经明白定义了PNG的用途以及主要发展方向 1996年 PNGGroup向W3C WorldWideWebConsortium 提出一种多媒体图形格式 重点在于改进现有JPG跟GIF的缺点 并且提供更多新的概念与压缩模式 在提出后得到W3C的认可与推荐 在1996年10月1号 W3C正式发函公告 推荐PNG为最佳的图形格式 并且以 PNGDeliversHigherQualityGraphicsforWebPageDesign 的文字作为该文件的标头 7 2 2PNG的图档格式特性PNG保留了大部分GIF的特性 PNG的压缩率很高 尤其是图表型的图片 7 2 3PNG格式图像的压缩及处理PNG图像格式文件 或者称为数据流 由一个8字节的PNG文件署名 PNG 域和按照特定结构组织的3个以上的数据块 chunk 组成 PNG定义了两种类型的数据块 一种是称为关键数据块 criticalchunk 这是标准的数据块 另一种叫做辅助数据块 ancillarychunks 这是可选的数据块 7 2 4使用PNG图片在MIDP具体实现中 Images可以是可变的也可以是不可变的 不可变的Image可以从二进制图像文件创建 如果要用二进制图像数据来创建Image 这些数据必须是设备支持的格式 有的设备可能会支持额外的一些格式 不过所有设备都必须支持PNG格式 在手机中使用PNG图片 必须先把图片加载到内存 并且实例化成为一个Image对象 Image对象的构造方法如下 publicstaticImagecreateImage Stringname 图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 Graphicsg 方法里 将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上显示动画 MIDP1 0没有直接提供对动画的支持 正在开发中的MIDP2 0支持 但真要是自己去实现 其实也并非是一件很难的事 任何动画的最基本的前提 是要在足够快的时间内显示和更换一张张的图片 让人的眼睛看到动的画面效果 图片必须按照顺序画出来 从一张图片到下一张图片之间的变化越小 效果会越好 首先要做的 是使用你的图片处理软件 比如Photoshop或者Firework 创建一系列相同大小的图片来组成动画 每张图片代表动画一帧 你需要制作一定数量的帧 越多的帧会让你的动画看上去越平滑 制作好的图片一定要保存成PNG格式 有两个办法让你刚做好的图片在MIDlet上变成动画 第一 把图片都放到一个Web服务器上 让MIDlet下载他们 MIDP内置的HTTP支持 第二个办法更简单 把图片用MIDlet打包成JAR文件 如果你使用的是J2ME开发工具 把PNG文件放到你的项目文件里面就可以了 动画的过程其实更像账本记录 显示当前帧 然后适当地更换到下一帧 7 4手机游戏2D动画开发 7 4 1MIDP2 02D游戏开发MIDP2 0相对于1 0来说 最大的变化就是新添加了用于支持游戏的API 它们被放在javax microedition lcdui game包中 游戏API包提供了一系列针对无线设备的游戏开发类 由于无线设备仅有有限的计算能力 因此许多API的目的在于提高Java游戏的性能 并且把原来很多需要手动编写的代码如屏幕双缓冲 图像剪裁等都交给API间接调用本地代码来实现 各厂家有相当大的自由来优化它们 游戏API使用了MIDP的低级图形类接口 Graphics Image等 整个游戏包仅有5个Class 1 GameCanvas2 Layer3 LayerManager4 Sprite5 TiledLayer 7 4 2GameCanvas的使用GameCanvas类提供了基本的游戏用户接口 除了从Canvas继承下来的特性 命令 输入事件等 以外 它还提供了专门针对游戏的功能 如后备屏幕缓冲和键盘状态查询的能力 每个GameCanvas实例都会有一个唯一的缓冲区 1 绘图2 键盘 7 4 3Sprite的使用Sprite是一个基本的可视元素 可以用存储在图像中的一帧或多帧来渲染它 轮流显示不同的帧可以令Sprite实现动画 翻转 旋转等几种变换方式也能应用于Sprite使其外观改变 作为Layer子类 Sprite的位置可以改变 并且还能设置其可视与否 1 Sprite帧用于渲染Sprite的原始帧由一个单独的Image对象提供 此Image可以是可变的 也可以是不可变的 图7 4帧的分解 2 帧序列Sprite的帧序列定义了帧以什么样的顺序来显示 图7 5帧的序列 图7 6帧的特定序列 图7 7更新显示 3 ReferencePixel作为Layer的一个子类 Sprite继承了很多方法来设置和获取位置 如setPosition x y getX 和getY 4 Sprite的变换几种变换可应用于Sprite 可用的变换包括旋转几个90度加上镜像 沿垂直轴 图7 8ReferencePixel 图7 9参考像素点被定位在树枝末端 图7 10Sprite的变换 图7 1190度旋转的变换 7 4 4碰撞检测Sprite非常适合移动的物体 如游戏主角 敌人等 在游戏中 可以使用Sprite提供的碰撞检测功能来简化游戏逻辑 Sprite的碰撞检测可以分两种 一种是矩形碰撞检测 另一种是像素碰撞检测 游戏中Sprite的大小往往是用包围它的矩形的大小来表示的 如在图7 12中的飞机和导弹并没有发生碰撞但检查的结果却发生了碰撞 图7 12矩形碰撞检测 对于像素碰撞检测 往往把Sprite的背景色设置为相同的颜色 碰撞检查的时候就只判断两个图片除背景色以外的其他像素是否发生了重叠 像素碰撞检测比较精确 但计算复杂 一般没有特殊要求都使用矩形碰撞检测 下面的例子两个矩形发生了碰撞但飞机和导弹并没有发生碰撞 如图7 13所示 图7 13像素碰撞检测 要判断两个Sprite是否碰撞 或者与其他Layer是否碰撞 可以使用collidesWith 方法 CollidesWith 共有三种形式 1 publicfinalbooleancollidesWith Sprites BooleanpixelLevel 2 publicfinalbooleancollidesWith TitledLayert BooleanpixelLevel 3 publicfinalbooleancollidesWith Imageimage intx inty BooleanpixelLevel 7 4 5Layer的使用Layer是一个抽象类 表示游戏中的一个可视元素 1 TiledLayerTiledLayer由一系列单元格组成 单元格可被一组贴图填充 图7 14TiledLayer 每个贴图都被赋予一个唯一的索引号 除了静态贴图外 开发者同样能够定义一系列动态贴图 animatedtiles 动态贴图允许开发者能非常容易地改变一组单元格的外观 图7 15TiledLayer背景 图7 16TiledLayer动态贴图 2 LayerManagerLayerManager管理一系列的Layer 可视窗口 viewwindow 控制着可视区域及其在LayerManager的坐标系统中的位置 图7 17相对原点 paint Graphics int int 方法包含一个 x y 坐标 控制可视窗口在屏幕中的显示位置 图7 18控制可视窗口显示位置 为了添加一个Layer 使用append 方法向这个LayerManager添加一个Layer 7 5手机音效开发 现在能播放音乐的手机已经是很常见的了 同时手机游戏也需要声音来增加动感效果 所以手机音效也成为了开发热点 J2ME针对多种媒体格式 提供了一套播放接口 那就是 MMAPI MobileMediaAPI 7 5 1MMAPI体系结构现在多媒体的格式很多 要顺利地播放这些不同格式的音乐 一种比较好的方式就是把这些不同格式的数据都转换为统一的格式 然后统一使用一个播放器接口类来播放 在MMAPI中 首先从数据源 如一个文件 一个捕获装置或一个流式服务 上读取媒体数据内容后 然后传输给专门的处理程序进行处理 处理过程主要是由DataSource类和Player类完成 DataSource类的作用就是读取和转换多媒体数据 Player类的作用就是播放这类数据 然后提供一系列的播放 暂停 停止等播放器相关功能 DataSource类和Player类的工作过程如图7 19所示 图7 19数据流图 7 5 2Player接口要使用MMAPI进行音效开发 首先需要导入相关的开发包 例如 importjavax microedition media 创建一个Player对象有3种不同的方式 也就是用Manager类的不同构造方法 Manager类一共有三个构造方 1 PublicstaticPlayercreatePlayer java lang stringlocator throwsjava io IOException MediaException 2 PublicstaticPlayercreatePlayer DataSourcesource throwsjava io IOException MediaException 3 PublicstaticPlayercreatePlayer java io InputStreamstream java lang Stringtrpe throwsjava 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就会自动的下载歌曲并播放 具体构造方法如下 publicstaticPlayercreatePlayer Stringlocator throwsIOException MediaException 为了很好地控制歌曲的播放状态 需要MIDlet程序实现一个PlayerListener接口 同时实现该接口中的playerUpdate 方法 publicvoidplayerUpdate Playerplayer Stringevent ObjecteventDate 在playerUpdate方法里可以判断播放的状态 例如判断播放是否结束可以用PlayerListener END OF MEDIA进行判断 publicvoidplayerUpdate Playerplayer Stringevent ObjecteventDate if event PlayerListener END OF MEDIA 为了提高播放效率 又不影响其他程序的运行 可以使用线程 只要实现Runnable接口即可 如果想在播放过程中 对播放进行暂停或者停止等操作 都要对播放器的各种状态进行判断 图7 21播放网络资源 7 5 5控制音量音量的控制可以使用VolumeControl控件接口 它允许设置音量的变化范围是从0 100 其中0表示静音 VolumeControl控件接口的使用很简单 使用getLevel 方法得到当前的音量级别 也可以使用setLevel 方法设置音量级别 静音使用setMute 方法来设置 要判断是否静音可以使用isMute 方法 具体获得一个VolumeControl控件的代码如下 VolumeControlvolume VolumeControl player getControl VolumeC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人才日活动策划方案模板
- 东莞入企咨询方案
- 传媒艺考活动策划方案
- 水产养殖行业技术规范总结
- 软件著作权转让协议
- 2025结构工程师检测卷(历年真题)附答案详解
- 2025国家统一法律职业资格考试考试真题及答案
- 中考语文小说阅读赏练-梁晓声小说(含解析)
- 诚信与谎言话题作文(13篇)
- 2025计算机一级考前冲刺练习试题及完整答案详解(夺冠系列)
- 2025-2026学年地质版(2024)小学体育与健康二年级(全一册)教学设计(附目录P173)
- 茶百道培训课件
- 2025至2030年中国制药装备行业市场全景分析及投资前景展望报告
- 2025北京京剧院招聘工作人员10人考试备考题库及答案解析
- 检修现场管理培训课件
- 2025年食品安全人员在线考试试题及答案
- 多重耐药菌感染患者的护理LP
- 信息网络安全考题「附答案」
- 2025年度国务院国资委干部教育培训中心招聘(2人)笔试备考试题及答案详解(历年真题)
- 2025司法协理员考试模拟题及答案
- 消防设备设施操作讲解培训课件P
评论
0/150
提交评论