【正文】
上整合了 Emini物理引擎的游戲框架。 一般框架的總體實(shí) 現(xiàn)類圖如圖 41 所示: 圖 41 一般框架的總體類圖 基于 J2ME 的益智游戲的設(shè)計(jì) 14 由于 本游戲要實(shí)現(xiàn)一些物理效果,所 以要集成 Emini 物理引擎 。 其次,游戲的邏輯控制實(shí)現(xiàn)要由畫(huà)布的 paint()方法轉(zhuǎn)移到物理引擎的 tick()方法。業(yè)務(wù)邏輯層主要是由兩個(gè)模塊組成,一個(gè)是聲音管理模 塊另外一個(gè)是物理模擬模塊。 Hero和 Robber為 MySprite類的子類。 (4) 資源管理模塊主要是對(duì)游戲中用到的圖片、聲音文件進(jìn)行管理。 保存的游戲?qū)嶓w的屬性包括:關(guān)卡 ID、地圖信息、消耗的子彈數(shù),主鍵是關(guān)卡 ID。然后將字符串 “ 040810” 轉(zhuǎn)化為字節(jié)數(shù)組存入到 RecordStore,同時(shí)返回加入的 RecordID。本系統(tǒng)的總體類圖如圖 43 所示: M I D l e tM a i n S i m u l a t i o n G r a p h i c W o r l dG r a p h i c S h a p e S e tC a n v a sW o r l d 接 口 R u n n a b l e 接 口 C o m m a n d L i s t e n e rE n d C a n v a sS t a r t C a n v a sI n d e xB o d yB u l l e t M y S p r i t eH e r o R o b b e rB a s e D a oS a v e G a m eG u a nL o a d R e s o u r c eA u d i oB a c k M u s i cF o r e M u s i cT h r e a d 圖 43 本 游戲框架 的總體類圖 下面主要介紹一 下物理模擬模塊中的核心類 Bullet類的設(shè)計(jì)。在以上分析的基礎(chǔ)上,進(jìn)行了系統(tǒng)類的設(shè)計(jì)。 直 線 OA 的方程 ()ooy k x x y? ? ? ?,圓 O 的方程:22( ) ( )oox x y y r? ? ? ? 已知 r=23, O點(diǎn)坐標(biāo) ? ?00,yx , A 點(diǎn)坐標(biāo) ? ?Ayx,A 。則方向向量 (1 , 1 ) , (1 , 1 ) , ( 1 , 1 ) , ( 1 , 1 )i j m n? ? ? ? ? ? ? ?可表 示 2D平面內(nèi)所有 X軸和 Y軸正負(fù)速度方向的組合。否則算法執(zhí)行 第 4 步。 (4) 根據(jù)圖 54 提示可知子彈的前進(jìn)方向已經(jīng)不能通行,所以,子彈的 Y 軸方向系數(shù) y_d=1, X 軸方向系數(shù) x_d=1。 (2) 根據(jù)玩家選擇的選項(xiàng)菜單,決定是加載游戲的地圖、圖片等文件還是加載其它畫(huà)布的圖片。視圖層根據(jù)狀態(tài)碼響應(yīng)不同的事件。 (1) 繪制原理 首先,將圖片整體讀入內(nèi)存。游戲中的一些圖片資源按照?qǐng)D 58 所示的方式,進(jìn)行了合并。首先,將加載完成的圖片對(duì)象有資源管理模塊傳遞給動(dòng)畫(huà)管理模塊,然后該模塊使用 Graphic 類的實(shí)例調(diào)用 piant()方法將圖片繪制到畫(huà)布,這樣建筑層就繪制完成了。同時(shí),手機(jī)也能播放背景音樂(lè) 。本游戲中首先判斷 Player 的狀態(tài),然后再根據(jù)狀態(tài)模型決定如何改變 Player 的狀態(tài),最終播放音樂(lè)。 (1) 音樂(lè)播放原理 在 Java ME 里,聲音的處理是交給接口 Player 來(lái)處理的。游戲中還需要相應(yīng)的字符提示玩家游戲的狀態(tài)。精靈層主要由馬匪和主角組成、道具層就要依據(jù)各個(gè)關(guān)卡的情況而定。所有圖片還會(huì)對(duì)應(yīng)一個(gè)圖片數(shù)組,該數(shù)組依次保存圖片的大小,幀數(shù),利用這個(gè)數(shù)組可以確定如何切割圖片即確定每一幀圖片。通過(guò)該對(duì)話框,玩家可以選擇重玩一次或者 選擇關(guān)卡。 (2) 主角還有子彈。資源的加載主要分為圖片資源、地圖文件、音樂(lè)文件。反之,若 E 在 O 左側(cè)即 n ,213y y y??,子彈的 X 軸方向系數(shù) x_d 改變?yōu)?1。否則執(zhí)行第 2 步 。 (3) 根據(jù)點(diǎn) A的位置確定子彈是在 C 或者 C? 出現(xiàn)。但是,由于游戲的特殊性,需要設(shè)置單獨(dú)處理子彈飛行的初始化工作和處理子彈碰撞后的反應(yīng)的算法即在 Body類的基礎(chǔ)上適當(dāng)?shù)募尤胱宇惖奶厥夥椒āW訌椀呐鲎泊螖?shù)是一個(gè)定值 10,當(dāng)碰撞次數(shù)小于 10時(shí),子彈可被顯示在畫(huà)布否則子彈消失。所以 Shape 對(duì)象必須存入 RMS。但 RMS 存儲(chǔ)的不是字段而是字節(jié)數(shù)組,所以在數(shù)據(jù)存儲(chǔ)之前就需要編程者設(shè)計(jì)數(shù)據(jù)的格式。 (3) RMS管理即數(shù)據(jù)庫(kù)管理功能。所以本模 15 塊主要是由 Canvas類的子類 StartCanvas、 Index、 Simulation、 EndCanvas等畫(huà)布類來(lái)實(shí)現(xiàn)的。 (1) 物理模擬模塊中涉及到的參與者有主角、馬匪,障礙物如箱子、鐵球還有主角的武器 —— 子彈。物理請(qǐng)求的情況是指物理模擬的需要,為了實(shí)現(xiàn)這個(gè)請(qǐng)求,在 GraphicWord 類的tick()內(nèi)部,可以調(diào)用父類的 tick()方法。而集成了 Emini 物理引擎的游戲框架,它的游戲場(chǎng)景 需要直接在畫(huà)布中繪制,游戲中的馬匪、箱子、主角都是集中在GraphicWord 類中。同時(shí)游戲畫(huà)布類還要實(shí)現(xiàn) Runnable接口,通過(guò) run()控制游戲的運(yùn)行,除此之外游戲一般要和用戶交互。系統(tǒng)還可以保存游戲的狀態(tài)。 (4) 資源管理 資源管理實(shí)現(xiàn)資源的加載和釋放。 其他事件流: 當(dāng)用戶沒(méi)有通過(guò)任何一關(guān)時(shí),不顯示該內(nèi) 容。物理模擬模塊的用例圖如下圖所示: B o d yM y S p r i t eB u l l e tB a l lB o x靜 止運(yùn) 動(dòng)碰 撞死 亡滑 動(dòng)滾 動(dòng)發(fā) 射 子 彈飛 行馬 匪H e r o u s e s 變 化 方 向 圖 32 物理模擬模塊用例圖 物理模擬模塊中的 飛行用例的描述如下表所示: 表 32 飛行用例描述 用例編號(hào): 109 用例名稱: 飛行 用例概述: 子彈發(fā)射以后按照 80 像素每秒的速度做勻速飛行。 系統(tǒng)顯示所有已經(jīng)通過(guò)的關(guān)卡的數(shù)據(jù)。同時(shí),本游戲還要提供玩家數(shù)據(jù)管理,系統(tǒng)默認(rèn)為玩家保存和更新關(guān)卡信息。但是,闖關(guān)過(guò)程中玩家還要小心不要被木箱、鐵球砸中。需求分析的結(jié)果影響著整個(gè)系統(tǒng)的成敗。 (3) 運(yùn)行環(huán)境 本系統(tǒng) 開(kāi)發(fā)時(shí)在如下 環(huán)境 中運(yùn)行良好: 操作系統(tǒng): Microsoft Windows XP Professional Service Pack 3。本文中所用的 JDK 版本為 JDK 。 FixPoint 數(shù)據(jù)類型的數(shù)據(jù)在內(nèi)存中仍然是以整型數(shù)據(jù)或者長(zhǎng)整型數(shù)據(jù)存儲(chǔ),只是在使用的時(shí)候?qū)?shù)據(jù)乘以對(duì)應(yīng)位所表示的權(quán)重,就是所用的數(shù)據(jù)。物理引擎首先檢測(cè)所有剛體的碰撞。 (3) World:世界,包括物理系統(tǒng)中所有的剛體、形狀、外力和模擬物理系統(tǒng)的參數(shù)。比如:重力下降、摩擦力、彈性碰撞、非彈性碰撞、快速物體的碰撞等物理現(xiàn)象的模擬。然后應(yīng)用程序管理器將它轉(zhuǎn)換到激活狀態(tài)并調(diào)用 startApp()方法。MIDP 和性能較低的 CLDC 配置一起為開(kāi)發(fā)移動(dòng)設(shè)備應(yīng)用程序提供了完整的 Java平臺(tái)。 圖 22 Java 應(yīng)用運(yùn)行環(huán)境 配置 是針對(duì)某一類設(shè)備的最小 Java 平臺(tái),它包括滿足該類設(shè)備的虛擬機(jī), 運(yùn)行的最小子集和針對(duì)該類設(shè)備的核心庫(kù)的最小子集。 Java SE 的目標(biāo)是個(gè)人計(jì)算機(jī)和服務(wù)器的應(yīng)用; Java EE 的目標(biāo)是企業(yè)計(jì)算機(jī)和服務(wù)器的應(yīng)用; Java ME 的目標(biāo)是便攜式計(jì)算機(jī)和嵌入式設(shè)備的應(yīng)用 [4][5] 。系統(tǒng)的 詳細(xì)設(shè)計(jì)和 實(shí)現(xiàn) 主要從功能模塊的詳細(xì)設(shè)計(jì)和 系統(tǒng)架構(gòu)層次的實(shí)現(xiàn)做了詳細(xì)說(shuō)明。 其次,本課題主要是設(shè)計(jì)和開(kāi)發(fā)基于 J2ME 的手機(jī)益智游戲讓子彈飛,一方基于 J2ME 的益智游戲設(shè)計(jì) 2 面有利于游戲玩家的身心健康 ,有助于讓玩家養(yǎng)成勤動(dòng)手、愛(ài)思考的習(xí)慣,另一方面還能通過(guò)游戲的設(shè)計(jì)和開(kāi)發(fā)檢驗(yàn)四年來(lái)的學(xué)習(xí)效果,積累開(kāi)發(fā)經(jīng)驗(yàn),為以后的學(xué)習(xí)和工作打下堅(jiān)實(shí)的基礎(chǔ)。各個(gè)手機(jī)制造商都有各自的實(shí)現(xiàn)方式,這種平臺(tái)間的差異給手機(jī)應(yīng)用程序的開(kāi)發(fā)和移植造成了很大的限制。 在游戲產(chǎn)業(yè)迅猛發(fā)展的同時(shí),社會(huì)各界也應(yīng)該看到游戲產(chǎn)業(yè)所帶來(lái)的負(fù)面影響。通過(guò)學(xué)習(xí)游戲開(kāi)發(fā)的相關(guān)理論知識(shí)如游戲資源的管理、游戲動(dòng)畫(huà)的設(shè)計(jì)和實(shí)現(xiàn)原理、游戲前景和背景音樂(lè)的管理方法、游戲狀態(tài)管理、物理引擎的使用方法等,根據(jù)以上開(kāi)發(fā)方法,設(shè)計(jì)了游戲的框架,開(kāi)發(fā)了讓子彈飛這款益智游戲。 論文作者簽名: 日 期: 指導(dǎo)老師簽名: 日 期: 基于 J2ME 的益智游戲設(shè)計(jì) 摘 要 由于手機(jī)已經(jīng)成為大眾生活的必需品,適用于手機(jī)的應(yīng)用程序,尤其是游戲,越來(lái) 越受到人們的關(guān)注和喜愛(ài)。畢業(yè)論文中凡引用他人已經(jīng)發(fā)表或未發(fā)表的成果、數(shù)據(jù)、觀點(diǎn)等,均已明確注明出處。 本人完全了解 平頂山 學(xué)院 有關(guān)保存、使用畢業(yè)論文的規(guī)定,同意學(xué)校保存或向國(guó)家有關(guān)部門或機(jī)構(gòu)送交論文的 紙質(zhì)版 和電子版,允許論文被查閱和借閱;本人授權(quán) 平頂山學(xué)院 可以將本畢業(yè)論文的全部或部分內(nèi)容編入有關(guān)數(shù)據(jù)庫(kù)進(jìn)行檢索,可以采用任何復(fù)制手段保存和匯編本畢業(yè)論文。 手機(jī)游戲的通用性是指游戲在不同的手機(jī)本臺(tái) 上顯示的基本相同,游戲操作流程、操作方法基本相同。易觀國(guó)際預(yù)測(cè), 20xx年手機(jī)游戲活躍玩家將達(dá)到 948 萬(wàn)戶 [1]。與此同時(shí),一些專家認(rèn)為良好的游戲例如益智游戲可以幫助學(xué)生在娛樂(lè)中學(xué)習(xí),在潛 移默化中達(dá)到學(xué)習(xí)知識(shí)的目的。尤其 JAVA ME框架提高了移動(dòng)應(yīng)用的通用性,為開(kāi)發(fā)者提供了便利。相關(guān) 技術(shù)與工具 簡(jiǎn)介主要說(shuō)明了本游戲在 設(shè)計(jì)過(guò)程中用到的 關(guān)鍵 技術(shù)和開(kāi)發(fā)工具,為項(xiàng)目的設(shè)計(jì)做技術(shù)支持。最后,敘述了本游戲的開(kāi)發(fā)意義和論文的組織安排。 因此, J2ME 定義了一種靈活的層次規(guī)范結(jié)構(gòu)來(lái)規(guī)范各種移動(dòng)設(shè)備,不同層次的規(guī)范相互協(xié)作來(lái)提供一個(gè)完整的移動(dòng) Java 平臺(tái)。簡(jiǎn)表針對(duì)不同的移動(dòng)設(shè)備定義了各種高級(jí) API,這些高級(jí) API 通常對(duì)于其它硬件設(shè)備不相關(guān)的擴(kuò)充類庫(kù)。 MIDlet 的生命周期包括三個(gè)基本狀態(tài):暫停狀態(tài)( Paused)、激活狀態(tài)( Active)和銷毀狀態(tài)( Destroyed)。但是,這種狀態(tài)的改變不一CLDC MIDP KVM Host Operation Systems Personal Profile Foundation Profile CDC CVM Card VM Java Card API 基于 J2ME 的益智游戲設(shè)計(jì) 6 定成功。它的靜態(tài)屬性有形狀、重量、摩擦系數(shù)、彈性系數(shù)等和狀態(tài)屬性:位置、速度等。 (5) Contact: 接觸。包的層次結(jié)構(gòu)如圖 25所示: 圖 25 Emini 物理引擎包的層次結(jié)構(gòu) Emini Physics Engine 的數(shù)學(xué)知識(shí) 由于 不支持浮點(diǎn)數(shù)運(yùn)算,為了在運(yùn)算中盡量準(zhǔn)確, Emini 物理引擎使用 FixPoint 數(shù)據(jù)類型表示浮點(diǎn)數(shù)據(jù)。那么內(nèi)存中存儲(chǔ) 的就是 2048,用 2048 表示 。 WTJ 是一個(gè)用于 J2ME 開(kāi)發(fā)的 Eclipse 插件。最后介紹了開(kāi)發(fā)工具、開(kāi)發(fā)平臺(tái)和運(yùn)行環(huán)境。 玩家開(kāi)始游戲以后,可以控制游戲中的主角張牧之,通過(guò)點(diǎn)擊觸摸屏發(fā)射子彈,子彈會(huì)在空中飛行,飛行的過(guò)程中會(huì)擊中在飛行路線上的馬匪。 游戲設(shè)計(jì)目標(biāo) 本游戲的主要目的是讓玩家體會(huì)到益智游戲的樂(lè)趣,通過(guò)思考子彈的碰撞路徑進(jìn)而讓子彈消滅麻匪,消滅完所有馬匪后,玩家就可通過(guò)這一關(guān)。玩家的操作有設(shè)置播放背景音樂(lè)、設(shè)置播放音效、關(guān)閉音效、關(guān)閉背景音樂(lè)、點(diǎn)擊觸摸屏、選擇菜單項(xiàng)。下面開(kāi)始介紹各個(gè)功能模塊 的需求。 子彈發(fā)送碰撞。通過(guò)動(dòng)畫(huà)的繪制操作才能讓游戲更真實(shí)更具有吸引力。 (6) RMS 管理。 游戲框架設(shè)計(jì) 一般基于 J2ME的手機(jī)應(yīng)用程序都必須是 MIDlet的子類,并且子類必須重寫(xiě)父類的 startApp()、 pauseApp()和 destroyApp()。這就讓本游戲的框架與傳統(tǒng)的框架有些不同。 tick()方法的作用是在物理模擬的每一個(gè)周期內(nèi),處理游戲的物理方面的邏輯請(qǐng)求和物理模擬請(qǐng)求。控制層主要是由游戲狀態(tài)模塊組成,同時(shí)還要接受視圖層傳送的用戶輸入處理后返回處理結(jié)果。 GraphicWord是 Word類的子類,該類作為所有 Body類的容器。所以,涉及到文件的加載類 LoadResource類。 保存的游戲是指,玩家正在玩一 個(gè)游戲,因?yàn)槟撤N原因(接電話、查看短信等)游戲中斷了,系統(tǒng)自動(dòng)保存玩家現(xiàn)在的游戲狀態(tài)。 關(guān)卡的數(shù)據(jù)格式為關(guān)卡 ID獎(jiǎng)勵(lì)子彈數(shù),如 “0101”,第一關(guān)獎(jiǎng)勵(lì)一發(fā)子彈。 Bullet是子彈類,該類在主角發(fā)射子彈以后出現(xiàn)在畫(huà)布上。 19 5 系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 功能模塊 詳細(xì) 設(shè)計(jì) 物理模擬模塊 物理模擬模塊的實(shí)現(xiàn)主要是基于 Emini物理引擎,通過(guò)調(diào)用、重寫(xiě)或?qū)崿F(xiàn)新的方法完成碰撞檢測(cè)和處理、滿足動(dòng)量定理的碰撞后的反應(yīng)、物體運(yùn)動(dòng)過(guò)程中在摩擦力的作用下物體能靜止;物體在空中時(shí)能夠在重力作用下自由下落。 (1) 求直線 OA 的斜率 ( ) /