學習情境6游戲進度的保存.ppt_第1頁
學習情境6游戲進度的保存.ppt_第2頁
學習情境6游戲進度的保存.ppt_第3頁
學習情境6游戲進度的保存.ppt_第4頁
學習情境6游戲進度的保存.ppt_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、學習情境6 游戲進度的保存,能力目標,熟練掌握記錄集的打開、關閉、刪除方法; 熟練掌握利用拋出的異常,處理打開或者新建記錄集; 掌握獲取記錄集名稱等其他相關信息的方法; 熟練地掌握添加、修改、獲取相關的記錄數(shù)據(jù); 掌握將多種不同類型數(shù)據(jù)保存在一條記錄中; 使用數(shù)據(jù)流容器,進行各種類型與字節(jié)型數(shù)據(jù)之間的轉換; 利用記錄集記錄最高分成績; 培養(yǎng)綜合運用RMS解決問題的能力; 掌握比較數(shù)據(jù)和插入數(shù)據(jù)的算法。 ,認知目標,了解記錄集和記錄的概念; 理解RecordStore類; 理解RecordStore類的存儲結構; 了解RecordStore類中的異常含義; 了解記錄最高分的必要性; 識記通過數(shù)據(jù)

2、流進行數(shù)據(jù)轉換的方法; 理解記錄ID的重要性。 識記操作記錄集的常用方法; 識記操作記錄的常用方法。 ,6.1 學習情景描述,人們一般都是利用等車、坐車、工作間隙等短暫片刻,通過玩手機游戲來放松心情、打發(fā)無聊時光。這樣的時間段非常容易被打斷,需要有一種方法,將正在進行的游戲進行存儲,在下一次打開程序的時候能夠繼續(xù)游戲。尤其對于那些闖關游戲,需要有一個積累的過程,此時保存游戲的進度就顯得尤為重要了。,本學習情境分為三個學習單元來完成。單元一,操作記錄集,用以保存游戲的進度;單元二,保存最高分記錄;單元三,實現(xiàn)排行榜。,本學習單元的主要任務:在游戲過程,如果單擊“返回”按鈕,提示是否保存游戲,如果

3、“保存”,則在下次打開游戲的時候,顯示二級子菜單,提示玩家是“繼續(xù)游戲”,還是“開始新游戲”?,6.2 操作記錄集,6.2.1 單元任務總述,6.2.2 知識準備:認識記錄存儲系統(tǒng),MIDP框架為MIDlet應用程序提供了一個存儲數(shù)據(jù)的機制,使得數(shù)據(jù)可以持久保存,并可以在需要的時候進行讀取。這個持久存儲機制稱為記錄存儲系統(tǒng)RMS(Record Management System)。 RMS是用來管理記錄的系統(tǒng),是記錄的有序集合。每一條記錄必須從屬于一個記錄集,記錄集保證記錄讀寫的自動運行。 程序保存在打包后的jar文件中,而保存數(shù)據(jù)的記錄集,則是保存在無線移動設備的系統(tǒng)中,他不會因為斷電、關機

4、等原因被刪除,系統(tǒng)會盡可能地永久保存。當相應的MIDlet應用程序被刪除或者被卸載時,相應的記錄集也會被系統(tǒng)自動刪除。,(1) 打開RMS類,實現(xiàn)如下步驟: 聲明對象 自定義打開/創(chuàng)建記錄集的方法 自定義關閉記錄集的方法 自定義刪除記錄集的方法 自定義獲取記錄集名的方法 (2) 打開GamebBody類,實現(xiàn)如下步驟: 添加對象聲明 修改keyPressed()方法 (3) 在MIDlet的startApp()方法中,獲取已存在的記錄集的名稱,并在控制臺輸出。 (4) 運行測試,(1) 新建MIDlet工程,工程名為“Ch6_Unit1”。 (2) 將Ch5_Unit2中完成的源代碼文件拷貝到

5、工程的src文件夾下。 (3) 在工程中添加一個RMS類,在該類中將實現(xiàn)記錄存儲的基本功能。 (4) 將相關資源文件拷貝到工程的res文件夾下。,任務準備,實現(xiàn)過程,6.2.3 任務一:保存游戲進度,知識提煉: 操作記錄集,(1) 打開/創(chuàng)建記錄集 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) 獲取記錄集中記錄的條數(shù) public int getNumRecords() (4) 獲取記錄集所占空間的字節(jié)數(shù) public int getSize() 小提示:利用該方法返回的空間字節(jié)

