版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、学习情境6 游戏进度的保存,能力目标,熟练掌握记录集的打开、关闭、删除方法; 熟练掌握利用抛出的异常,处理打开或者新建记录集; 掌握获取记录集名称等其他相关信息的方法; 熟练地掌握添加、修改、获取相关的记录数据; 掌握将多种不同类型数据保存在一条记录中; 使用数据流容器,进行各种类型与字节型数据之间的转换; 利用记录集记录最高分成绩; 培养综合运用RMS解决问题的能力; 掌握比较数据和插入数据的算法。 ,认知目标,了解记录集和记录的概念; 理解RecordStore类; 理解RecordStore类的存储结构; 了解RecordStore类中的异常含义; 了解记录最高分的必要性; 识记通过数据
2、流进行数据转换的方法; 理解记录ID的重要性。 识记操作记录集的常用方法; 识记操作记录的常用方法。 ,6.1 学习情景描述,人们一般都是利用等车、坐车、工作间隙等短暂片刻,通过玩手机游戏来放松心情、打发无聊时光。这样的时间段非常容易被打断,需要有一种方法,将正在进行的游戏进行存储,在下一次打开程序的时候能够继续游戏。尤其对于那些闯关游戏,需要有一个积累的过程,此时保存游戏的进度就显得尤为重要了。,本学习情境分为三个学习单元来完成。单元一,操作记录集,用以保存游戏的进度;单元二,保存最高分记录;单元三,实现排行榜。,本学习单元的主要任务:在游戏过程,如果单击“返回”按钮,提示是否保存游戏,如果
3、“保存”,则在下次打开游戏的时候,显示二级子菜单,提示玩家是“继续游戏”,还是“开始新游戏”?,6.2 操作记录集,6.2.1 单元任务总述,6.2.2 知识准备:认识记录存储系统,MIDP框架为MIDlet应用程序提供了一个存储数据的机制,使得数据可以持久保存,并可以在需要的时候进行读取。这个持久存储机制称为记录存储系统RMS(Record Management System)。 RMS是用来管理记录的系统,是记录的有序集合。每一条记录必须从属于一个记录集,记录集保证记录读写的自动运行。 程序保存在打包后的jar文件中,而保存数据的记录集,则是保存在无线移动设备的系统中,他不会因为断电、关机
4、等原因被删除,系统会尽可能地永久保存。当相应的MIDlet应用程序被删除或者被卸载时,相应的记录集也会被系统自动删除。,(1) 打开RMS类,实现如下步骤: 声明对象 自定义打开/创建记录集的方法 自定义关闭记录集的方法 自定义删除记录集的方法 自定义获取记录集名的方法 (2) 打开GamebBody类,实现如下步骤: 添加对象声明 修改keyPressed()方法 (3) 在MIDlet的startApp()方法中,获取已存在的记录集的名称,并在控制台输出。 (4) 运行测试,(1) 新建MIDlet工程,工程名为“Ch6_Unit1”。 (2) 将Ch5_Unit2中完成的源代码文件拷贝到
5、工程的src文件夹下。 (3) 在工程中添加一个RMS类,在该类中将实现记录存储的基本功能。 (4) 将相关资源文件拷贝到工程的res文件夹下。,任务准备,实现过程,6.2.3 任务一:保存游戏进度,知识提炼: 操作记录集,(1) 打开/创建记录集 protected static RecordStore openRecordStore (String RecordStoreName,boolean CreateIfNecessary) (2) 关闭记录集 public void closeRecordStore() (3) 删除记录集 public static void deleteRec
6、ordStore(String RecordStoreName) (4) 获取记录集名称列表 public static String listRecordStore(),知识拓展::获取记录集信息,(1) 获取记录集的名字 public String getName() (2) 获取记录集的当前版本号 public int getVersion() 小提示:对记录集的每一次变动,版本信息都会增加。 (3) 获取记录集中记录的条数 public int getNumRecords() (4) 获取记录集所占空间的字节数 public int getSize() 小提示:利用该方法返回的空间字节
7、数不仅包含数据,还包含保存记录存储状态的数据结构等其他信息。 (5) 获取记录集目前可利用的字节数 public int getSizeAvailable() (6) 获取记录集最后被修改的时间 public long getLastModified(),6.2.4 任务二:读取游戏进度,继续游戏,(1) 打开StartCanvas类,书写代码,实现如下功能: 添加声明; 在构造方法中加载二级子菜单图片; 自定义绘制二级子菜单的drawSubMenu()方法; 自定义方法subMenuKeyPressed(),实现二级子菜单的键盘响应; 在paint()方法里,实现二级子菜单的绘制; 在key
8、Pressed()方法中,调用subMenuKeyPressed()方法,实现对二级子菜单的键盘响应。 (2) 修改MIDlet的startApp()方法 (3) 运行测试,实现过程,要点提示:制作二级子菜单,在本任务中,给定了二个子菜单图片资源,如下所示:,子菜单图片1,子菜单图片2,对于给定的这两个子菜单图片资源,可以有两种设计思路: (1)使用精灵; (2)使用setClip()和drawImage()结合使用的方法。 本任务中,使用的是第二种设计思路。,6.3 保存最高分记录,6.3.1 单元任务总述,对于积分类的游戏,最高分的保存非常重要,在游戏过程,可以让玩家有一个对比和想获取更多
9、积分的欲望。 上一单元是针对闯关游戏的进度保存,而本单元是针对积分游戏的最高分保存,实现思路上有一定区别,因此本单元并不是在上一单元的基础之上来实现的。 本单元的主要任务是在记录集中保存获得最高分的玩家姓名及分数,在游戏中显示记录中的最高分,如果玩家的得分要比记录中的要高,则提示输入玩家姓名,刷新记录。,6.3.2 任务三:保存最高分,(1) 打开RMS类,实现如下步骤: 添加变量声明 修改openRecords()方法 自定义addRecord()方法 自定义getRecord()方法 自定义的setRecord()方法 自定义delRecord()方法,(1) 新建MIDlet工程,工程名
10、为“Ch6_Unit2”。 (2) 将Ch5_Unit2中完成的源代码文件拷贝到工程的src文件夹下。 (3) 将Ch6_Unit1中完成的RMS类文件拷贝到工程的src文件夹下。 (4) 将相关资源文件拷贝到工程的res文件夹下。,任务准备,实现过程,(2) 打开GamebBody类 添加对象声明; 修改初始化方法init(); 修改drawGameScreen()方法,在绘制当前得分的语句后面,添加绘制最高分语句; 修改keyPressed()方法。 (3) 运行测试,知识提炼:操作记录,(1) 添加记录 public int addRecord(byte data, int offset
11、, int numBytes) (2) 获取记录 public byte getRecord(int recordId) public int getRecord(int recordId, byte buffer, int offset) (3) 修改记录 public void setRecord(int recordId, byte newData, int offset, int numBytes) (4) 删除记录 public void deleteRecord(int recordId),小提示:在操作记录时,可能会抛出如下异常: RecordStoreNotOpenExcept
12、ion常:试图访问一个已经关闭的记录集,抛出此异常。 RecordStoreException:记录存储操作出现异常。 RecordStoreFullException:记录集存储溢出抛出此异常。 InvalidRecordIDExeption:记录ID号无效。,6.3.3 任务四:保存玩家姓名和最高分,在任务三的基础之上,继续如下实现过程: (1) 添加一个基于Form组件的InputPlayerNameForm类,并添加代码,实现如下功能: 声明变量 在构造方法中实现页面布局,并注册按钮监听器。 实现commandAction()方法,响应按钮。 (2) 打开GamebBody类,在响应键
13、盘的keyPressed()方法中,修改“返回”按钮的响应代码。 (3) 运行测试,实现过程,6.4 实现排行榜,6.4.1 单元任务总述,在积分类游戏中,排行榜是一个非常重要的游戏环节。当玩家完成游戏后,输入自己的名字,看看自己是不是排在玩游戏的前几名。这样既提高了游戏的可玩性,还可以延长游戏的粘性和寿命。 在本学习单元中,首先,显示排行榜;然后,根据得分,更新排行榜。,6.4.2 任务五:显示排行榜,任务准备 实现过程,(1) 新建MIDlet工程,工程名为“Ch6_Unit3”。 (2) 将Ch6_Unit2中完成的源代码文件拷贝到工程的src文件夹下。 (3) 将相关资源文件拷贝到工程
14、的res文件夹下。,(1) 打开RMS类,实现如下步骤: 声明两个数组,保存排行榜中的玩家姓名和分数。 修改自定义方法openRecords() 修改自定义方法addRecord ()和setRecord () 修改自定义方法getRecord () (2) 打开StartCanvas类,实现如下步骤: 添加变量声明 在构造方法中加载排行榜背景图片 自定义绘制排行榜的drawList()方法 在paint()方法中,调用drawList()方法 在keyDoMenu()方法中,响应右软键,显示排行榜。 在keyPressed()方法中,响应排行榜界面的“返回”功能 (3) 测试运行,要点提示,
15、虽然排行榜上显示的是5个玩家的姓名和得分,但在记录集中并没有保存成5条记录,而是把所需要存储的5个玩家的数据通过一个循环,依次保存到一个byte数组中去,这样就可以只使用一条记录了。这对后面记录的操作和管理将带来很大的便利,一般情况下不会出现ID错误,因为只有一条记录,ID号永远为1,只要对记录内容的的写入和读出顺序保持严格一致就可以。,小提示:排行榜上实际只显示5个玩家的姓名和分数,设置6个数组元素是为了简化更新排行榜的算法。,6.4.3 任务六:更新排行榜,实现过程,在任务五的基础之上,继续如下实现过程: (1) 打开RMS类,实现如下步骤: 自定义isList()方法,判断玩家的分数是否
16、进入了排行榜 自定义updateList()方法,更新排行榜。 (2) 打开GameBody类,在keyPressed()方法中,找到响应“返回”按钮的代码,将语句: if (RMS.topScore score) /如果游戏得分高于保存的最高分 修改成: if (rms.isList(score) /如果游戏得分进入了排行榜 (3) 打开InputPlayerNameForm类,将响应按钮的commandAction()方法修改如下: (4) 运行测试,要点提示:更新排行榜,如果玩家的得分大于排行榜中的最后一个分数(listScore4),则表示进入了排行榜。 更新排行榜时,首先,从排行榜中
17、的最后一个分数开始,依次比较,如果玩家分数大,则将排行榜中的数据向下移动一个位置;如果玩家分数小,则在当前位置插入分数。如下图所示:,6.4.4 知识拓展-遍历记录,由于记录存储中记录的ID号不一定是连续的,所以不能象在数组中那样通过下标索引进行元素的遍历。 RecordEnumeration接口返回一个包含记录存储中所有有效记录ID号的记录枚举集,从逻辑上维护了记录ID号的连续性。该接口提供了正向和逆向两种遍历记录的方法。并且通过使用RecordFilter过滤器和RecordComparator比较器提供了筛选和排序功能。 由于RecordEnumeration是接口,无法通过构造方法创建
18、对象实例。RecordStore类提供了enumerateRecords()方法来获取一个包含当前记录存储有效ID号的RecordEnumeration接口实例。语法如下: public RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparaor, boolean keepUpdate),RecordEnumeration接口中定义的方法有: (1) public int numRecords():此方法返回枚举集中的有效记录数。 (2) public byte nextRecord():
19、返回下一条记录数据。 (3) public int nextRecordId():返回下一条记录的ID号。 (4) public byte previousRecord():返回上一条记录数据。 (5) public int previousRecordId():返回上一条记录的ID号。 (6) public boolean hasNextElement():判断是否存在下一条记录。 (7) public boolean hasPreviousElement():判断是否存在上一条记录。 (8) public void reset():使用此方法可以使枚举集索引保持正确状态。 (9) publ
20、ic void rebuild():更新枚举集以反映当前记录集。 (10) public void keepUpdated(boolean keepUpdated):设置枚举集和记录集是否保持同步。 (11) public boolean isKeptUpdated():判断枚举集和记录集是否同步。 (12) public void destroy():释放RecordEnumeration接口占有的资源。,6.4.4 知识拓展-过滤和比较记录,RecordFilter接口用于过滤满足指定条件的记录子集。在该接口中定义了一个唯一的方法matches(),用于检测一个记录是否满足应用程序定义的标
21、准。语法如下: public Boolean matches(byte candidate) 参数candidate代表一个记录,如果参数和标准相匹配,则返回trure。,RecordComparator接口用于将枚举集中的记录按应用程序要求进行排序。在该接口中定义了一个唯一的方法compare(),完成两个候选记录的顺序比较。语法如下: public int compare(byte rec1, byte rec2) 该方法的返回值是定义在RecordComparator接口中的常量,如果记录rec1的排列顺序先于rec2,则返回RecordComparator.PRECEDES,如果记录r
22、ec1位于rec2之后,则返回RecordComparator.FOLLOWS,如果相等,则返回RecordComparator.EQUIVALENT。,6.4.4 知识拓展-响应记录事件,RMS采用事件监听机制检测记录存储的状态改变。当为记录存储RecordStore类注册了RecordListener事件监听器后,记录存储状态的改变都将被系统自动捕获。RecordStore类注册RecordListener事件监听器方法的语法如下: public void addRecordListener(RecordListener listener) RecordListener接口用于接收来自记录
23、集改变的事件,该接口共定义了三个方法,分别用于响应添加记录事件、修改记录事件和删除记录事件。语法如下: public void recordAdded(RecordStore recordStore, int recordId) public void recordChanged(RecordStore recordStore, int recordId) public void recordDeleted(RecordStore recordStore, int recordId) 参数说明: recordStore:存储记录的记录存储。 recordId:发生改变的记录ID号。,本章小结,
24、RMS是用来管理记录的系统,是记录的有序集合。在RMS中,一条记录只包含一个大小可变的二进制字段。不管记录的内容是数字、字符串、数组或图象,都是以一段连续的字节型数据形式存在。 RecordStore类包含了操作记录和记录集的方法。 1. 操作记录集 (1) 打开/创建记录集 protected static RecordStore openRecordStore (String RecordStoreName,boolean CreateIfNecessary) (2) 关闭记录集 public void closeRecordStore() (3) 删除记录集 public static void deleteRecordStore(String RecordStoreName) (4) 获取记录集名称列表 public static String listRecordStore(),(5) 获取记录集的名字 public String getName() (6) 获取记录集的当前版本号 public int getVersion() (7) 获取记录集中记录的条数 public int getNumRecords() (8) 获取记录集所占空间的字节数 public int ge
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度二零二五年度人工智能研发聘用合同详尽版2篇
- 2025年度交通枢纽门卫安全责任书3篇
- 2024年高端装备制造业基地施工分包合同
- 2025年未实缴出资股份交易合同范本及风险提示3篇
- 二零二四年度2024权合作合同范本:信息安全服务合作协议3篇
- 2025年度绿色屋顶绿化设计与植物养护服务合同4篇
- 2025年度智能工厂安防监控系统集成合同范本2篇
- 二零二五版环保管家技术服务合同样本:环保设施投资合作3篇
- 2025年涂装劳务分包合同范本大全:涂装工艺创新3篇
- 个人劳务合同书电子版
- 名表买卖合同协议书
- COCA20000词汇音标版表格
- 沪教版七年级数学上册专题06图形的运动(原卷版+解析)
- JTG-T-F20-2015公路路面基层施工技术细则
- 光伏发电站集中监控系统通信及数据标准
- 建筑垃圾减排及资源化处置措施
- 2024年辽宁石化职业技术学院单招职业适应性测试题库附答案
- 中西方校服文化差异研究
- 2024年一级建造师考试思维导图-市政
- 高压架空输电线路反事故措施培训课件
- 隐私计算技术与数据安全保护
评论
0/150
提交评论