




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习情境6游戏进度的保存,能力目标,熟练掌握记录集的打开、关闭、删除方法;熟练掌握利用抛出的异常,处理打开或者新建记录集;掌握获取记录集名称等其他相关信息的方法;熟练地掌握添加、修改、获取相关的记录数据;掌握将多种不同类型数据保存在一条记录中;使用数据流容器,进行各种类型与字节型数据之间的转换;利用记录集记录最高分成绩;培养综合运用RMS解决问题的能力;掌握比较数据和插入数据的算法。,认知目标,了解记录集和记录的概念;理解RecordStore类;理解RecordStore类的存储结构;了解RecordStore类中的异常含义;了解记录最高分的必要性;识记通过数据流进行数据转换的方法;理解记录ID的重要性。识记操作记录集的常用方法;识记操作记录的常用方法。,6.1学习情景描述,人们一般都是利用等车、坐车、工作间隙等短暂片刻,通过玩手机游戏来放松心情、打发无聊时光。这样的时间段非常容易被打断,需要有一种方法,将正在进行的游戏进行存储,在下一次打开程序的时候能够继续游戏。尤其对于那些闯关游戏,需要有一个积累的过程,此时保存游戏的进度就显得尤为重要了。,本学习情境分为三个学习单元来完成。单元一,操作记录集,用以保存游戏的进度;单元二,保存最高分记录;单元三,实现排行榜。,本学习单元的主要任务:在游戏过程,如果单击“返回”按钮,提示是否保存游戏,如果“保存”,则在下次打开游戏的时候,显示二级子菜单,提示玩家是“继续游戏”,还是“开始新游戏”?,6.2操作记录集,6.2.1单元任务总述,6.2.2知识准备:认识记录存储系统,MIDP框架为MIDlet应用程序提供了一个存储数据的机制,使得数据可以持久保存,并可以在需要的时候进行读取。这个持久存储机制称为记录存储系统RMS(RecordManagementSystem)。RMS是用来管理记录的系统,是记录的有序集合。每一条记录必须从属于一个记录集,记录集保证记录读写的自动运行。程序保存在打包后的jar文件中,而保存数据的记录集,则是保存在无线移动设备的系统中,他不会因为断电、关机等原因被删除,系统会尽可能地永久保存。当相应的MIDlet应用程序被删除或者被卸载时,相应的记录集也会被系统自动删除。,(1)打开RMS类,实现如下步骤:声明对象自定义打开/创建记录集的方法自定义关闭记录集的方法自定义删除记录集的方法自定义获取记录集名的方法(2)打开GamebBody类,实现如下步骤:添加对象声明修改keyPressed()方法(3)在MIDlet的startApp()方法中,获取已存在的记录集的名称,并在控制台输出。(4)运行测试,(1)新建MIDlet工程,工程名为“Ch6_Unit1”。(2)将Ch5_Unit2中完成的源代码文件拷贝到工程的src文件夹下。(3)在工程中添加一个RMS类,在该类中将实现记录存储的基本功能。(4)将相关资源文件拷贝到工程的res文件夹下。,任务准备,实现过程,6.2.3任务一:保存游戏进度,知识提炼:操作记录集,(1)打开/创建记录集protectedstaticRecordStoreopenRecordStore(StringRecordStoreName,booleanCreateIfNecessary)(2)关闭记录集publicvoidcloseRecordStore()(3)删除记录集publicstaticvoiddeleteRecordStore(StringRecordStoreName)(4)获取记录集名称列表publicstaticStringlistRecordStore(),知识拓展::获取记录集信息,(1)获取记录集的名字publicStringgetName()(2)获取记录集的当前版本号publicintgetVersion()小提示:对记录集的每一次变动,版本信息都会增加。(3)获取记录集中记录的条数publicintgetNumRecords()(4)获取记录集所占空间的字节数publicintgetSize()小提示:利用该方法返回的空间字节数不仅包含数据,还包含保存记录存储状态的数据结构等其他信息。(5)获取记录集目前可利用的字节数publicintgetSizeAvailable()(6)获取记录集最后被修改的时间publiclonggetLastModified(),6.2.4任务二:读取游戏进度,继续游戏,(1)打开StartCanvas类,书写代码,实现如下功能:添加声明;在构造方法中加载二级子菜单图片;自定义绘制二级子菜单的drawSubMenu()方法;自定义方法subMenuKeyPressed(),实现二级子菜单的键盘响应;在paint()方法里,实现二级子菜单的绘制;在keyPressed()方法中,调用subMenuKeyPressed()方法,实现对二级子菜单的键盘响应。(2)修改MIDlet的startApp()方法(3)运行测试,实现过程,要点提示:制作二级子菜单,在本任务中,给定了二个子菜单图片资源,如下所示:,子菜单图片1,子菜单图片2,对于给定的这两个子菜单图片资源,可以有两种设计思路:(1)使用精灵;(2)使用setClip()和drawImage()结合使用的方法。本任务中,使用的是第二种设计思路。,6.3保存最高分记录,6.3.1单元任务总述,对于积分类的游戏,最高分的保存非常重要,在游戏过程,可以让玩家有一个对比和想获取更多积分的欲望。上一单元是针对闯关游戏的进度保存,而本单元是针对积分游戏的最高分保存,实现思路上有一定区别,因此本单元并不是在上一单元的基础之上来实现的。本单元的主要任务是在记录集中保存获得最高分的玩家姓名及分数,在游戏中显示记录中的最高分,如果玩家的得分要比记录中的要高,则提示输入玩家姓名,刷新记录。,6.3.2任务三:保存最高分,(1)打开RMS类,实现如下步骤:添加变量声明修改openRecords()方法自定义addRecord()方法自定义getRecord()方法自定义的setRecord()方法自定义delRecord()方法,(1)新建MIDlet工程,工程名为“Ch6_Unit2”。(2)将Ch5_Unit2中完成的源代码文件拷贝到工程的src文件夹下。(3)将Ch6_Unit1中完成的RMS类文件拷贝到工程的src文件夹下。(4)将相关资源文件拷贝到工程的res文件夹下。,任务准备,实现过程,(2)打开GamebBody类添加对象声明;修改初始化方法init();修改drawGameScreen()方法,在绘制当前得分的语句后面,添加绘制最高分语句;修改keyPressed()方法。(3)运行测试,知识提炼:操作记录,(1)添加记录publicintaddRecord(bytedata,intoffset,intnumBytes)(2)获取记录publicbytegetRecord(intrecordId)publicintgetRecord(intrecordId,bytebuffer,intoffset)(3)修改记录publicvoidsetRecord(intrecordId,bytenewData,intoffset,intnumBytes)(4)删除记录publicvoiddeleteRecord(intrecordId),小提示:在操作记录时,可能会抛出如下异常:RecordStoreNotOpenException常:试图访问一个已经关闭的记录集,抛出此异常。RecordStoreException:记录存储操作出现异常。RecordStoreFullException:记录集存储溢出抛出此异常。InvalidRecordIDExeption:记录ID号无效。,6.3.3任务四:保存玩家姓名和最高分,在任务三的基础之上,继续如下实现过程:(1)添加一个基于Form组件的InputPlayerNameForm类,并添加代码,实现如下功能:声明变量在构造方法中实现页面布局,并注册按钮监听器。实现commandAction()方法,响应按钮。(2)打开GamebBody类,在响应键盘的keyPressed()方法中,修改“返回”按钮的响应代码。(3)运行测试,实现过程,6.4实现排行榜,6.4.1单元任务总述,在积分类游戏中,排行榜是一个非常重要的游戏环节。当玩家完成游戏后,输入自己的名字,看看自己是不是排在玩游戏的前几名。这样既提高了游戏的可玩性,还可以延长游戏的粘性和寿命。在本学习单元中,首先,显示排行榜;然后,根据得分,更新排行榜。,6.4.2任务五:显示排行榜,任务准备实现过程,(1)新建MIDlet工程,工程名为“Ch6_Unit3”。(2)将Ch6_Unit2中完成的源代码文件拷贝到工程的src文件夹下。(3)将相关资源文件拷贝到工程的res文件夹下。,(1)打开RMS类,实现如下步骤:声明两个数组,保存排行榜中的玩家姓名和分数。修改自定义方法openRecords()修改自定义方法addRecord()和setRecord()修改自定义方法getRecord()(2)打开StartCanvas类,实现如下步骤:添加变量声明在构造方法中加载排行榜背景图片自定义绘制排行榜的drawList()方法在paint()方法中,调用drawList()方法在keyDoMenu()方法中,响应右软键,显示排行榜。在keyPressed()方法中,响应排行榜界面的“返回”功能(3)测试运行,要点提示,虽然排行榜上显示的是5个玩家的姓名和得分,但在记录集中并没有保存成5条记录,而是把所需要存储的5个玩家的数据通过一个循环,依次保存到一个byte数组中去,这样就可以只使用一条记录了。这对后面记录的操作和管理将带来很大的便利,一般情况下不会出现ID错误,因为只有一条记录,ID号永远为1,只要对记录内容的的写入和读出顺序保持严格一致就可以。,小提示:排行榜上实际只显示5个玩家的姓名和分数,设置6个数组元素是为了简化更新排行榜的算法。,6.4.3任务六:更新排行榜,实现过程,在任务五的基础之上,继续如下实现过程:(1)打开RMS类,实现如下步骤:自定义isList()方法,判断玩家的分数是否进入了排行榜自定义updateList()方法,更新排行榜。(2)打开GameBody类,在keyPressed()方法中,找到响应“返回”按钮的代码,将语句:if(RMS.topScorescore)/如果游戏得分高于保存的最高分修改成:if(rms.isList(score)/如果游戏得分进入了排行榜(3)打开InputPlayerNameForm类,将响应按钮的commandAction()方法修改如下:(4)运行测试,要点提示:更新排行榜,如果玩家的得分大于排行榜中的最后一个分数(listScore4),则表示进入了排行榜。更新排行榜时,首先,从排行榜中的最后一个分数开始,依次比较,如果玩家分数大,则将排行榜中的数据向下移动一个位置;如果玩家分数小,则在当前位置插入分数。如下图所示:,6.4.4知识拓展-遍历记录,由于记录存储中记录的ID号不一定是连续的,所以不能象在数组中那样通过下标索引进行元素的遍历。RecordEnumeration接口返回一个包含记录存储中所有有效记录ID号的记录枚举集,从逻辑上维护了记录ID号的连续性。该接口提供了正向和逆向两种遍历记录的方法。并且通过使用RecordFilter过滤器和RecordComparator比较器提供了筛选和排序功能。由于RecordEnumeration是接口,无法通过构造方法创建对象实例。RecordStore类提供了enumerateRecords()方法来获取一个包含当前记录存储有效ID号的RecordEnumeration接口实例。语法如下:publicRecordEnumerationenumerateRecords(RecordFilterfilter,RecordComparatorcomparaor,booleankeepUpdate),RecordEnumeration接口中定义的方法有:(1)publicintnumRecords():此方法返回枚举集中的有效记录数。(2)publicbytenextRecord():返回下一条记录数据。(3)publicintnextRecordId():返回下一条记录的ID号。(4)publicbytepreviousRecord():返回上一条记录数据。(5)publicintpreviousRecordId():返回上一条记录的ID号。(6)publicbooleanhasNextElement():判断是否存在下一条记录。(7)publicbooleanhasPreviousElement():判断是否存在上一条记录。(8)publicvoidreset():使用此方法可以使枚举集索引保持正确状态。(9)publicvoidrebuild():更新枚举集以反映当前记录集。(10)publicvoidkeepUpdated(booleankeepUpdated):设置枚举集和记录集是否保持同步。(11)publicbooleanisKeptUpdated():判断枚举集和记录集是否同步。(12)publicvoiddestroy():释放RecordEnumeration接口占有的资源。,6.4.4知识拓展-过滤和比较记录,RecordFilter接口用于过滤满足指定条件的记录子集。在该接口中定义了一个唯一的方法matches(),用于检测一个记录是否满足应用程序定义的标准。语法如下:publicBooleanmatches(bytecandidate)参数candidate代表一个记录,如果参数和标准相匹配,则返回trure。,RecordComparator接口用于将枚举集中的记录按应用程序要求进行排序。在该接口中定义了一个唯一的方法compare(),完成两个候选记录的顺序比较。语法如下:publicintcompare(byterec1,byterec2)该方法的返回值是定义在RecordComparator接口中的常量,如果记录rec1的排列顺序先于rec2,则返回RecordComparator.PRECEDES,如果记录rec1位于rec2之后,则返回RecordComparator.FOLLOWS,如果相等,则返回RecordComparator.EQUIVALENT。,6.4.4知识拓展-响应记录事件,RMS采用事件监听机制检测记录存储的状态改变。当为记录存储RecordStore类注册了RecordListener事件监听器后,记录存储状态的改变都将被系统自动捕获。RecordStore类注册RecordListener事件监听器方法的语法如下:publicvoidaddRecordListener(RecordListenerlistener)RecordListener接口用于接收来自记录集改变的事件,该接口共定义了三个方法,分别用于响应添加记录事件、修改记录事件和删除记录事件。语法如下:publicvoidrecordAdded(RecordStorerecordStore,intrecordId)publicvoidrecordChanged(RecordStorerecordStore,intrecordId)publicvoidrecordDeleted(RecordStorerecordStore,intrecordId)参数说明:recordStore:存储记录的记录存储。recordId:发生改变的记录ID号。,本章小结,RMS是用来管理记录的系统,是记录的有序集合。在RMS中,一条记录只包含一个大小可变的二进制字段。不管记录的内容是数字、字符串、数组或图象,都是以一段连续的字节型数据形式存在。RecordStore类包含了操作记录和记录集的方法。1.操作记录集(1)打开/创建记录集protectedstaticRecordStoreopenRecordStore(StringRecordStoreName,booleanCreateIfNecessary)(2)关闭记录集publicvoidcloseRecordStore()(3)删除记录集publicstaticvoiddeleteRecordStore(StringRecordStoreName)(4)获取记录集名称列表publicstaticStringlistRecordStore(),(5)获取记录集的名字publicStringgetName()(6)获取记录集的当前版本号publicintgetVersion()(7)获取记录集中记录的条数publicintgetNumRecords()(8)获取记录集所占
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美丽拼音教学课件
- 员工感恩培训
- 技术部考试试题及答案
- 交通银行2025宿州市半结构化面试15问及话术
- 邮储银行2025白城市秋招面试典型题目及参考答案
- 中国银行2025黄石市秋招群面案例总结模板
- 2025年3D打印的金属成型工艺
- 2025年3D打印的药物递送系统
- 中国银行2025阳泉市笔试英文行测高频题含答案
- 农业银行2025成都市秋招群面案例总结模板
- 自动喷灌设计说明及安装大样
- 杭州市“教坛新秀”理论考试简答题汇总
- 酿酒系统安全培训课件
- 2018年全国成人高考专升本政治试题答案
- 人教版(2019)必修三 Unit 3 Diverse Cultures Listening and Talking课件
- 医养结合机构服务质量评价标准(二级医养结合机构)
- 三年级上册数学课件-4.2 两、三位数除以一位数的笔算丨苏教版 (共34张PPT)
- 卡西欧PRO-TREK-PRW-6000使用手册-基础操作
- 建筑结构试验知识点总结
- 2022年公路工程竣交工验收办法实施细则范文
- 日本川崎市武藏小杉格林木(GrandTree)创新型购物中心调研分析报告课件
评论
0/150
提交评论