




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、基于J2ME的手機(jī)游戲開發(fā)摘要:隨著通信技術(shù)的發(fā)展和手機(jī)的普及,手機(jī)游戲的開發(fā)技術(shù)越來越為人們所關(guān)注。以J2ME為開發(fā)平臺,利用Java提供強(qiáng)大工具,不但可以在手機(jī)上實(shí)現(xiàn)靜態(tài)HTML技術(shù)所無法實(shí)現(xiàn)的計(jì)算處理、數(shù)據(jù)存儲、與服務(wù)器的通信等功能,而且能夠開發(fā)各種手機(jī)游戲。本文在介紹J2ME及其體系結(jié)構(gòu)的基礎(chǔ)上,以貪吃蛇游戲?yàn)閷?shí)例,描述了借助J2ME的MIDlet類庫開發(fā)手機(jī)游戲的過程。關(guān)鍵詞:手機(jī)游戲; MIDP應(yīng)用程序; 永久性數(shù)據(jù)Develops based on the J2ME handset gameAbstract: Along with communication developmen
2、t and handset popularization, people more and more pay attention to the handset game development technology. Develops the platform take J2ME, provides the powerful tool using Java, not only may realize the handset functions that static HTML technology be unable to realize, such as computation proces
3、sing, data storage, and communication with server, but also can develop all kinds of handset games. On the basis of the technology and architecture of J2ME being introduced, the gluttonous snake game was taken as a example, the development process of handset game with the aid of the J2ME MIDlet clas
4、s library is described in this article.Key Words: Handset game; MIDP application pragram; Permanent data26目 錄第一章 緒論11.1 研究背景11.2 研究內(nèi)容1第二章 J2ME及其體系結(jié)構(gòu)概述22.1 J2ME簡介22.2 J2ME 體系結(jié)構(gòu)22.3 移動信息設(shè)備簡表概述32.3.1 MIDP的目標(biāo)硬件環(huán)境32.3.2 MIDP應(yīng)用程序32.3.3 CLDC和MIDP庫中的類32.4 J2ME API簡介42.4.1 MIDP API概述42.4.2 MIDlet應(yīng)用程序42.4.3 使
5、用定時(shí)器52.4.4 網(wǎng)絡(luò)62.4.5 使用Connector72.4.6 使用HttpConnection82.4.7 永久性數(shù)據(jù)(RMS)92.4.8 存儲集(Record Store)102.4.9 記錄112.4.10 枚舉122.4.11 異常132.5 用戶界面(LCDUI132.5.1 UI基礎(chǔ)132.5.2 高級UI142.5.3 低級UI15第三章 手機(jī)游戲開發(fā)過程163.1 貪吃蛇游戲的規(guī)則簡介以及開發(fā)環(huán)境163.1.1 貪吃蛇游戲的規(guī)則簡介163.1.2 開發(fā)環(huán)境163.2 詳細(xì)設(shè)計(jì)163.2.1 代碼設(shè)計(jì)17第四章 程序的調(diào)試與運(yùn)行224.1游戲的調(diào)試224.2 游戲的
6、運(yùn)行環(huán)境23第五章 總結(jié)24致 謝25參考文獻(xiàn)25第一章 緒論1.1 研究背景JAVA自從20世紀(jì)90年代早期誕生以來,以其強(qiáng)大的功能迅速為廣大程序員們所接受。從2001年開始,日本的國內(nèi)的移動電話開始搭載Java。使用本來就是一種程序語言的Java之后,就可以在移動電話上完成以往靜態(tài)的HTML內(nèi)容所無法達(dá)成的計(jì)算處理、數(shù)據(jù)存儲、與服務(wù)器的通信等等。如果能利用Java上其他豐富功能,那么就可以實(shí)現(xiàn)更多的功能。隨著手機(jī)游戲的發(fā)展,國內(nèi)外各大開發(fā)商紛紛運(yùn)用Java進(jìn)行手機(jī)游戲開發(fā)。J2ME作為一種基于Java的便攜設(shè)備開發(fā)平臺,在各大手機(jī)開發(fā)公司得到了廣泛應(yīng)用。1.2 研究內(nèi)容本課題擬研究基于J2
7、ME的手機(jī)游戲開發(fā)技術(shù)以及其特點(diǎn),具體研究內(nèi)容如下:1、手機(jī)游戲開發(fā)以及J2ME的基本理論和J2ME類庫的使用;2、J2ME體系結(jié)構(gòu)的研究;3、MIDP移動信息設(shè)備簡表的研究; (1)、MIDP的目標(biāo)硬件環(huán)境;(2)、MIDP應(yīng)用程序; (3)、CLDC和MIDP庫中的類。4、J2ME API的研究; (1)MIDlet應(yīng)用程序的研究; (2)MIDlet的類庫研究; (3)各事件發(fā)生器的應(yīng)用。5、開發(fā)工具的應(yīng)用和開發(fā)環(huán)境的設(shè)置。其中MIDP移動信息設(shè)備簡表的研究和J2ME API的研究為重點(diǎn),本課題將通過一個(gè)具體的手機(jī)游戲的開發(fā)來研究以上內(nèi)容。第二章 J2ME及其體系結(jié)構(gòu)概述2.1 J2ME
8、簡介 現(xiàn)在JAVA-JAVA2 Platform大致可分為J2SE、J2EE、J2ME三類。J2SE為JAVA-JAVA2 Platform 的標(biāo)準(zhǔn)版,通常在PC上使用的JAVA。J2EE是在J2SE的API上,擴(kuò)展了給企業(yè)使用EJB與Servlet等主要使用在服務(wù)器上的功能。而J2ME則是面向家電和通信工具等微小設(shè)備。J2ME的目標(biāo)是微小設(shè)備,這類設(shè)備有許多種類,在這些設(shè)備的J2ME當(dāng)中,定義了CDC(Connected Device Configuration),CLDC(Connected Limited Device Configuration)這兩個(gè)Configuration。CDC
9、是以能用在個(gè)人網(wǎng)關(guān)、下一代移動電話、PDA(個(gè)人數(shù)字助理)、家電設(shè)備、POS終端、車輛導(dǎo)航系統(tǒng)等上運(yùn)行為前提設(shè)計(jì)出來的。CLDC,是以能使用在移動電話、PDA(個(gè)人數(shù)字助理)、家電設(shè)備、POS終端等上面為前提設(shè)計(jì)出來的。2.2 J2ME 體系結(jié)構(gòu)配置和簡表:配置定義了一個(gè)設(shè)計(jì)在一系列類似硬件上運(yùn)行的Java平臺的能力。J2me的目標(biāo)是家電與嵌入式設(shè)備,這類設(shè)備有很多種類,對應(yīng)這些設(shè)備的J2me當(dāng)中,定義了CDC(連接設(shè)備配置)和CLDC(受限接設(shè)備配置)兩個(gè)配置,配置所提供的類函數(shù)只有Java.lang, Java.io,Java.util包等J2SE等核心類的子集。CLDC是與手機(jī)相關(guān)的,它
10、實(shí)際是定義一個(gè)設(shè)備制造商用來實(shí)現(xiàn)Java運(yùn)行環(huán)境的標(biāo)準(zhǔn),第三方開發(fā)者只需要遵循這個(gè)標(biāo)準(zhǔn)。CLDC主要影響Java開發(fā)和軟件發(fā)布的以下方面:1)目標(biāo)設(shè)備的特性;2)安全模型:安全模型有兩個(gè)部分,虛擬機(jī)和應(yīng)用程序安全。虛擬機(jī)安全層的目的是保護(hù)下面的設(shè)備不受任何執(zhí)行代碼可能引起的損害。2.3 移動信息設(shè)備簡表概述2.3.1 MIDP的目標(biāo)硬件環(huán)境1)顯示 :96*54象素,1位顏色,大約1:1比例;2)輸入: (a)單手鍵盤或者小鍵盤;(b)雙手的QWERTV鍵盤;(c)觸摸屏。 3)內(nèi)存: (a)128KB非易失性內(nèi)存,供MIDP組件使用;(b)8KB的非易失性內(nèi)存,供應(yīng)用程序生成的永久數(shù)據(jù)使用;
11、(c)32KB的易失性內(nèi)存,供Java堆使用。4)網(wǎng)絡(luò): (a)雙響無線網(wǎng)絡(luò),可間歇性連接;(b)通常是很有限的帶寬。2.3.2 MIDP應(yīng)用程序在MIDP上運(yùn)行的Java程序被稱為MIDlet。MIDlet是服從一些關(guān)于它運(yùn)行環(huán)境和程序打包的一些規(guī)則。其運(yùn)行環(huán)境是啟動MIDlet,這是設(shè)備內(nèi)置應(yīng)用管理器的任務(wù)。應(yīng)用程序能訪問到下面的一些資源:(1)震動文件中的所有文件。(2)MIDlet描敘文件的內(nèi)容(JAD)。2.3.3 CLDC和MIDP庫中的類打包:MIDlet應(yīng)用一般采用震動文件的形式。這個(gè)文件應(yīng)該包含運(yùn)行應(yīng)用程序需要的類和所有的資源文件,它也應(yīng)該包含一個(gè)叫manifest.mf的清
12、單文件。保存在震動文件中的清單文件是一個(gè)簡單的文本文件,包含屬性值。應(yīng)用程序描敘(JADs)在移動電話網(wǎng)絡(luò)上傳送大量的數(shù)據(jù),需要有一個(gè)描敘文件讓用戶在沒有下載整個(gè)包之前來查看一下MIDlet震動的細(xì)節(jié)。2.4 J2ME API簡介2.4.1 MIDP API概述MIDP API包含以下五個(gè)部分,如表2-1所示:表2-1 MIDP API類 別描 述Application包括MIDlet類。Timers主要包括Timers和Timers Task類。Networking提供訪問設(shè)備通信能力的接口。Persistence通過記錄管理系統(tǒng)(RMS)API訪問用戶永久存儲。User Interface
13、包括MIDP LCDUI(液晶顯示器用戶界面)類。2.4.2 MIDlet應(yīng)用程序MIDlet即MIDP的應(yīng)用程序, MIDlet應(yīng)用程序的核心是MIDlet類。為了創(chuàng)建一個(gè)MIDlet,必須從這個(gè)虛基類派生出自己的類。表2-2提供了從MIDlet類繼承的方法。表2-2 MIDlet類方 法描 述訪問JAR和JAD文件中的屬性String gerAppProperty(string key)返回JAR和JAD中與key相對應(yīng)的屬性的值。Abstract void destoryApp (boolean unconditinal)應(yīng)用程序管理器在應(yīng)用程序關(guān)閉前,調(diào)用這個(gè)方法來給我們做一些事情的機(jī)
14、會(例如保存狀態(tài)和釋放資源)。Abstract void pauseApp()在用戶暫停游戲時(shí),應(yīng)用程序管理器調(diào)用MIDlet的類方法。Abstract void startApp()應(yīng)用程序管理器調(diào)用MIDlet的這個(gè)方法,來告訴用戶再次開啟游戲。Abstract void notifyDestroyed()如果游戲者決定退出游戲,可以調(diào)用這個(gè)方法來通知應(yīng)用程序管理器。續(xù)表2-2 MIDlet類方 法描 述Abstract void notifyPausrd()調(diào)用這個(gè)方法來通知應(yīng)用程序管理器游戲者已經(jīng)暫停游戲。Abstract void notifyRequest()調(diào)用這個(gè)方法來告訴應(yīng)用
15、程序管理器MIDlet要重新開始。應(yīng)用程序管理器(Application Manager ,AM)的作用就是管理MIDlet 。本質(zhì)上來說,MIDlet應(yīng)用程序只存在兩種狀態(tài)暫停和運(yùn)行。MIDlet被創(chuàng)建后默認(rèn)為暫停狀態(tài),當(dāng)應(yīng)用程序管理器認(rèn)為它準(zhǔn)備完畢,它會調(diào)用startApp方法來通知MIDlet進(jìn)入運(yùn)行狀態(tài)。2.4.3 使用定時(shí)器 MIDP API 包括兩個(gè)關(guān)于定時(shí)器的類Java.util.Timer和Java.util.Timer Tast類 (如表2-3和2-4所示):表2-3 Java.util .Timer類 方 法 描 述Timer()構(gòu)造一個(gè)新的Timer對象。Void can
16、cel()停止Timer。Void schedule(TimeTask task,Dare d)把一個(gè)任務(wù)定時(shí)在時(shí)間d運(yùn)行。Void schedule(TimeTask task, Data firstTime, long period )讓一個(gè)任務(wù)第一次在一個(gè)指定的時(shí)間運(yùn)行,然后每隔period毫秒運(yùn)行一次。Void schedule(TimeTask task,long delay)指定一個(gè)任務(wù)在delay毫秒后運(yùn)行一次。Void schedule(TimeTask task,long delay,long period)指定一個(gè)任務(wù)從delay毫秒連續(xù)運(yùn)行,然后每隔period毫秒運(yùn)行一
17、次。Void scheduleAtFixedRate(timeTask task,Date firstTime,long period)指定一個(gè)任務(wù)從firstTime連續(xù)運(yùn)行,然后以固定間隔period毫秒連續(xù)運(yùn)行。Void scheduleAtFixedRate(TimeTask task,long delay,long period)指定一個(gè)任務(wù)在delay毫秒后運(yùn)行,然后以固定間隔period毫秒連續(xù)運(yùn)行。表2-4 Java.util.Timer Tast類方 法描 述Timer Task()構(gòu)造一個(gè)新的Timer Task對象。Boolean cancel()結(jié)束該任務(wù)。Abstra
18、ct void run()這個(gè)方法必須被一個(gè)包含Timer時(shí)間執(zhí)行的代碼的方法重載。Long scheduledExecution Time()返回任務(wù)上一次執(zhí)行的確切時(shí)間。我們可以通過不同schedule的方法來確定什么時(shí)候執(zhí)行任務(wù),包括在一個(gè)指定的時(shí)間執(zhí)行一次和那個(gè)時(shí)間后按照一個(gè)固定的時(shí)間間隔連續(xù)執(zhí)行。也可以在一段延遲(單位是毫秒)后執(zhí)行任務(wù),還可以選擇以固定的時(shí)間間隔連續(xù)執(zhí)行。2.4.4 網(wǎng)絡(luò) MIDP包含對CLDC中的GCF(Generic Connection Framework),即通用連接框架的支持,MIDP規(guī)范只是要區(qū)分必須實(shí)現(xiàn)HTTP的連接。如果想開發(fā)的是基于無線網(wǎng)絡(luò)的高性能
19、的多人聯(lián)網(wǎng)游戲,這非常值得考慮應(yīng)用。目前的情況是,無線網(wǎng)絡(luò)的傳輸情況是高延遲以及高丟失率,所以響應(yīng)時(shí)間在50ms的游戲很難實(shí)現(xiàn)。通用連接框架使用靜態(tài)工廠類Connector去創(chuàng)建和返回一個(gè)連接。如圖2-1所示是所有類型的類層次圖。Connector.openConnectionInputConnectionOutputConnectionStreamConnectionContentConnectionHttpConnectionStreamConnectionNotiferDatagramConnection 圖2-1 類層次圖圖2-1 通用連接框架包含豐富的多功能的通信類;但是MIDP只確
20、保支持HttpConnection。2.4.5 使用Connector通用連接框架設(shè)計(jì)包括一個(gè)超級Connector的概念,這個(gè)Connector作為一個(gè)支持任何連接類型的工廠,基本上來說,調(diào)用Connector類的靜態(tài)方法open即可,把需要連接的資源的名字作為參數(shù)傳遞過去,這個(gè)名字應(yīng)該采用“協(xié)議: 地址: 參數(shù)”的格式。在代碼里將采用HttpConnection類,如表2-5所示:表2-5 HttpConnection類方 法 描 述Static Connection open (String name)構(gòu)造,打開和返回一個(gè)指向一個(gè)指定URL的連接。續(xù)表2-5 HttpConnection
21、類Static Connection open(String name , int mode)構(gòu)造,打開和返回一個(gè)連接,連接一個(gè)指定資源URL和打開的模式都需要設(shè)定。Static Connection open(String name , int mode , Boolean timeouts)構(gòu)造,打開和返回一個(gè)連接,連接一個(gè)指定資源URL和打開的模式都需要設(shè)定,同時(shí)也有一個(gè)參數(shù)指定是否需要超時(shí)異常。static Connection openDataInputStream(String name)打開一個(gè)連接,然后構(gòu)造和返回一個(gè)數(shù)據(jù)輸入流。static Connection openDat
22、aOutputStream(string name)打開一個(gè)連接,然后構(gòu)造和返回一個(gè)數(shù)據(jù)輸出流。static Connection openinputStream(String name)打開一個(gè)連接,然后構(gòu)造和返回一個(gè)輸入流。static Connection openOutStream(String name)打開一個(gè)連接,然后構(gòu)造和返回一個(gè)輸出流。2.4.6 使用HttpConnectionHttpConnection類是一個(gè)全功能的 HTTP客戶端,實(shí)用于大多數(shù)的網(wǎng)絡(luò)任務(wù)(低延遲)。對于游戲而言,可以用它來按需下載內(nèi)容(如新的關(guān)卡),更新得分,或者實(shí)現(xiàn)游戲者之間的通信。表2-6 是所有
23、HttpConnection類的可用方法。表2-6 javx.microedition.io.HttpConnection類方 法描 述long getData()獲取頭中的日期值。Long getExpiration()獲取頭中的過期時(shí)間。String getHeaderFieldkey(int n)根據(jù)索引獲取頭中的鍵名。String getHeaderField(int n)根據(jù)索引獲取頭中的鍵值。String getHeaderField(String name)獲取指定的頭文字段的值。續(xù)表2-6 javx.microedition.io.HttpConnection類long get
24、HeaderFieldData(String name, long def)按照長日期類型返回指定字段的值,如果該字段不存在就返回def的值。int getHeaderFieldInt(String name,int def)按照整數(shù)類型返回指定字段的值,如果該字段不存在就返回def的值。Long getLastModified()返回最后一次更新的時(shí)間。String getURL()返回URL。String getFile()獲取URL中的文件部分。String getHost()獲取URL中的主機(jī)部分。int getPort()獲取URL中的端口部分。String getProtocol(
25、)獲取URL中的協(xié)議部分。String getQuery()獲取URL中的查詢部分。String getRef()獲取URL中的引用部分。Int getResponseCode()返回HTTP響應(yīng)狀態(tài)碼String ResponseMessage()返回HTTP響應(yīng)消息(如果存在的話)。String getREquestMethod()獲取連接請求的方法。Void getRequestMethod(String method)設(shè)置URL請求的方法??捎玫念愋陀蠫ET,POST和HEAD。String getRequestProperty(String key)獲取與指定的鍵相關(guān)聯(lián)的請求屬性值。
26、Void setRequestProperty(String key, String value)設(shè)定與指定的鍵相關(guān)聯(lián)的請求屬性值。2.4.7 永久性數(shù)據(jù)(RMS)開發(fā)游戲時(shí),保存數(shù)據(jù)在J2ME里是用RMS(Record Management System,記錄管理系統(tǒng))來實(shí)現(xiàn)的,可以在Javax.microedition.rms包中找到它,表2-7就是這個(gè)包中所有的類的列表。RMS采用記錄的方式來保存數(shù)據(jù),然后使用唯一的記錄號來應(yīng)用這些數(shù)據(jù),成組的數(shù)據(jù)就被保存在存儲集中。表2-7 RMS包(不包含異常)類描 述類RecordStore允許訪問記錄存儲集功能。接口RecordComparato
27、r提供一個(gè)用來實(shí)現(xiàn)兩個(gè)記錄間比較的接口。RecordComparation提供記錄存儲集的枚舉器;可以和比較器和過濾器聯(lián)合使用。recordFilter對獲取的數(shù)據(jù)進(jìn)行過濾。RecordListener提供一個(gè)用來“監(jiān)聽”RMS中發(fā)生的事件的接口,比如記錄增加,修改和刪除。2.4.8 存儲集(Record Store)記錄存儲集即一個(gè)記錄存儲的機(jī)制,表2-8中展示了完整的API。表2-8 記錄存儲API方 法描 述存儲集訪問方法Static RecordStore openRecordStroe(String record Name,blooean createIfNecessary)打開一個(gè)
28、存儲集或者在它不存在的時(shí)候創(chuàng)建一個(gè)存儲集。Void closeRecordStore()關(guān)閉一個(gè)存儲集。Static void deleteRecordStore(String recordStore Name)刪除一個(gè)存儲集。Long getLastModified()獲取存儲集最后被修改的時(shí)間。String getName()獲取存儲集的名稱。int getNumrecords()返回存儲集當(dāng)前記錄的數(shù)量。int getSize()返回存儲集使用的總字節(jié)數(shù)。int getSizeAvailable()獲取空閑空間。int getVersion()獲取存儲集的版本號。續(xù)表2-8 記錄存儲AP
29、IStatic String listRecordStores()獲取MID中你可以訪問的所有的記錄存儲集的字符串?dāng)?shù)組。記錄訪問方法int addRecord(byte,int offset,int numBytes) 向存儲集中加入一條新的記錄。byte getRecord(int recordId)用ID來獲取一條記錄。int getRecord(int recorded,byte buffer,int offset)把一條記錄讀取到buffer中。Void deletRecord(int recorded)刪除與recordId相關(guān)的記錄。Void setRecord(int recor
30、ded,byte newData,int offset,intnumBytes)使用新的字節(jié)數(shù)組與recordId相關(guān)聯(lián)的內(nèi)容。Int getNextRecordID()在插入后獲取下一個(gè)記錄的ID。Int getRecord(int recorded)返回按字節(jié)計(jì)算的記錄存儲集當(dāng)前的數(shù)據(jù)大小。RecordEnumeration enumerate Records(RecordFilterfilter,RecordComparator,bool-ean keepUpdataed)返回一個(gè)RecordEnumerator對象。它是用來在一個(gè)記錄集合中枚舉的(使用comparator參數(shù))。與時(shí)間
31、有關(guān)的方法Void addRecordListener(RecordListener listener)加入一個(gè)監(jiān)聽器對象,它可以在有這個(gè)記錄存儲集消息的時(shí)候被調(diào)用。Void removeRecordLisrener(RecordListener listener)移除原來用addRecordListener方法加入的監(jiān)聽器對象。記錄存儲集在與MIDlet包范圍,也就是說同一個(gè)包的任何MIDlet都可以訪問這個(gè)包中的記錄存儲集,其他包中的MIDlet甚至不能感知到別的包里記錄存儲集的存在。2.4.9 記錄一個(gè)記錄就是一個(gè)字節(jié)數(shù)組,可以在里面寫任何格式的數(shù)據(jù)。可以用DataInputStream
32、、DataOutputStream往記錄中寫入數(shù)據(jù),也可以用ByteArrayInputStream和ByteArrayOutputStream。在記錄存儲集中記錄是以一種類表的結(jié)構(gòu)存儲,如下圖2-2所示: IDRecord data(byte array)1“John”2 “64997”3 .png image data - _圖2-2 Record data Store “A”每一個(gè)記錄和它相關(guān)的字節(jié)數(shù)組都有一個(gè)整數(shù)主鍵唯一來標(biāo)識,RMS會成為記錄設(shè)定ID。頭一個(gè)寫入的ID是1,每次增加一條記錄它的ID就增加1,上圖展示了一個(gè)記錄集的簡單用法。在這個(gè)例子中,玩家的名字(字符串“John”)
33、存儲在記錄1中,記錄2保存最高分,記錄3是先前從網(wǎng)絡(luò)上下載的緩存的圖象。2.4.10 枚舉 RMS支持使用Javax.microedition.rms.RecordEnumerator類來排序記錄,如表2-9展示了它所有屬于這個(gè)類中的全部的方法。 表2-9 Javax.microedition.rms.RecordEnumerator類方 法描 述常用方法Void destroy()銷毀枚舉器。Boolean isKeptUpdated()指出在下面的記錄存儲集改變后該枚舉器是否自動更新生成。keepUpdated(Boolean keepUpdated)改變keepUpdated的狀態(tài)。Vo
34、id rebuild()引起枚舉器管理的索引重新生成。續(xù)表2-9 Javax.microedition.rms.RecordEnumerator類Void reset()把枚舉器設(shè)置成剛剛創(chuàng)建后的狀態(tài)。訪問Boolean hasNextElement()測試在從前一個(gè)到最后一個(gè)的順序中是否還有可以枚舉的記錄。Boolean hasPreviousElement()測試在從最后一個(gè)到前一個(gè)的順序中是否還有可以枚舉的記錄。Byte nextRecord()獲取存儲集中的下一個(gè)記錄。Byte previousRecord()獲取存儲集中的前一個(gè)記錄。Int previousRecoed()獲取前一天
35、記錄的ID。Int nextRecord()獲取下一個(gè)記錄的ID。Int numRecord()獲取記錄的數(shù)量,這在你使用過濾器的時(shí)候是很重要的??梢杂糜涗洿鎯瘉碓L問枚舉器,也可以使用枚舉器在記錄中雙向遍歷。如果反向遍歷只需要使用previousRecord。2.4.11 異常RMS異常都是因?yàn)椴徽_的環(huán)境造成的,對于這些異常需要編寫代碼來處理問題(RecordStoreNotFoundException、RecondStoreNotOpenException、InvalidRecordIDExcepaion的情況),或者只能接受它。2.5 用戶界面(LCDUI在創(chuàng)建游戲時(shí),MIDP允許我們
36、使用兩種截然不同的界面系統(tǒng)高級UI和低級UI。2.5.1 UI基礎(chǔ)LCDUI的核心是screen的概念,它代表MID上的一個(gè)display,在任何一個(gè)時(shí)間點(diǎn),只能有一個(gè)screen可見。在LCDUI中有3種類型的screen:(1) 低級UI可以通過Canvas類訪問;(2) Form顯示一組簡單的UI組件,或者說控件;(3) 復(fù)雜組件(Complex components)。2.5.2 高級UI高級UI提供了MID的一個(gè)抽象接口,通過它可以獲得大量的功能。使用高級API首先創(chuàng)建組件把它們加入到屏幕,然后與它們相交互。高級UI一般劃分為兩大類:屏幕和組件。(1) 屏幕(screen)scree
37、n是一個(gè)完整類組件,它管理整個(gè)屏幕。Form是一個(gè)特殊的screen,可以在Form中由少量幾個(gè)組件來構(gòu)造一個(gè)screen。(2) 列表(List)List是一個(gè)可以給用戶顯示一組備選項(xiàng)的組件。這個(gè)類實(shí)現(xiàn)了Javax.microedition.lcdui.Choice接口,ChoiceCroup item也實(shí)現(xiàn)了這個(gè)接口。(3) 文本框(TestBox)TestBox組件是微型世界的字處理器,它只能輸入多行的文字。它可以讓玩家輸入多行文字、剪切、復(fù)制以及從剪切板粘帖、過濾輸入的數(shù)據(jù)。(4) 警告(Alert)可以使用它來顯示一個(gè)提示信息(因?yàn)樗且粋€(gè)screen,所以它接管整個(gè)屏幕)。(5)
38、Form和ItemForm是一種可以包含一個(gè)或者多個(gè)下面這些從Item類派生出來的組件的screenStringItem、ImageItem、TextField、ChoieGroup、DataField和Gauge。(6) StringItem類運(yùn)用StringItem類在Form上加入簡單的文字消息。2.5.3 低級UI低級UI提供了一個(gè)工具包來移動和繪制圖形、顯示文字、獲取直接的按鍵事件等。(1) Canvas類Canvas又稱畫布,是一個(gè)Displayable對象,所有繪圖操作都畫在它上面。(2) Graphics類Graphics類工具在Canvas中承擔(dān)基本的二維繪圖。(3) 二維繪
39、圖工具drawLine采用4個(gè)參數(shù)直線起點(diǎn)的x、y坐標(biāo)值和直線終點(diǎn)x、y的坐標(biāo)值,例如:graphics.drawLine(50,0,100,0);這行代碼會從位置(50,0)到(100,0)繪制一條直線。繪制一個(gè)矩形是一個(gè)類似的過程,不同的只是需要用起點(diǎn)加上寬度和高度的方式來指定這個(gè)對象,可以繪制透明的或者填充的矩形,甚至可以繪制圓角的矩形。4個(gè)繪制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect?;∈鞘褂? 個(gè)參數(shù)來繪制的,前3個(gè)參數(shù)是弧所在的整個(gè)圓的外切矩形。剩下的兩個(gè)參數(shù)是startAngle和arcAngle。Angle
40、是度數(shù),0為右側(cè)(在三點(diǎn)的位置)的地方,180是左側(cè)(在九點(diǎn)的位置)的位置。(4) 繪制文字可以使用方法drawChar、drawChars、drawString和drawSubstring在Canvas上面繪制文字。(5) 圖象和裁剪裁剪讓人可以把圖象輸出限制到顯示設(shè)備的一個(gè)特定區(qū)域中,例如,如果將輸出限制在一個(gè)從(10,10)開始到(50,50)的區(qū)域中,那么從那個(gè)時(shí)候起,沒有圖像會出現(xiàn)在顯示設(shè)備上這個(gè)區(qū)域之外的任何地方。(6) 事件響應(yīng)實(shí)現(xiàn)一個(gè)或者多個(gè)按鍵事件響應(yīng)方法:keyPressde、keyRleased和keyRepeated。第三章 手機(jī)游戲開發(fā)過程3.1 貪吃蛇游戲的規(guī)則簡介
41、以及開發(fā)環(huán)境3.1.1 貪吃蛇游戲的規(guī)則簡介在貪吃蛇游戲中,玩家操作由小方塊連接而成的蛇,去吃隨機(jī)散落在畫面內(nèi)的小方塊,每吃一塊就增加一小方塊長度,要是撞壁以及撞自己的尾,就屬于失敗,如無失敗則直到通關(guān)為止。屏幕的長度的行向?yàn)?1單位,縱向?yàn)?8單位。在這個(gè)范圍內(nèi),玩家通過操作方向鍵來控制蛇的運(yùn)動方向。該游戲的最大特色是屏幕自適應(yīng),無論各種手機(jī),PDA的屏幕大小如何,該游戲總是能獲得最佳的顯示效果。3.1.2 開發(fā)環(huán)境(1)開發(fā)的硬件環(huán)境:CPU C1.7HZ/Maxor 40G/DDR 256M/CD-ROW 40X (2)開發(fā)軟件:JDK1.3和J2MEWTK3.2 詳細(xì)設(shè)計(jì)本游戲的操作流
42、程(如圖3-1):用戶在啟動MIDlet后,即進(jìn)入游戲主畫面,屏幕開始顯示為歡迎畫面。用戶按下開始按鈕后,就可以開始玩游戲。當(dāng)用戶想暫停時(shí),再次按一下開始按鈕,游戲就暫停了,在暫停的情況下再按開始按鈕,游戲繼續(xù)運(yùn)行。任何時(shí)候按退出按鈕,游戲MIDlet都會終止。圖 3-1操作流程3.2.1 代碼設(shè)計(jì) (1)游戲地圖代碼設(shè)計(jì) 游戲地圖是蛇的活動范圍和食物隨機(jī)散落的范圍,游戲的容器為行向?yàn)?1單位,縱向?yàn)?8單位,如下代碼:private final int iX = 10;/地圖的開始坐標(biāo) private final int iY = 10;/private final int SWIDTH =
43、 16;/圖標(biāo)的寬度 private final int iCells = 11;/地圖的列數(shù) private final int iRows = 18;/地圖的行數(shù) private final int iBoxW = SWIDTH*iCells;/地圖的寬采用二維繪圖工具:二維繪圖工具drawLine采用4個(gè)參數(shù)直線起點(diǎn)的x、y坐標(biāo)值和直線終點(diǎn)x、y的坐標(biāo)值,例如:graphics.drawLine(50,0,100,0);這行代碼會從位置(50,0)到(100,0)繪制一條直線。繪制一個(gè)矩形是一個(gè)類似的過程,不同的只是需要用起點(diǎn)加上寬度和高度的方式來指定這個(gè)對象??梢岳L制透明的或者填充的矩
44、形,甚至可以繪制圓角的矩形。4個(gè)繪制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect。(2)貪吃蛇和食物的代碼設(shè)計(jì)屏幕的長度為行向?yàn)?1單位,縱向?yàn)?8單位;在這個(gè)范圍內(nèi)(如圖3.3),玩家操作方向鍵控制蛇的運(yùn)動方向。該游戲的最大特色是屏幕自適應(yīng),無論各種手機(jī),PDA的屏幕大小如何,該游戲總是能獲得最佳的顯示效果。圖3-3游戲區(qū)域貪吃蛇最初由3個(gè)小正方形組成,小正方形是蛇的身體和游戲容器的組成部分。食物也由一塊小正方形組成,并且隨機(jī)散落在游戲框圖的區(qū)域內(nèi),每次只出現(xiàn)唯一的一個(gè),待玩家操作游戲完成一個(gè)任務(wù)后面,再出現(xiàn)下個(gè)食物,小蛇每
45、吃一個(gè)食物就增加一個(gè)長度。實(shí)現(xiàn)代碼如下:public int getCell()return iCell;public int getRow()return iRow; public void show() sLabel.setVisible(true); public boolean isVisible() return sLabel.isVisible(); public void hide() sLabel.setVisible(false); protected void setPosition(int row, int cell)iCell = cell;iRow = row; sL
46、abel.setBounds(cell*SWIDTH, row*SWIDTH, SWIDTH, SWIDTH); public void moveUp()if(iRow0)setPosition(-iRow,iCell);elsesetTouch();public void moveDown()if(iRow0)setPosition(iRow,-iCell);elsesetTouch();public void moveRight()if(iCelliBoxW-1)setPosition(iRow,+iCell);elsesetTouch();static boolean getTouch(
47、)return isTouch;static void setTouch()isTouch = true;static void setImTouch()isTouch = false;public Snake clone()Snake tem = new Snake();tem.setPosition(this.getRow(),this.getCell();return tem;(3)操作控制代碼設(shè)計(jì)MIDP的游戲設(shè)計(jì),本質(zhì)上就是用一個(gè)線程或者定時(shí)器產(chǎn)生重繪事件,用線程和用戶輸入改變游戲狀態(tài)。這個(gè)游戲也不例外,啟動MIDlet后,就立即生成一個(gè)重繪線程,該線程每隔50ms繪制一次屏幕。當(dāng)然
48、,重繪時(shí)有一些優(yōu)化措施,并不是屏幕上所有的像素都需要重繪,而是有所選擇,比如游戲畫布上那些已經(jīng)固定下來的就不需重繪。游戲畫布是一個(gè)CommandListener,可以接受用戶鍵盤命令,控制蛇的左移,右移,下移,上移。其代碼如下:public void move()hide();if(aoSnakes0.getRow()=Food.getRow()&aoSnakes0.getCell()=Food.getCell()eat();Snake tempSnakes = new SnakeiLen-1;for(int i=0;itempSnakes.length;i+)tempSnakesi = ao
49、Snakesi.clone();switch(heading)case 37:aoSnakes0.moveLeft();break;case 38:aoSnakes0.moveUp();break;case 39:aoSnakes0.moveRight();break;case 40:aoSnakes0.moveDown();break;default:break;整個(gè)游戲的流程控制體現(xiàn)在游戲畫布對象的paint()方法里。paint()根據(jù)當(dāng)前的游戲狀態(tài),繪制出當(dāng)時(shí)的游戲畫面。歡迎畫面和Game Over畫面的繪制相當(dāng)簡單,游戲暫停畫面的繪制也相當(dāng)容易,就是設(shè)立標(biāo)志,讓paint()執(zhí)行的時(shí)
50、候無需真正執(zhí)行重繪動作。第四章 程序的調(diào)試與運(yùn)行4.1游戲的調(diào)試在手機(jī)游戲方面,游戲的控制和圖片的設(shè)置是游戲的基本能力,為了方便玩家操作游戲,把玩家常用的操作鍵設(shè)為游戲最常用的控制鍵,并通過J2ME簡單有效的編碼,使玩家可以重新設(shè)置自己的熟悉的鍵。本游戲不設(shè)立關(guān)卡,而是隨著游戲積分的增加,游戲?qū)⒆詣釉黾佑螒虻碾y度,如加快游戲速度和隨小蛇長度的增加,游戲的操作難度也會增大。如玩家進(jìn)入游戲(如圖4-1),操作小蛇,圖 4-1 游戲界面圖去吃隨機(jī)散落在游戲區(qū)內(nèi)的食物,每吃一個(gè)食物就增加小蛇一個(gè)單位長度,并隨著長度的增加,游戲的速度將增加,而小蛇的長度增加也會增加玩家的操作難度。如果玩家操作小蛇碰壁或
51、者由于小蛇長度太長而蛇頭撞到小蛇的身體任何部位,均屬于失敗,玩家得重新游戲開始(如圖4-2)。但游戲?qū)⒆詣蛹o(jì)錄你的得分,并且保存你的游戲最高得分。 圖 4-2 游戲失敗的兩種情況4.2 游戲的運(yùn)行環(huán)境目標(biāo)硬件環(huán)境:1:顯示: 96*54象素,1位顏色, 大約1:1的象素比例;2:輸入:(a)單手鍵盤或者小鍵盤;(b)雙手的QWERTV鍵盤;(c)觸摸屏。 3)內(nèi)存 (a)128KB非易失性內(nèi)存,供MIDP組件使用;(b)8KB的非易失性內(nèi)存,供應(yīng)用程序生成的永久數(shù)據(jù)使用;(c)32KB的易失性內(nèi)存,供Java堆使用。4)網(wǎng)絡(luò) (a)雙響無線網(wǎng)絡(luò),可能間歇性連接;(b)通常是很有限的帶。第五章
52、總結(jié)本次畢業(yè)設(shè)計(jì)所開發(fā)的手機(jī)游戲,實(shí)現(xiàn)了手機(jī)游戲的一些基本和必需的功能。如游戲的界面設(shè)置,游戲動畫的設(shè)置,玩家的控制鍵設(shè)置,游戲的保存和游戲紀(jì)錄的保存,游戲的開始和暫停等功能。但游戲功能還存在著很多不足,首先,對游戲的動畫設(shè)計(jì)不夠熟悉,技巧性不強(qiáng),界面的設(shè)置也不夠美觀。這些對于玩家來說是非常重要,將直接決定本游戲的生存能力。其次,這款游戲還沒直接下載到手機(jī)上去實(shí)現(xiàn),只是通過模擬器在PC機(jī)上實(shí)現(xiàn)。另外此次所使用的開發(fā)工具都是用的JDK的較低版本,有些功能不能實(shí)現(xiàn)。這次游戲的功能沒能做到十全十美,是由于自身能力的不足和時(shí)間的限制,沒有對游戲的開發(fā)進(jìn)行進(jìn)一步研究,還有很多地方需要改進(jìn)。致 謝兩個(gè)多月
53、的畢業(yè)設(shè)計(jì),培養(yǎng)了我接受新事物的能力、理論分析的能力、實(shí)踐操作的能力以及發(fā)現(xiàn)并解決問題的能力。并且,通過這次畢業(yè)設(shè)計(jì)開闊了我的視野,增添了自己挑戰(zhàn)的信心,認(rèn)準(zhǔn)了自己努力的方向。在實(shí)現(xiàn)的過程當(dāng)中得到很多人的幫助,在此,要特別感謝我的指導(dǎo)老師耐心細(xì)致的指導(dǎo),使我從中受益匪淺。參考文獻(xiàn)1 Martin J.Wells.J2ME游戲編程M.北京:清華大學(xué)出版社.2005.32米川英樹.手機(jī)游戲程序設(shè)計(jì)M.北京:中國鐵道出版社.20053孫淑敏.Java2游戲開發(fā)北京M.北京:清華大學(xué)出版社.20054 張小瑋.J2ME無線應(yīng)用開發(fā) M. 北京:清華大學(xué)出版社.20055張白一.面向?qū)ο蟪绦蛟O(shè)計(jì)JavaM.西安:西安電子科技大學(xué)出版社.2002.86史斌星.Java基礎(chǔ)編程貫通教材 M. 北京:清華大學(xué)出版社.20057楊紹方.Java 程序基礎(chǔ)設(shè)計(jì) M. 北京:科學(xué)出版社.20058朱喜福.Java程序設(shè)計(jì) M. 北京:清華大學(xué)出版社.2004.79 Elliotte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度健康醫(yī)療大數(shù)據(jù)預(yù)付款全新合作協(xié)議
- 二零二五年度幼兒園保育員聘用合同書-幼兒教育創(chuàng)新項(xiàng)目合作
- 二零二五年度環(huán)保咨詢服務(wù)營業(yè)執(zhí)照轉(zhuǎn)讓合同
- 二零二五年度一手房購房意向金預(yù)定合同
- 2025年度有限責(zé)任公司股東離任協(xié)議書
- 二零二五年度拆除房屋及土地回收合同范本
- 二零二五年度學(xué)校食堂承包經(jīng)營與服務(wù)滿意度提升協(xié)議
- 二零二五年度離職后商業(yè)秘密保護(hù)及競業(yè)限制合同
- 二零二五年度房屋維修安全責(zé)任保險(xiǎn)協(xié)議
- 二零二五年度美容院養(yǎng)生保健入股合同協(xié)議
- 合肥的文化民俗
- 傷口的延續(xù)性護(hù)理
- 藥品批發(fā)公司培訓(xùn)課件模板
- 《教科版一國兩制》課件
- 急性腎挫裂傷護(hù)理查房課件
- 腦出血個(gè)案護(hù)理計(jì)劃
- 小學(xué)生電力科普小講座(課件)-小學(xué)常識科普主題班會
- 第八次課-冶金考古
- 臨床醫(yī)生如何進(jìn)行臨床科研-2
- 硝酸鎂法制取濃硝酸
- PFMEA-失效模式分析案例
評論
0/150
提交評論