7、數(shù)不僅包含數(shù)據(jù),還包含保存記錄存儲狀態(tài)的數(shù)據(jù)結構等其他信息。 (5) 獲取記錄集目前可利用的字節(jié)數(shù) public int getSizeAvailable() (6) 獲取記錄集最后被修改的時間 public long getLastModified(),6.2.4 任務二:讀取游戲進度,繼續(xù)游戲,(1) 打開StartCanvas類,書寫代碼,實現(xiàn)如下功能: 添加聲明; 在構造方法中加載二級子菜單圖片; 自定義繪制二級子菜單的drawSubMenu()方法; 自定義方法subMenuKeyPressed(),實現(xiàn)二級子菜單的鍵盤響應; 在paint()方法里,實現(xiàn)二級子菜單的繪制; 在key

8、Pressed()方法中,調用subMenuKeyPressed()方法,實現(xiàn)對二級子菜單的鍵盤響應。 (2) 修改MIDlet的startApp()方法 (3) 運行測試,實現(xiàn)過程,要點提示:制作二級子菜單,在本任務中,給定了二個子菜單圖片資源,如下所示:,子菜單圖片1,子菜單圖片2,對于給定的這兩個子菜單圖片資源,可以有兩種設計思路: (1)使用精靈; (2)使用setClip()和drawImage()結合使用的方法。 本任務中,使用的是第二種設計思路。,6.3 保存最高分記錄,6.3.1 單元任務總述,對于積分類的游戲,最高分的保存非常重要,在游戲過程,可以讓玩家有一個對比和想獲取更多

9、積分的欲望。 上一單元是針對闖關游戲的進度保存,而本單元是針對積分游戲的最高分保存,實現(xiàn)思路上有一定區(qū)別,因此本單元并不是在上一單元的基礎之上來實現(xiàn)的。 本單元的主要任務是在記錄集中保存獲得最高分的玩家姓名及分數(shù),在游戲中顯示記錄中的最高分,如果玩家的得分要比記錄中的要高,則提示輸入玩家姓名,刷新記錄。,6.3.2 任務三:保存最高分,(1) 打開RMS類,實現(xiàn)如下步驟: 添加變量聲明 修改openRecords()方法 自定義addRecord()方法 自定義getRecord()方法 自定義的setRecord()方法 自定義delRecord()方法,(1) 新建MIDlet工程,工程名

