




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、學(xué)習(xí)情境6 游戲進(jìn)度的保存,能力目標(biāo),熟練掌握記錄集的打開(kāi)、關(guān)閉、刪除方法; 熟練掌握利用拋出的異常,處理打開(kāi)或者新建記錄集; 掌握獲取記錄集名稱等其他相關(guān)信息的方法; 熟練地掌握添加、修改、獲取相關(guān)的記錄數(shù)據(jù); 掌握將多種不同類型數(shù)據(jù)保存在一條記錄中; 使用數(shù)據(jù)流容器,進(jìn)行各種類型與字節(jié)型數(shù)據(jù)之間的轉(zhuǎn)換; 利用記錄集記錄最高分成績(jī); 培養(yǎng)綜合運(yùn)用RMS解決問(wèn)題的能力; 掌握比較數(shù)據(jù)和插入數(shù)據(jù)的算法。 ,認(rèn)知目標(biāo),了解記錄集和記錄的概念; 理解RecordStore類; 理解RecordStore類的存儲(chǔ)結(jié)構(gòu); 了解RecordStore類中的異常含義; 了解記錄最高分的必要性; 識(shí)記通過(guò)數(shù)據(jù)
2、流進(jìn)行數(shù)據(jù)轉(zhuǎn)換的方法; 理解記錄ID的重要性。 識(shí)記操作記錄集的常用方法; 識(shí)記操作記錄的常用方法。 ,6.1 學(xué)習(xí)情景描述,人們一般都是利用等車、坐車、工作間隙等短暫片刻,通過(guò)玩手機(jī)游戲來(lái)放松心情、打發(fā)無(wú)聊時(shí)光。這樣的時(shí)間段非常容易被打斷,需要有一種方法,將正在進(jìn)行的游戲進(jìn)行存儲(chǔ),在下一次打開(kāi)程序的時(shí)候能夠繼續(xù)游戲。尤其對(duì)于那些闖關(guān)游戲,需要有一個(gè)積累的過(guò)程,此時(shí)保存游戲的進(jìn)度就顯得尤為重要了。,本學(xué)習(xí)情境分為三個(gè)學(xué)習(xí)單元來(lái)完成。單元一,操作記錄集,用以保存游戲的進(jìn)度;單元二,保存最高分記錄;單元三,實(shí)現(xiàn)排行榜。,本學(xué)習(xí)單元的主要任務(wù):在游戲過(guò)程,如果單擊“返回”按鈕,提示是否保存游戲,如果
3、“保存”,則在下次打開(kāi)游戲的時(shí)候,顯示二級(jí)子菜單,提示玩家是“繼續(xù)游戲”,還是“開(kāi)始新游戲”?,6.2 操作記錄集,6.2.1 單元任務(wù)總述,6.2.2 知識(shí)準(zhǔn)備:認(rèn)識(shí)記錄存儲(chǔ)系統(tǒng),MIDP框架為MIDlet應(yīng)用程序提供了一個(gè)存儲(chǔ)數(shù)據(jù)的機(jī)制,使得數(shù)據(jù)可以持久保存,并可以在需要的時(shí)候進(jìn)行讀取。這個(gè)持久存儲(chǔ)機(jī)制稱為記錄存儲(chǔ)系統(tǒng)RMS(Record Management System)。 RMS是用來(lái)管理記錄的系統(tǒng),是記錄的有序集合。每一條記錄必須從屬于一個(gè)記錄集,記錄集保證記錄讀寫(xiě)的自動(dòng)運(yùn)行。 程序保存在打包后的jar文件中,而保存數(shù)據(jù)的記錄集,則是保存在無(wú)線移動(dòng)設(shè)備的系統(tǒng)中,他不會(huì)因?yàn)閿嚯?、關(guān)機(jī)
4、等原因被刪除,系統(tǒng)會(huì)盡可能地永久保存。當(dāng)相應(yīng)的MIDlet應(yīng)用程序被刪除或者被卸載時(shí),相應(yīng)的記錄集也會(huì)被系統(tǒng)自動(dòng)刪除。,(1) 打開(kāi)RMS類,實(shí)現(xiàn)如下步驟: 聲明對(duì)象 自定義打開(kāi)/創(chuàng)建記錄集的方法 自定義關(guān)閉記錄集的方法 自定義刪除記錄集的方法 自定義獲取記錄集名的方法 (2) 打開(kāi)GamebBody類,實(shí)現(xiàn)如下步驟: 添加對(duì)象聲明 修改keyPressed()方法 (3) 在MIDlet的startApp()方法中,獲取已存在的記錄集的名稱,并在控制臺(tái)輸出。 (4) 運(yùn)行測(cè)試,(1) 新建MIDlet工程,工程名為“Ch6_Unit1”。 (2) 將Ch5_Unit2中完成的源代碼文件拷貝到
5、工程的src文件夾下。 (3) 在工程中添加一個(gè)RMS類,在該類中將實(shí)現(xiàn)記錄存儲(chǔ)的基本功能。 (4) 將相關(guān)資源文件拷貝到工程的res文件夾下。,任務(wù)準(zhǔn)備,實(shí)現(xiàn)過(guò)程,6.2.3 任務(wù)一:保存游戲進(jìn)度,知識(shí)提煉: 操作記錄集,(1) 打開(kāi)/創(chuàng)建記錄集 protected static RecordStore openRecordStore (String RecordStoreName,boolean CreateIfNecessary) (2) 關(guān)閉記錄集 public void closeRecordStore() (3) 刪除記錄集 public static void deleteRec
6、ordStore(String RecordStoreName) (4) 獲取記錄集名稱列表 public static String listRecordStore(),知識(shí)拓展::獲取記錄集信息,(1) 獲取記錄集的名字 public String getName() (2) 獲取記錄集的當(dāng)前版本號(hào) public int getVersion() 小提示:對(duì)記錄集的每一次變動(dòng),版本信息都會(huì)增加。 (3) 獲取記錄集中記錄的條數(shù) public int getNumRecords() (4) 獲取記錄集所占空間的字節(jié)數(shù) public int getSize() 小提示:利用該方法返回的空間字節(jié)
7、數(shù)不僅包含數(shù)據(jù),還包含保存記錄存儲(chǔ)狀態(tài)的數(shù)據(jù)結(jié)構(gòu)等其他信息。 (5) 獲取記錄集目前可利用的字節(jié)數(shù) public int getSizeAvailable() (6) 獲取記錄集最后被修改的時(shí)間 public long getLastModified(),6.2.4 任務(wù)二:讀取游戲進(jìn)度,繼續(xù)游戲,(1) 打開(kāi)StartCanvas類,書(shū)寫(xiě)代碼,實(shí)現(xiàn)如下功能: 添加聲明; 在構(gòu)造方法中加載二級(jí)子菜單圖片; 自定義繪制二級(jí)子菜單的drawSubMenu()方法; 自定義方法subMenuKeyPressed(),實(shí)現(xiàn)二級(jí)子菜單的鍵盤(pán)響應(yīng); 在paint()方法里,實(shí)現(xiàn)二級(jí)子菜單的繪制; 在key
8、Pressed()方法中,調(diào)用subMenuKeyPressed()方法,實(shí)現(xiàn)對(duì)二級(jí)子菜單的鍵盤(pán)響應(yīng)。 (2) 修改MIDlet的startApp()方法 (3) 運(yùn)行測(cè)試,實(shí)現(xiàn)過(guò)程,要點(diǎn)提示:制作二級(jí)子菜單,在本任務(wù)中,給定了二個(gè)子菜單圖片資源,如下所示:,子菜單圖片1,子菜單圖片2,對(duì)于給定的這兩個(gè)子菜單圖片資源,可以有兩種設(shè)計(jì)思路: (1)使用精靈; (2)使用setClip()和drawImage()結(jié)合使用的方法。 本任務(wù)中,使用的是第二種設(shè)計(jì)思路。,6.3 保存最高分記錄,6.3.1 單元任務(wù)總述,對(duì)于積分類的游戲,最高分的保存非常重要,在游戲過(guò)程,可以讓玩家有一個(gè)對(duì)比和想獲取更多
9、積分的欲望。 上一單元是針對(duì)闖關(guān)游戲的進(jìn)度保存,而本單元是針對(duì)積分游戲的最高分保存,實(shí)現(xiàn)思路上有一定區(qū)別,因此本單元并不是在上一單元的基礎(chǔ)之上來(lái)實(shí)現(xiàn)的。 本單元的主要任務(wù)是在記錄集中保存獲得最高分的玩家姓名及分?jǐn)?shù),在游戲中顯示記錄中的最高分,如果玩家的得分要比記錄中的要高,則提示輸入玩家姓名,刷新記錄。,6.3.2 任務(wù)三:保存最高分,(1) 打開(kāi)RMS類,實(shí)現(xiàn)如下步驟: 添加變量聲明 修改openRecords()方法 自定義addRecord()方法 自定義getRecord()方法 自定義的setRecord()方法 自定義delRecord()方法,(1) 新建MIDlet工程,工程名
10、為“Ch6_Unit2”。 (2) 將Ch5_Unit2中完成的源代碼文件拷貝到工程的src文件夾下。 (3) 將Ch6_Unit1中完成的RMS類文件拷貝到工程的src文件夾下。 (4) 將相關(guān)資源文件拷貝到工程的res文件夾下。,任務(wù)準(zhǔn)備,實(shí)現(xiàn)過(guò)程,(2) 打開(kāi)GamebBody類 添加對(duì)象聲明; 修改初始化方法init(); 修改drawGameScreen()方法,在繪制當(dāng)前得分的語(yǔ)句后面,添加繪制最高分語(yǔ)句; 修改keyPressed()方法。 (3) 運(yùn)行測(cè)試,知識(shí)提煉:操作記錄,(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),小提示:在操作記錄時(shí),可能會(huì)拋出如下異常: RecordStoreNotOpenExcept
12、ion常:試圖訪問(wèn)一個(gè)已經(jīng)關(guān)閉的記錄集,拋出此異常。 RecordStoreException:記錄存儲(chǔ)操作出現(xiàn)異常。 RecordStoreFullException:記錄集存儲(chǔ)溢出拋出此異常。 InvalidRecordIDExeption:記錄ID號(hào)無(wú)效。,6.3.3 任務(wù)四:保存玩家姓名和最高分,在任務(wù)三的基礎(chǔ)之上,繼續(xù)如下實(shí)現(xiàn)過(guò)程: (1) 添加一個(gè)基于Form組件的InputPlayerNameForm類,并添加代碼,實(shí)現(xiàn)如下功能: 聲明變量 在構(gòu)造方法中實(shí)現(xiàn)頁(yè)面布局,并注冊(cè)按鈕監(jiān)聽(tīng)器。 實(shí)現(xiàn)commandAction()方法,響應(yīng)按鈕。 (2) 打開(kāi)GamebBody類,在響應(yīng)鍵
13、盤(pán)的keyPressed()方法中,修改“返回”按鈕的響應(yīng)代碼。 (3) 運(yùn)行測(cè)試,實(shí)現(xiàn)過(guò)程,6.4 實(shí)現(xiàn)排行榜,6.4.1 單元任務(wù)總述,在積分類游戲中,排行榜是一個(gè)非常重要的游戲環(huán)節(jié)。當(dāng)玩家完成游戲后,輸入自己的名字,看看自己是不是排在玩游戲的前幾名。這樣既提高了游戲的可玩性,還可以延長(zhǎng)游戲的粘性和壽命。 在本學(xué)習(xí)單元中,首先,顯示排行榜;然后,根據(jù)得分,更新排行榜。,6.4.2 任務(wù)五:顯示排行榜,任務(wù)準(zhǔn)備 實(shí)現(xiàn)過(guò)程,(1) 新建MIDlet工程,工程名為“Ch6_Unit3”。 (2) 將Ch6_Unit2中完成的源代碼文件拷貝到工程的src文件夾下。 (3) 將相關(guān)資源文件拷貝到工程
14、的res文件夾下。,(1) 打開(kāi)RMS類,實(shí)現(xiàn)如下步驟: 聲明兩個(gè)數(shù)組,保存排行榜中的玩家姓名和分?jǐn)?shù)。 修改自定義方法openRecords() 修改自定義方法addRecord ()和setRecord () 修改自定義方法getRecord () (2) 打開(kāi)StartCanvas類,實(shí)現(xiàn)如下步驟: 添加變量聲明 在構(gòu)造方法中加載排行榜背景圖片 自定義繪制排行榜的drawList()方法 在paint()方法中,調(diào)用drawList()方法 在keyDoMenu()方法中,響應(yīng)右軟鍵,顯示排行榜。 在keyPressed()方法中,響應(yīng)排行榜界面的“返回”功能 (3) 測(cè)試運(yùn)行,要點(diǎn)提示,
15、雖然排行榜上顯示的是5個(gè)玩家的姓名和得分,但在記錄集中并沒(méi)有保存成5條記錄,而是把所需要存儲(chǔ)的5個(gè)玩家的數(shù)據(jù)通過(guò)一個(gè)循環(huán),依次保存到一個(gè)byte數(shù)組中去,這樣就可以只使用一條記錄了。這對(duì)后面記錄的操作和管理將帶來(lái)很大的便利,一般情況下不會(huì)出現(xiàn)ID錯(cuò)誤,因?yàn)橹挥幸粭l記錄,ID號(hào)永遠(yuǎn)為1,只要對(duì)記錄內(nèi)容的的寫(xiě)入和讀出順序保持嚴(yán)格一致就可以。,小提示:排行榜上實(shí)際只顯示5個(gè)玩家的姓名和分?jǐn)?shù),設(shè)置6個(gè)數(shù)組元素是為了簡(jiǎn)化更新排行榜的算法。,6.4.3 任務(wù)六:更新排行榜,實(shí)現(xiàn)過(guò)程,在任務(wù)五的基礎(chǔ)之上,繼續(xù)如下實(shí)現(xiàn)過(guò)程: (1) 打開(kāi)RMS類,實(shí)現(xiàn)如下步驟: 自定義isList()方法,判斷玩家的分?jǐn)?shù)是否
16、進(jìn)入了排行榜 自定義updateList()方法,更新排行榜。 (2) 打開(kāi)GameBody類,在keyPressed()方法中,找到響應(yīng)“返回”按鈕的代碼,將語(yǔ)句: if (RMS.topScore score) /如果游戲得分高于保存的最高分 修改成: if (rms.isList(score) /如果游戲得分進(jìn)入了排行榜 (3) 打開(kāi)InputPlayerNameForm類,將響應(yīng)按鈕的commandAction()方法修改如下: (4) 運(yùn)行測(cè)試,要點(diǎn)提示:更新排行榜,如果玩家的得分大于排行榜中的最后一個(gè)分?jǐn)?shù)(listScore4),則表示進(jìn)入了排行榜。 更新排行榜時(shí),首先,從排行榜中
17、的最后一個(gè)分?jǐn)?shù)開(kāi)始,依次比較,如果玩家分?jǐn)?shù)大,則將排行榜中的數(shù)據(jù)向下移動(dòng)一個(gè)位置;如果玩家分?jǐn)?shù)小,則在當(dāng)前位置插入分?jǐn)?shù)。如下圖所示:,6.4.4 知識(shí)拓展-遍歷記錄,由于記錄存儲(chǔ)中記錄的ID號(hào)不一定是連續(xù)的,所以不能象在數(shù)組中那樣通過(guò)下標(biāo)索引進(jìn)行元素的遍歷。 RecordEnumeration接口返回一個(gè)包含記錄存儲(chǔ)中所有有效記錄ID號(hào)的記錄枚舉集,從邏輯上維護(hù)了記錄ID號(hào)的連續(xù)性。該接口提供了正向和逆向兩種遍歷記錄的方法。并且通過(guò)使用RecordFilter過(guò)濾器和RecordComparator比較器提供了篩選和排序功能。 由于RecordEnumeration是接口,無(wú)法通過(guò)構(gòu)造方法創(chuàng)建
18、對(duì)象實(shí)例。RecordStore類提供了enumerateRecords()方法來(lái)獲取一個(gè)包含當(dāng)前記錄存儲(chǔ)有效ID號(hào)的RecordEnumeration接口實(shí)例。語(yǔ)法如下: public RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparaor, boolean keepUpdate),RecordEnumeration接口中定義的方法有: (1) public int numRecords():此方法返回枚舉集中的有效記錄數(shù)。 (2) public byte nextRecord():
19、返回下一條記錄數(shù)據(jù)。 (3) public int nextRecordId():返回下一條記錄的ID號(hào)。 (4) public byte previousRecord():返回上一條記錄數(shù)據(jù)。 (5) public int previousRecordId():返回上一條記錄的ID號(hào)。 (6) public boolean hasNextElement():判斷是否存在下一條記錄。 (7) public boolean hasPreviousElement():判斷是否存在上一條記錄。 (8) public void reset():使用此方法可以使枚舉集索引保持正確狀態(tài)。 (9) publ
20、ic void rebuild():更新枚舉集以反映當(dāng)前記錄集。 (10) public void keepUpdated(boolean keepUpdated):設(shè)置枚舉集和記錄集是否保持同步。 (11) public boolean isKeptUpdated():判斷枚舉集和記錄集是否同步。 (12) public void destroy():釋放RecordEnumeration接口占有的資源。,6.4.4 知識(shí)拓展-過(guò)濾和比較記錄,RecordFilter接口用于過(guò)濾滿足指定條件的記錄子集。在該接口中定義了一個(gè)唯一的方法matches(),用于檢測(cè)一個(gè)記錄是否滿足應(yīng)用程序定義的標(biāo)
21、準(zhǔn)。語(yǔ)法如下: public Boolean matches(byte candidate) 參數(shù)candidate代表一個(gè)記錄,如果參數(shù)和標(biāo)準(zhǔn)相匹配,則返回trure。,RecordComparator接口用于將枚舉集中的記錄按應(yīng)用程序要求進(jìn)行排序。在該接口中定義了一個(gè)唯一的方法compare(),完成兩個(gè)候選記錄的順序比較。語(yǔ)法如下: public int compare(byte rec1, byte rec2) 該方法的返回值是定義在RecordComparator接口中的常量,如果記錄rec1的排列順序先于rec2,則返回RecordComparator.PRECEDES,如果記錄r
22、ec1位于rec2之后,則返回RecordComparator.FOLLOWS,如果相等,則返回RecordComparator.EQUIVALENT。,6.4.4 知識(shí)拓展-響應(yīng)記錄事件,RMS采用事件監(jiān)聽(tīng)機(jī)制檢測(cè)記錄存儲(chǔ)的狀態(tài)改變。當(dāng)為記錄存儲(chǔ)RecordStore類注冊(cè)了RecordListener事件監(jiān)聽(tīng)器后,記錄存儲(chǔ)狀態(tài)的改變都將被系統(tǒng)自動(dòng)捕獲。RecordStore類注冊(cè)RecordListener事件監(jiān)聽(tīng)器方法的語(yǔ)法如下: public void addRecordListener(RecordListener listener) RecordListener接口用于接收來(lái)自記錄
23、集改變的事件,該接口共定義了三個(gè)方法,分別用于響應(yīng)添加記錄事件、修改記錄事件和刪除記錄事件。語(yǔ)法如下: public void recordAdded(RecordStore recordStore, int recordId) public void recordChanged(RecordStore recordStore, int recordId) public void recordDeleted(RecordStore recordStore, int recordId) 參數(shù)說(shuō)明: recordStore:存儲(chǔ)記錄的記錄存儲(chǔ)。 recordId:發(fā)生改變的記錄ID號(hào)。,本章小結(jié),
24、RMS是用來(lái)管理記錄的系統(tǒng),是記錄的有序集合。在RMS中,一條記錄只包含一個(gè)大小可變的二進(jìn)制字段。不管記錄的內(nèi)容是數(shù)字、字符串、數(shù)組或圖象,都是以一段連續(xù)的字節(jié)型數(shù)據(jù)形式存在。 RecordStore類包含了操作記錄和記錄集的方法。 1. 操作記錄集 (1) 打開(kāi)/創(chuàng)建記錄集 protected static RecordStore openRecordStore (String RecordStoreName,boolean CreateIfNecessary) (2) 關(guān)閉記錄集 public void closeRecordStore() (3) 刪除記錄集 public static void deleteRecordStore(String RecordStoreName) (4) 獲取記錄集名稱列表 public static String listRecordStore(),(5) 獲取記錄集的名字 public String getName() (6) 獲取記錄集的當(dāng)前版本號(hào) public int getVersion() (7) 獲取記錄集中記錄的條數(shù) public int getNumRecords() (8) 獲取記錄集所占空間的字節(jié)數(shù) public int ge
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中介托管維修合同范例
- 合伙開(kāi)美容院合同范例
- 產(chǎn)權(quán)收購(gòu)合同范本
- 馬路車位租賃合同范本
- 參展補(bǔ)貼合同范本
- 合同范本能當(dāng)正式合同
- 公路隧道定期檢測(cè)合同范本
- 含附件合同范本
- 內(nèi)貿(mào)合同范本
- 乙房免責(zé)合同范本
- 《大模型原理與技術(shù)》全套教學(xué)課件
- 全新人教精通版六年級(jí)英語(yǔ)下冊(cè)教案(全冊(cè) )
- 2021-2022學(xué)年貴州省貴陽(yáng)一中高一下學(xué)期第二次月考數(shù)學(xué)試題(原卷版)
- 三年級(jí)藍(lán)色的家園海洋教育全冊(cè)教案.
- 護(hù)理不良事件-PPT課件
- 精品污水處理廠工程重難點(diǎn)分析及應(yīng)對(duì)措施
- 審核評(píng)估報(bào)告(課堂PPT)
- 后張法預(yù)應(yīng)力空心板梁施工方案
- 《房屋面積測(cè)算技術(shù)規(guī)程》DGJ32TJ131-2022
- 浙江省金衢六校聯(lián)盟2021-2022學(xué)年高二上學(xué)期期末聯(lián)考試題 英語(yǔ) Word版含答案
- 陳情表原文及翻譯
評(píng)論
0/150
提交評(píng)論