下载
加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 《J2ME手机游戏开发技术详解》

《J2ME手机游戏开发技术详解》.pdf

《J2ME手机游戏开发技术详解》

UC
2009-06-20 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《《J2ME手机游戏开发技术详解》pdf》,可适用于IT/计算机领域

选自:JME手机游戏开发技术详解作者:李振鹏龚剑购书网址:http:wwwchinapubcomcomputerscommoninfoaspid=第第一一篇篇起起步步篇篇第一章JME概述JME体系结构JAVA技术的版本JME的三层体系结构JME配置(Configuration)K虚拟机(KVM)JME简表(Profiles)JME手机游戏设计··JME规范(Specification)有限连接设备配置表(CLDC)CLDC概览CLDC中使用的JSE类CLDC的字符集和系统属性CLDC专用类CLDC的新特性CLDC安全体系结构MIDP简表设备需求MIDP的总体体系结构MIDP类库MIDP的新特性MIDP的安全机制MIDP的未来方向本章小结第二章用JMEWTK开发无线应用JMEWTK的安装配置WTK简介安装前的准备工作WTK的安装WTK的目录结构使用KToolbar部署应用启动KToolbar工具包创建新工程打开一个已有工程第一个MIDP程序“HelloWorld”编译并运行程序MIDP程序打包以及混淆部署多个MIDlet组成的套件OTA方式部署应用MIDlet应用程序模型MIDlet套件清单文件(MANIFEST)和描述文件(JAD)应用管理软件从JAD文件中读取属性MIDlet的生命周期编写MIDlet应用程序MIDlet的开发流程第章单屏游戏的设计与实现··设置WTK的工程属性和开发环境设置JAD清单属性设置自己的工程目录使用第三方类库设置WTK的版本控制设置调试(Debug)环境设置默认模拟器添加新的模拟器为程序添加图标WTK的模拟器使用WTK自带的模拟器模拟器中的文本输入用模拟器运行本地配置应用程序设置模拟器的网络参数设置模拟器的永久存储和堆栈设置模拟器的执行性能监视程序的执行情况本章小结第三章JME应用开发环境的选择和配置JBuilder开发环境搭建搭建JME开发平台开发Demo程序打包和混淆应用程序打包和混淆出现的问题使用Nokia开发包开发应用程序使用SonyEricsson开发包开发应用程序使用Motorola开发包开发应用程序Eclipse开发环境的搭建搭建JME开发平台开发Demo程序打包和混淆应用程序本章小结JME手机游戏设计··第第二二篇篇基基础础篇篇第四章高级用户界面高级用户界面设计概述MIDP用户界面概述用户界面API的分类高级用户界面的类层次用户界面的管理Display类Display对象的管理可显示(Displayable)类当前显示对象(CurrentDisplayable)设置当前显示对象获取背景光和振动器信息获取颜色信息获取样式信息序列化高级事件用户界面事件概述命令(Command)类和命令类型Command对象与用户界面的映射CommandListener侦听用Command跳转屏幕高级屏幕类Screen类用信息条(Ticker类)实现滚动文字用Alert类实现提醒功能AlertType类Choise接口List用TextBox类输入和编辑文本屏幕表单(Form类)及其组件Form类Item类以及对Item状态的侦听用ChoiceGroup类实现选项用CustomItem自定义组件第章单屏游戏的设计与实现··用DateField类输入日期Gauge(图形标尺)类用ImageItem类在Form中显示图片SpacerStringItem用TextField类输入文字本章小结第五章低级用户界面Canvas类Canvas类概述绘制屏幕重绘屏幕和强制重绘显示和隐藏事件按键事件游戏动作指针事件Command事件Graphics类Graphics类概述颜色模型与Alpha透明绘制直线绘制和填充矩形绘制和填充弧形绘制和填充圆角矩形填充三角形画笔风格设置剪裁区域坐标系统变换字体的使用Font类概述字体属性创建字体文本的高度和宽度基线锚点绘制字符串图像的绘制Image类概述不变图像的创建JME手机游戏设计··不变图像的绘制ARGB图像的创建与绘制PNG图像格式制作PNG透明背景可变图像的创建图像双缓冲技术图片处理的注意点本章小结第六章记录存储系统记录存储系统概述记录存储的概念记录存储API记录存储的管理创建记录存储关闭和删除记录存储增加记录存储查询记录存储修改记录存储面对记录的高级操作记录枚举接口记录过滤接口记录比较接口记录监听接口存储记录的格式问题二进制格式和其他格式的转换几个关于数据转换的问题游戏中的数据存储游戏中记录存储的方式游戏记录存储类的使用与传统的数据存取方式的对比本章小结第七章MIDP网络编程通用连接框架概述通用连接框架GenericConnectionFrameworkGCF的层次结构GCF的使用MIDP的Http连接第章单屏游戏的设计与实现··HTTP协议简介HTTP连接状态建立HTTP连接设置HTTP请求头使用HTTP连接关闭HTTP连接使用http协议下载文件Socket连接简介套结字(Socket)连接简介使用Socket下载文件Datagram连接简介Datagram连接简介Datagram使用实例Push技术概述Push技术的分类静态注册与基于inbound网络连接的Push动态注册与基于计时器的Push使用Push应注意的问题本章小结第八章声音的播放和处理MMAPI概述MMAPI的概念MMAPI的结构播放器的创建和管理MMAPI所支持的声音格式Player接口和状态播放器的使用播放简单音调播放音乐文件控制播放音量设置播放次数和循环播放播放器监听接口游戏中声音的播放以独占方式播放声音以线程方式播放声音本章小结JME手机游戏设计··第第三三篇篇进进阶阶篇篇第九章MIDP游戏开发MIDP游戏开发概述MIDP对游戏的支持GameAPI概览游戏的屏幕:GameCanvas类GameCanvas概述绘制双缓冲区实现游戏主循环获取键盘状态Canvas绘制实例图层的使用:Layer类游戏背景:TiledLayer类TiledLayer类概览图像贴图(Tile)单元格(Cell)静态背景的制作动态背景的制作游戏精灵:Sprite类Sprite类概览帧(Frame)帧序列(FrameSequence)旋转(Transform)设置参考点(referencepixel)精灵的绘制碰撞检测(例子)图层管理:LayerManager类LayerManager类概览层的索引和操作(示意图)LayerManager的绘制设置图层的位置设置显示窗口(示意图)双重背景的制作实例:GameAPI实现RPG游戏本章小结第章单屏游戏的设计与实现··第十章游戏主要编程技术游戏的线程线程的创建线程的启动与停止线程的休眠与唤醒线程的优先级线程的同步问题游戏的中断和恢复Vector:用Vector实现的子弹随机数字:游戏的人工智能定时器Timer:预定时间内完成任务只运行一次的定时器可以重复运用的定时器游戏闪屏设计Alert实现的闪屏Canvas实现的闪屏游戏菜单设计高级界面实现的菜单低级界面实现的菜单本章小结第十一章D游戏开发入门JMED概览JMED游戏概述MG包描述手机D图像开发技术MG技术所能实现的功能D动画的两种开发模式场景结构(SceneGraphs)类描述用点、线、面构造复杂形体基本原则顶点数组(VertexArray)位置数组(PositionArray)法向量数组(NormalArray)颜色数组(ColorsArray)纹理数组(TextureArray)顶点缓冲(VertexBuffer)索引缓冲(IndexBuffer)JME手机游戏设计··网格多面体(Mesh)实例:构造一个金字塔顶点变形多面体(MorphingMesh)实例:变形多面体骨骼变形多面体(SkinnedMesh)实例:活动的手臂多面体的外观属性Apperance概述深度和颜色属性(CompositingMode)多边形属性(PolygonMode)雾化属性(Fog)材质属性(Material)维图像(ImageD)纹理映射(Texture)实例:添加多重纹理光源光照概述光照的类型光照的衰减光源的选择和颜色创建聚光源实例:比较光照效果实例:滚动的光源构建三维世界变换矩阵(Transform)变换类(Transformable)节点(Node)抽象三维物体ObjectD节点组(Group)世界(World)背景(Background)摄影机(Camera)精灵(SpriteD)实例:活动的圣诞老人场景绘制(GraphicsD)实例:滚动的骰子动画制作类结构关键帧序列(KeyframeSequence)动画轨迹(AnimationTrack)第章单屏游戏的设计与实现··动画控制器(AnimationController)实例:滚动的立方体使用MG文件创建D场景DMax制作MG文件制作指南浏览MG文件加载MG文件实例:遍历世界本章小结第十二章JME游戏开发技巧目标设备的约束受限的处理器受限的存储器联网能力和带宽输入输出的多样性外型和重量移动设备的操作系统针对JME游戏开发的技巧及优化技术优化的基本知识使用JBuilder查找程序的性能瓶颈优化JME程序设计和编码提高程序性能的方法。优化内存的使用缩减应用程序体积网络程序优化延迟掩盖技术程序设计的权衡本章小结第第四四篇篇实实战战篇篇第十三章手机游戏开发的总体理念游戏开发的思想从游戏玩家角度开发的游戏从开发者角度开发的游戏从游戏载体划分的游戏JME手机游戏设计··从游戏实现角度划分的游戏JME手机游戏的版本和移植性JME的版本介绍JME的扩展标准JME的不同厂家实现的差别介绍JME程序在不同手机之间的移植本章小结第十四章单屏游戏的设计与实现游戏的策划以及架构单屏幕手机游戏概述手机游戏策划概论逃亡者游戏的策划逃亡者游戏的准备工作程序的类结构游戏的流程图游戏的实现主类escapeeMIDlet的实现游戏闪屏SplashScreen类的实现游戏菜单MenuList类的实现高分屏幕HighScoreScreen类的实现简介屏幕InstructionsScreen类的实现子弹Bullets类的实现逃亡飞机Escapee类的实现游戏画布escapeeCanvas类的实现结束屏幕GameOverScreen类的实现声音效果SoundEffects类的实现游戏的优化和改进逻辑层和表现层的分离玩家的定制制作游戏的试玩版游戏程序的注册本章小结第十五章滚屏游戏设计经典超级玛丽游戏滚屏游戏的策划和准备工作游戏的策划游戏的准备工作滚屏游戏的技术游戏中用到的主要技术第章单屏游戏的设计与实现··滚屏游戏的驱动方式进度条技术滚屏游戏的架构程序的总体架构程序的类结构滚屏游戏的实现地图绘制的实现碰撞检测键控处理的实现滚屏的实现主要人物(玛丽)的实现乌龟的实现菜单的实现游戏的主Canvas类的实现游戏主Manager类的实现滚屏游戏的优化和注意点游戏中屏幕绘制技术的优化游戏中新对象的产生和垃圾收集游戏优化中时间空间的权衡游戏中关于来电挂起和恢复处理的注意点本章小结第十六章手机网络游戏设计网络对战扑克游戏网络游戏客户端的设计实现程序的设计程序的架构程序的实现程序的优化网络游戏服务器的设计实现程序的设计程序的架构程序的实现本章总结第十七章D迷宫游戏设计与实现迷宫游戏的策划和准备工作D游戏开发概述游戏的策划游戏的准备工作迷宫游戏的架构JME手机游戏设计··游戏线程游戏的类结构游戏的场景架构游戏的流程深度优先算法生成迷宫迷宫游戏的实现主类MazeDMIDlet类菜单列表MenuList类的实现平面Plane类的实现迷宫地图Maze类的实现游戏画布MazeCanvas类的实现设备属性GraphicsDproperties类的实现错误处理ErrorScreen类的实现D手机游戏的相关探讨迷宫游戏的改善D手机游戏设计概要D绘制性能和游戏引擎D手机游戏的分类本章小结第第章章单单屏屏游游戏戏的的设设计计与与实实现现本章实现了一个单屏幕飞机游戏讲解了D游戏的策划和架构设计这些设计侧重在单屏手机游戏上。之后对程序设计以及游戏商用化进行了更深层次的讨论包括游戏定制、版权保护和游戏框架等内容。通过本章的学习希望读者领悟到:•D游戏的基本设计流程•如何让游戏更具有吸引力•如何保护游戏版权以及可能有的方法•尽可能让玩家可以定制游戏•益智类游戏需要关注逻辑层和表现层的分离游戏的策划以及架构本节以一个小游戏为例讲解了单屏幕游戏的策划、图片制作、类结构和流程设计。这些步骤讲解得比较简单但却基本能够代表了一个游戏在策划方面的所有工作。在实际设计中这些步骤还需要更加细致和具体化。例如图片的设计和优化、交互界面的人性化都是游第章单屏游戏的设计与实现··戏成功的重要因素。单屏幕手机游戏概述单屏幕游戏是指那些游戏画面不进行滚动(或者不进行大范围滚动)的游戏它和滚屏游戏相比照不需要游戏的滚屏技术但是单屏游戏更加侧重于游戏的可玩性和简单性。在此将单屏游戏分为两类:其中一类体现在操作简便持续时间短通常需要玩家具有较好的操控能力和反应速度。这类游戏的代表例子为泡泡龙、俄罗斯方块、祖玛游戏等此外类似的还有单屏幕的射击游戏。这类游戏的设计比滚屏游戏要简单但其难点是可能逻辑判断更为复杂而且对美工的要求更高。如图和图分别是特别具有代表性的泡泡龙游戏和俄罗斯方块游戏虽然游戏非常简单但非常容易让玩家痴迷其中。图一款泡泡龙游戏的游戏画面图两款方块游戏画面另一类单屏幕游戏是属于益智类的虽然游戏界面比较简单也不需要很复杂的游戏特效但是其游戏逻辑通常使用到人工智能等算法如何控制游戏难度和优化算法是该类游戏的难点之一。这类游戏包括棋类游戏、牌类游戏和智力测试例如五子棋、麻将、拼图和扫雷游戏等。如图所示为益智类单屏游戏的画面。JME手机游戏设计··图益智类游戏手机游戏策划概论是什么使得一个手机游戏令人上瘾为了使一个游戏令人上瘾它必须有一个使人玩下去的动力。以下是一些因素:想完成这个游戏想战胜其他的对手想掌握游戏的操作方法和交互界面想在游戏的世界中探险并且获得高的得分或等价物。.想完成手机游戏的动力想完成这个游戏经常基于想看到游戏最终的结果或仅仅只是想完成它。在仅仅只是想完成游戏的例子中这些游戏只是被看作是一个挑战。去持续地玩一个明显很难的游戏并直到完成为止这可能是一种满足自信心的行为。然而这并不能产生一种最好的结果有些玩家乐于寻找挑战并去战胜它而其他的玩家可能会觉得它太难了以至于抛在一边。人们都喜欢去赢得胜利如果你能提供一个游戏它挑战这些玩家而且还最终让玩家赢得胜利那么这个游戏会和高兴的玩家一起愉快地结束。游戏的难度虽然只是一个设计上的选择但作为一个体贴玩家的设计者必需要充分地考虑到这一因素所带来的结果。另一方面一个玩家结束了一个游戏来看游戏的结局是怎样的这就是一个故事的推动力甚至在象超级玛丽奥兄弟《SuperMarioBrothers》这样简单故事的游戏中也有一个结局。许多玩家想知道在不断地战斗并最终救出公主后会发生什么。一旦他们完成了整个故事又看到了最终的结局那么多半玩家会终止游戏的进行不会再去碰它了。.竞争的动力和其他人竞争是一个有力的因素并且能够保持游戏的活力能够让人难以致信地在很长一段时间内流行。一个两个人或更多玩家能够很好地互相竞争的游戏能够玩相当长的时间远远超过了它在手机上的期待生存期。竞争是游戏的基石之一。它允许人们在游戏规则--这一公共标准的监督下互相交互而且确实把游戏的主动权交到了每个玩家的手中而不是在设计者的手中。如果你设计的游戏规则比较自由、能动那就允许了玩家创立他们自己的游戏方式在游戏中移动和使用计谋就像你以前从未考虑过的。.提高操作技巧的动力游戏中的技巧或控制也是非常重要的。运动模拟游戏尤为突出地表现了这一点。因为这第章单屏游戏的设计与实现··类游戏的主要目地是模拟独特的运动控制。玩家经常重复地玩这类游戏来提高自已的操作技巧。举个例子在赛车游戏中在笔直向前的道路上做一个简单的拐弯很容易就能做到但是为了更好地完成这个动作以赢得时间你必须能够感觉到道路的情况以及当你的轮胎打滑时所采取的相应动作。让玩家在你的游戏中学习如何控制的要点是在你给玩家的反馈中。一个轮胎摩擦的声音提示你轮子开始打滑了当你穿过一个急转弯时发动机的轰鸣声会发生变化等。设计者应提供给玩家游戏操作手册或帮助功能使玩家能够通过图片、文字、动画来理解游戏的功能和如何操作这将使玩家逐渐地熟悉这种方式并且给他们一个理由来试着掌握它。如果玩家不能够获得足够的反馈信息那就可能没有更好的方式来掌握它。如果一个初玩者和一个老练的玩家在做一些动作时只有相同的选择那就没有理由尝试着成为一个老练的玩家。.渴望探险的动力在计算机游戏开始时探险就已经包含在其中了。事实上早期的一些游戏只包括探险。冒险《Adventure》是一个文字类的游戏在其中玩家可以在广阔的区域中游荡查找并搜集有趣的物品使用它们来解开几个谜题通过这些谜题会发现更广阔的区域需要去探险。当代的探险游戏--冒险岛《Myst》也是用类似内容作为它的基础这个游戏的流行并不说明许多人在这块有趣地方探险的推动力是去发现神秘岛中奇怪的事件但有好几个游戏是以这点作为宣传的资本。隐藏的内容也是许多游戏吸引人的因素之一超级玛丽奥兄弟的一个吸引点就是去找出隐藏的情节。ShigeruMiyamoto(任天堂的设计小组成员之一曾制作过超级玛丽奥兄弟ZeldaMetroidetc)认为视频游戏的内容应该是隐藏的对玛丽兄弟游戏来说这一点做得非常好。.获得高得分的动力渴望获得高得分的情况主要分成二类一般来说在游戏中尝试获得高得分或其他等价物的玩家希望在竞争中超过其他玩家的得分记录或想完全地掌握这个游戏。有许多游戏的目地只是简单地为了赢得一个较高的分数。它起源于古老的撞球游戏在当前这个更先进的网络时代这一规律仍然生效并且广受欢迎。另一种情况已经超越了赢得游戏本身。在超级玛丽奥兄弟中当你赢了之后你可能会在增加了难度后继续去玩。用一个硬币能通关几次或一条命能冲多少关积多少分这已经变成了衡量玩家水平高低的标准。老玩家会因水平高而自豪它甚至会引来其他玩家的尊敬。设计你的游戏使你的玩家甚至在游戏获胜后仍愿意继续玩下去。并通过难度的增加更具有挑战性来激励玩家玩下去。这是你能增加到你游戏中去的要素。逃亡者游戏的策划为了简化游戏的策划选取了一款PC小游戏作为范例移植到手机上它的中文名为《是男人就撑过秒》相信你一定玩过原版本的这个游戏虽然看似简单但绝对有挑战性!这是总结了无数日本纵版飞行射击游戏中的武器而研究出的特殊训练软件专门用来训练“战JME手机游戏设计··斗机”飞行员。在漆黑一片的宇宙中停着一架小飞船突然四面八方出现很多黄色的小点向小飞船聚集过来小飞船凭借速度优势和飞行技术从黄点之间的夹缝中飞过之后又落入新的包围圈中直至被黄点击毁。坚持的时间越长就说明水平越高(起码是控制键盘上方向键的水平)。持续不同的时间会得到不同的评价。如图所示是它原来的游戏画面。图《特训:是男人就撑过秒》游戏画面这游戏是日本人设计出来的不得不承认设计者对现代社会的本质认识得很深刻将激烈的社会竞争微缩在一个小小的游戏上。从中体会到三点人生启示:第一玩这个游戏的窍门不停地绕圈子人活在这个世界上也是一样必须始终保持活力跟上时代的脚步静止、停步不前就意味着死亡第二成功的关键在于坚持、在于坚定的意志面对挑战和困难比别人坚持的时间更长成功的机率就越大受到来自社会的赞誉就越高第三要想成功仅仅有坚定的意志仍然不够四面八方都是敌人如何在运动的物体中找到一条安全的出路这还需要具备冷静敏锐的头脑。这个游戏的目的是提供一个指导范例而不是完全的商业化游戏产品。希望读者能开发出具有更好的图形、音响效果和更具可玩性的游戏。逃亡者游戏的准备工作游戏的准备工作主要是准备游戏所需要的图片和声音并且说明它们在何处用到。这里用到了个图片文件如图所示。它们的大小和用途如表所示。注意:对于游戏中使用的大图最好用FireWork或PhotShop等图像软件进行优化例如在优化之前闪屏图片为k优化之后大小变为k缩小为原来的五分之一。第章单屏游戏的设计与实现··图游戏中使用到的图片表图片清单图片名大小(字节)象素(宽×高)用途backwaterpng×背景图片bulletpng×子弹图片Escapeepng×飞机图片explosionpng×爆炸图片gameoverpng×游戏结束图片splashpng,×闪屏图片logopng×游戏标志对游戏来说最有用的功能是播放短的声音文件产成音响效果。MIDPMediaAPI没有规定必须支持的声音文件格式但对WAV(kHzmonoPCM)和MIDI文件格式的支持是合理的期望。游戏中用到的声音如表所示。表声音清单声音文件名大小(字节)声音格式用途Blastwavwav子弹和飞机碰撞时发出gameovermidmid游戏结束不是最好成绩时发出highscoremidmid游戏结束是最好成绩时发出通过MIDletJAR文件中的资源文件播放声音样本的代码如下所示:try{InputStreamis=getClass()getResourceAsStream(“dogwav”)以输入流的形式获取声音资源Playerp=ManagercreatePlayer(is,“audioxwav”)创建Player对象pprefetch()声音的预读去pstart()播放声音}catch(IOExceptionex){捕获IO异常}catch(MediaExceptionex){捕获声音文件异常}JME手机游戏设计··可通过调用start重复使用同一个播放器。但当播放器已经在进行播放时这样做不起作用因此可以使用如下代码来确保播放器从头开始播放:pstop()停止声音psetMediaTime(L)pstart()从头从新开始播放游戏中的类SoundEffects使用了这种方法。此外MIDP在类Display中加入了方法vibrate(int)这使得游戏可以激活电话的振动功能(如果电话具有该功能)。其参数为用毫秒表示的振动持续时间没有办法控制振动频率。当产生新的游戏纪录时游戏使用该方法产生振动。在类Display中加入了方法flashBacklight(int)之后游戏可以使电话的背景灯闪烁(如果电话支持该功能)。其参数为用毫秒表示的闪烁持续时间没有办法控制闪烁频率。当第一次显示游戏结束屏幕时游戏使用该方法(由GameOverScreen调用)使背景灯闪烁。程序的类结构程序中一个有个类其中MIDlet主类负责各个屏幕的切换它们是闪屏屏幕、菜单、介绍屏幕、高分屏幕、游戏屏幕游戏结束屏幕。游戏中使用到的类为SoundEffects(音效)、Bullets(子弹)、Escapee(逃亡小飞机)。程序的类结构如图所示。图类结构游戏的流程图在进入游戏之前先显示闪屏图片当用户按下键盘或等待秒后进入游戏菜单。初始情况下游戏菜单有三个选项它们分别是开始游戏游戏说明和高分记录。选择开始新游戏则进入游戏在游戏中如果按下非游戏键盘则中断游戏返回菜单此时菜单中增加了一个继续游戏的选项可以返回游戏也可以重新开始新的游戏。当游戏结束时则进入游戏结束屏幕屏幕上显示了玩家的成绩和等级以及游戏的最好成绩如果当前成绩是最好成绩则手机震动并播放音乐庆祝成功。在菜单中选择游戏说明或者高分纪录则进入相应的屏幕它们都能用“后退”软键返回菜单。菜单中的退出选项用于退出程序。游戏的流程如图所示。第章单屏游戏的设计与实现··图游戏的流程图游戏的实现逃亡者游戏一共实现了几个类包括用于关于游戏外部的闪屏类、菜单类、高分屏幕类、简介屏幕类、结束屏幕类以及用于游戏本身的游戏画布类、子弹类、逃亡飞机类和声音效果类。主类escapeeMIDlet的实现MIDlet被用作一个状态机来管理各种屏幕以及它们之间的转换。例如当显示splash屏幕时该类和类SplashScreen(通过方法splashScreenPainted和splashScreenDone)共同在方法init中完成背景初始化。而使用方法readRecordStore和writeRecordStore在一个名为“BESTTIME”的记录存储区中保存最高得分。下面将讲解它的具体实现。.实现闪屏游戏的最开始将会出现一幅和游戏相关的图片它会停留一小段时间然后才进入游戏菜单。游戏闪屏使用得当将会增加整个游戏的视觉效果而且虽然画面在此期间停留不动后台程序却是忙碌的一般在此期间完成基本的初始化工作。在startApp方法中将游戏的显示权交给闪屏。注意前面说过startApp方法可能会在程序受到外界中断的情况下多次调用所以还应当看是否处于这种情况如果中断之前的显示内容为游戏画布则重新启动画布的线程显示权仍然交给画布。JME手机游戏设计··publicvoidstartApp(){Displayablecurrent=DisplaygetDisplay(this)getCurrent()获得关于显示的设备上下文if(current==){DisplaygetDisplay(this)setCurrent(newSplashScreen(this))第一次将显示闪屏}else{if(current==myCanvas){myCanvasstart()重新开始游戏线程}DisplaygetDisplay(this)setCurrent(current)显示游戏画布内容}}当闪屏绘制完毕时将会调用splashScreenPainted方法表示程序可以利用剩余的间歇来完成一些工作这里启动了MIDlet实现的一个线程它会自动去调用run方法。在run方法中将会进行了一些初始化工作这包括读取游戏记录、初始化游戏声音、初始化游戏菜单、初始化游戏画布当所有工作都完成时将一个initDone标志位设置为true表明已经初始化完毕(用来避免重复初始化)。当闪屏结束后将会调用splashScreenDone方法在这个方法里将检测初始化是否完毕如果还没有则继续初始化如果已经完毕则显示游戏菜单。关于闪屏实现的代码如下:voidsplashScreenPainted(){newThread(this)start()启动幕后的初始化线程}publicvoidrun(){init()调用初始化方法}privatesynchronizedvoidinit(){if(!initDone)如果还没有初始化完毕{readRecordStore()读取游戏记录SoundEffectsgetInstance()获得声音效果类的唯一实例menuList=newMenuList(this)初始化菜单myCanvas=newescapeeCanvas(this)初始化游戏画布initDone=true标志位为真表示初始化完毕}}voidsplashScreenDone(){init()检测是否初始化完毕如果没有继续初始化DisplaygetDisplay(this)setCurrent(menuList)在屏幕上显示游戏菜单}第章单屏游戏的设计与实现··.屏幕切换前面说过MIDlet主类起到一个状态机的作用负责各个屏幕之间的切换。它所实现的切换功能如下。从菜单中选择开始游戏首先初始化Canvas的游戏数据显示游戏画布然后启动游戏线程:voidmenuListNewGame(){myCanvasinit()初始化游戏数据DisplaygetDisplay(this)setCurrent(myCanvas)显示游戏画布myCanvasstart()启动游戏线程}从菜单中选择显示高分纪录注意每次都动态生成一个高分纪录屏幕使用完后就会销毁以避免在不使用的时候占用堆内存:voidmenuListHighScore(){DisplaygetDisplay(this)setCurrent(newHighScoreScreen(this))显示高分纪录屏幕}从菜单中选择游戏说明和选择显示高分纪录类似:voidmenuListInstructions(){DisplaygetDisplay(this)setCurrent(newInstructionsScreen(this))显示游戏介绍屏幕}游戏如果中断从菜单中选择继续游戏显示游戏画布并重启游戏线程:voidmenuListContinue(){DisplaygetDisplay(this)setCurrent(myCanvas)显示游戏画面myCanvasstart()启动游戏线程}从菜单中选择退出调用quit方法:voidmenuListQuit(){quit()退出游戏}从游戏介绍退回菜单将显示权交还游戏菜单:voidinstructionsBack(){DisplaygetDisplay(this)setCurrent(menuList)显示游戏菜单}从高分榜退回菜单将显示权交还游戏菜单:voidhighScoreBack(){DisplaygetDisplay(this)setCurrent(menuList)显示游戏菜单}从游戏中切换到菜单需要中止游戏线程并且告知菜单游戏正在进行中以便让菜单添加继续游戏的选项:voidGameCanvasMenu()JME手机游戏设计··{myCanvasstop()暂停游戏线程menuListsetGameActive(true)告知菜单游戏已经开始(暂停状态)DisplaygetDisplay(this)setCurrent(menuList)显示游戏菜单}显示游戏结束画面需要告诉GameOverScreen类当前的最好成绩以及子弹的数目同时告诉菜单游戏已经结束:voidGameCanvasGameOver(longtime,intBULLETSNUM){myCanvasstop()中止游戏线程menuListsetGameActive(false)告知游戏已经结束DisplaygetDisplay(this)setCurrent(newGameOverScreen(this,time,BULLETSNUM))结束画面}从游戏结束画面返回在屏幕上显示菜单:voidgameOverDone(){DisplaygetDisplay(this)setCurrent(menuList)显示游戏菜单}.最佳纪录读取存储游戏纪录以及检查是否存在最佳纪录的工作也是在这里进行的。读取游戏存储记录的功能在readRecordStore方法中实现。在MIDlet类的开始指定了rms记录的名称用静态字符串常量表示:privatestaticfinalStringRSNAME="BESTTIME"读取方法的代码如下hasBestTime标志位用来表明当前是否有最佳成绩。注意如果该记录不存在也不用创建它而是在写入记录的时候加以创建此外rms的数据记录是从第一条开始的:privatevoidreadRecordStore(){hasBestTime=false读取记录还没有获得最好成绩RecordStorers=ByteArrayInputStreambais=DataInputStreamdis=try{rs=RecordStoreopenRecordStore(RSNAME,false)记录名为RSNAME的字符串bytedata=rsgetRecord()读取第一条记录bais=newByteArrayInputStream(data)dis=newDataInputStream(bais)bestTime=disreadLong()读取长整型值hasBestTime=true以及从记录中获得最佳成绩}catch(IOExceptionex){捕获IO异常}catch(RecordStoreExceptionex){第章单屏游戏的设计与实现··捕获读取存储记录异常}finally{if(dis!=){try{disclose()关闭流}catc

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/11

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利