10、為“Ch6_Unit2”。 (2) 將Ch5_Unit2中完成的源代碼文件拷貝到工程的src文件夾下。 (3) 將Ch6_Unit1中完成的RMS類文件拷貝到工程的src文件夾下。 (4) 將相關資源文件拷貝到工程的res文件夾下。,任務準備,實現(xiàn)過程,(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常:試圖訪問一個已經(jīng)關閉的記錄集,拋出此異常。 RecordStoreException:記錄存儲操作出現(xiàn)異常。 RecordStoreFullException:記錄集存儲溢出拋出此異常。 InvalidRecordIDExeption:記錄ID號無效。,6.3.3 任務四:保存玩家姓名和最高分,在任務三的基礎之上,繼續(xù)如下實現(xiàn)過程: (1) 添加一個基于Form組件的InputPlayerNameForm類,并添加代碼,實現(xiàn)如下功能: 聲明變量 在構造方法中實現(xiàn)頁面布局,并注冊按鈕監(jiān)聽器。 實現(xiàn)commandAction()方法,響應按鈕。 (2) 打開GamebBody類,在響應鍵

13、盤的keyPressed()方法中,修改“返回”按鈕的響應代碼。 (3) 運行測試,實現(xiàn)過程,6.4 實現(xiàn)排行榜,6.4.1 單元任務總述,在積分類游戲中,排行榜是一個非常重要的游戲環(huán)節(jié)。當玩家完成游戲后,輸入自己的名字,看看自己是不是排在玩游戲的前幾名。這樣既提高了游戲的可玩性,還可以延長游戲的粘性和壽命。 在本學習單元中,首先,顯示排行榜;然后,根據(jù)得分,更新排行榜。,6.4.2 任務五:顯示排行榜,任務準備 實現(xiàn)過程,(1) 新建MIDlet工程,工程名為“Ch6_Unit3”。 (2) 將Ch6_Unit2中完成的源代碼文件拷貝到工程的src文件夾下。 (3) 將相關資源文件拷貝到工程

14、的res文件夾下。,(1) 打開RMS類,實現(xiàn)如下步驟: 聲明兩個數(shù)組,保存排行榜中的玩家姓名和分數(shù)。 修改自定義方法openRecords() 修改自定義方法addRecord ()和setRecord () 修改自定義方法getRecord () (2) 打開StartCanvas類,實現(xiàn)如下步驟: 添加變量聲明 在構造方法中加載排行榜背景圖片 自定義繪制排行榜的drawList()方法 在paint()方法中,調用drawList()方法 在keyDoMenu()方法中,響應右軟鍵,顯示排行榜。 在keyPressed()方法中,響應排行榜界面的“返回”功能 (3) 測試運行,要點提示,

15、雖然排行榜上顯示的是5個玩家的姓名和得分,但在記錄集中并沒有保存成5條記錄,而是把所需要存儲的5個玩家的數(shù)據(jù)通過一個循環(huán),依次保存到一個byte數(shù)組中去,這樣就可以只使用一條記錄了。這對后面記錄的操作和管理將帶來很大的便利,一般情況下不會出現(xiàn)ID錯誤,因為只有一條記錄,ID號永遠為1,只要對記錄內(nèi)容的的寫入和讀出順序保持嚴格一致就可以。,小提示:排行榜上實際只顯示5個玩家的姓名和分數(shù),設置6個數(shù)組元素是為了簡化更新排行榜的算法。,6.4.3 任務六:更新排行榜,實現(xiàn)過程,在任務五的基礎之上,繼續(xù)如下實現(xiàn)過程: (1) 打開RMS類,實現(xiàn)如下步驟: 自定義isList()方法,判斷玩家的分數(shù)是否

16、進入了排行榜 自定義updateList()方法,更新排行榜。 (2) 打開GameBody類,在keyPressed()方法中,找到響應“返回”按鈕的代碼,將語句: if (RMS.topScore score) /如果游戲得分高于保存的最高分 修改成: if (rms.isList(score) /如果游戲得分進入了排行榜 (3) 打開InputPlayerNameForm類,將響應按鈕的commandAction()方法修改如下: (4) 運行測試,要點提示:更新排行榜,如果玩家的得分大于排行榜中的最后一個分數(shù)(listScore4),則表示進入了排行榜。 更新排行榜時,首先,從排行榜中

17、的最后一個分數(shù)開始,依次比較,如果玩家分數(shù)大,則將排行榜中的數(shù)據(jù)向下移動一個位置;如果玩家分數(shù)小,則在當前位置插入分數(shù)。如下圖所示:,6.4.4 知識拓展-遍歷記錄,由于記錄存儲中記錄的ID號不一定是連續(xù)的,所以不能象在數(shù)組中那樣通過下標索引進行元素的遍歷。 RecordEnumeration接口返回一個包含記錄存儲中所有有效記錄ID號的記錄枚舉集,從邏輯上維護了記錄ID號的連續(xù)性。該接口提供了正向和逆向兩種遍歷記錄的方法。并且通過使用RecordFilter過濾器和RecordComparator比較器提供了篩選和排序功能。 由于RecordEnumeration是接口,無法通過構造方法創(chuàng)建

18、對象實例。RecordStore類提供了enumerateRecords()方法來獲取一個包含當前記錄存儲有效ID號的RecordEnumeration接口實例。語法如下: 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號。 (4) public byte previousRecord():返回上一條記錄數(shù)據(jù)。 (5) public int previousRecordId():返回上一條記錄的ID號。 (6) public boolean hasNextElement():判斷是否存在下一條記錄。 (7) public boolean hasPreviousElement():判斷是否存在上一條記錄。 (8) public void reset():使用此方法可以使枚舉集索引保持正確狀態(tài)。 (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) 參數(shù)candidate代表一個記錄,如果參數(shù)和標準相匹配,則返回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采用事件監(jiān)聽機制檢測記錄存儲的狀態(tài)改變。當為記錄存儲RecordStore類注冊了RecordListener事件監(jiān)聽器后,記錄存儲狀態(tài)的改變都將被系統(tǒng)自動捕獲。RecordStore類注冊RecordListener事件監(jiān)聽器方法的語法如下: 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) 參數(shù)說明: recordStore:存儲記錄的記錄存儲。 recordId:發(fā)生改變的記錄ID號。,本章小結,

24、RMS是用來管理記錄的系統(tǒng),是記錄的有序集合。在RMS中,一條記錄只包含一個大小可變的二進制字段。不管記錄的內(nèi)容是數(shù)字、字符串、數(shù)組或圖象,都是以一段連續(xù)的字節(jié)型數(shù)據(jù)形式存在。 RecordStore類包含了操作記錄和記錄集的方法。 1. 操作記錄集 (1) 打開/創(chuàng)建記錄集 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) 獲取記錄集中記錄的條數(shù) public int getNumRecords() (8) 獲取記錄集所占空間的字節(jié)數(shù) public int ge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論