基于J2ME平臺的手機游戲程序開發 (手機游戲)畢業設計及論文_第1頁
基于J2ME平臺的手機游戲程序開發 (手機游戲)畢業設計及論文_第2頁
基于J2ME平臺的手機游戲程序開發 (手機游戲)畢業設計及論文_第3頁
基于J2ME平臺的手機游戲程序開發 (手機游戲)畢業設計及論文_第4頁
基于J2ME平臺的手機游戲程序開發 (手機游戲)畢業設計及論文_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

PAGE基于J2ME平臺的手機游戲程序開發摘要隨著手機的日益普及、Java功能在移動設備上的實現,Java應用程序產生的手機增值服務逐漸體現出其影響力,對豐富人們的生活內容、提供快捷的資訊起著不可忽視的作用。本篇論文共分為五個部分:包括引言、J2ME技術概覽、開發環境及相關技術、游戲設計和具體設計。其中具體設計是本篇論文的重點。整篇論文都是圍繞著這一部分來展開論述的,在這一部分里詳細介紹一款借助J2ME的MIDP類庫開發手機游戲的全過程。關鍵詞:手機游戲J2MEMIDPAbstractMobilephonevalue-addedservicehasbeenmakinganonnegligibleimpactonenrichingpeople'slivesandsupplyingfastinformationsasresultofincreasingpopularityofmobilephoneandimplementationofJavatechnologyonmobileequipment.Thispaperisdividedintofiveparts:includingintroduction,J2MEtechnologyoverview,developmentenvironmentandrelatedtechnology,gamedesign,andthespecificdesign.Onespecificdesignisthekeypartinthispaper.ThewholethesisisbasedonthisparttodiscusswhichdetailsthefullprocessofcellphonegamedevelopmentbasedontheMIDPclasslibraryofJ2ME.Keywords:mobilegameJ2MEMIDP

目錄1.緒論 11.1J2ME的背景與應用現狀 11.2手機游戲的發展現狀 21.3研究目的與內容 22.J2ME技術概覽 32.1J2ME簡介 32.2J2ME體系結構 32.2.1 JVM(虛擬機) 32.2.2J2ME配置 42.2.3 J2ME簡表 42.3移動設備上游戲的限制 52.3.1 內存 62.3.2 手機的界面 62.3.3 缺少庫文件支持 63.開發環境及相關技術 83.1游戲開發環境 83.2關于WirelessToolKit 84.《勇闖伏魔洞》RPG游戲設計 94.1游戲簡介 94.2游戲的流程和類結構 94.2.1游戲的基本運行流程 94.2.2游戲的類結構 94.3圖像和動畫渲染 104.3.1 GameCanvas 104.3.2 Layer 114.3.3 LayerManager 114.3.4 Sprite 114.3.5 TiledLayer 124.4游戲畫布類Game_Canvas的實現 124.4.1Game_Canvas繼承GameCanvas類,用來實現整個游戲的主界面 124.4.2此游戲畫布類中主要的實現 144.5游戲的運行 235.總結 25謝辭 26參考文獻 27XXXXXXXXXXX畢業論文-PAGE27-1.緒論1.1J2ME的背景與應用現狀自Java問世以來,SunMicrosystems已成功地將Java平臺技術推廣到臺式機及服務器。隨著移動電話和個人數字助理(PDA)的日益普及和性能的不斷提高,將Java技術應用于移動設備這個發展方向,將在未來得到更高的重視。J2ME(Java2MicroEdition)是為小型設備設計的Java平臺。它包含專門設計的輕量級虛擬機,一個最小化的核心庫和標準Java庫的輕量級替代物。J2ME是無線PDA和高性能的移動電話的理想移動客戶機平臺。SunMicrosystems將J2ME定義為“一種以廣泛的消費性產品為目標的高度優化的Java運行時環境,包括尋呼機、移動電話、可視電話、數字機頂盒和汽車導航系統。”自從1999年DeveloperConferencence上聲明之后,J2ME為小型設備帶來了Java語言的跨平臺功能,允許移動無線設備共享應用程序。在另一方面,隨著移動通信技術的高速發展,移動設備的性能日益提高,同時用戶對于移動設備上應用程序的需求也越來越多。但是,移動設備制造商本身的軟件開發能力和資源都有限,無法充分滿足用戶的需要。同時,由于以前主要移動設備上的程序主要用C語言開發,并釆用專用的操作系統,其他眾多軟件開發商也無法為其開發新的應用程序。這種兩難的局面嚴重的限制了移動設備上新應用的推廣于普及。Java技術的開放性、安全性和龐大的社會己有資源,以及其跨平臺性,即“編寫一次,到處運行”的特點,使Java技術成為智能手機軟件平臺的事實標準。采用Java技術后,編寫應用程序和提供服務的人就不必關心接受其服務的手機采用的是什么操作系統和芯片,只要按照Java的要求寫出的程序就可以運行;同樣,生產手機的廠商也不必顧慮將來誰來提供增值服務。可以看出,釆用Java技術,可以建立完整、高效的無線數據增值服務產業鏈,從而為用戶提供靈活、個性化、內容方式多樣的服務。如今支持Java己經成了主流手機的標準,支持下載新的Java應用也是手機的一個重要賣點。到2005年6月,全世界已經有大約1億部Java手機在使用,除中國大陸外共有53個移動運營商正式推出了基于Java技術的無線數據增值服務。在國內,中國移動通信集團已經建立了無線Java增值服務體系,并推出了“百寶箱”等服務品牌,包括游戲百寶箱、娛樂百寶箱、商務百寶箱、生活百寶箱等,己經于2003年中國聯通公司也正在其CDMAIX網絡上建立無線Java增值服務體系,目前系統正在建設過程中,并且2003年9月26日中國聯通、北京振戎融通公司和Sun公司在人民大會堂宣布聯合發起成立“UniJa技術聯盟”1.2手機游戲的發展現狀所謂“手機游戲”,就是依托移動通信網絡運行在手機終端上的游戲。從誕生到現在,手機游戲經歷了從最初的簡單文字類游戲、簡單的圖形界面游戲到可下載的單機版游戲再到大型手機網絡游戲的發展歷程,手機游戲的業務形態日益成熟,展示出廣闊的市場前景。有關機構預測,在未來5年里,手機游戲將在歐洲形成30億歐元的大市場。另據IDC預測,到2006年,手機游戲業務的軟件、硬件及服務所帶來的收入將達到40億美元。近兩年來,手機游戲業務在日韓等國已經顯示出勃勃生機,成為一個潛力巨大的文化產業。以日本NTTDoCoMo目前的經營狀況為例,移動游戲己經成為該公司的重要收入來源。日本最大的游戲網站BanDai擁有200多萬用戶,每個用戶每月平均花2.75美元在i-mode手機上玩游戲,這為DoCoMo和BanDai帶來約550萬美元的收入。與日、韓等國相比,中國的手機游戲市場起步比較晚,但中國有一個巨大的手機用戶群,手機游戲擁有廣闊的市場前景。目前,在中國有8000多萬電腦網絡用戶,而中國的手機用戶卻已經超過3億。與PC游戲不同,手機游戲擺脫了線纜的束縛,具有隨時、隨地、隨身的特點,更適合人們在移動中休閑和娛樂。顯然,手機游戲產業一旦啟動,其能量將不亞于目前的電腦網絡游戲。數據顯示,2004年中國手機游戲市場規模超過8億元人民幣,預計在2005年手機游戲產業市場規模將達到14.41億元人民幣。雖然目前手機游戲用戶數只占3億用戶的很小一部分,但隨著手機游戲產業發展環境的日益成熟,其發展速度將一日千里。1.3研究目的與內容基于移動設備的應用軟件,從以前的只提供基本的語音,通訊錄和SMS功能,到后來提供WAP(WirelessApplicationProtocol)等基本的附加應用,再到目前逐漸豐富的各種應用。J2ME平臺的出現,為第三方軟件開發商為移動設備開發應用軟件帶來了極大的便利,開發商可以方便的將應用軟件移植到移動設備上。豐富的Java資源和Java開發人員,可以大大的縮短開發周期。同時也可以為移動應用提供在線升級和動態下載的服務。本次研究的目的主要在于分析基于J2ME平臺進行手機游戲開發所用到的核心技術,如繪圖、圖形與動畫顯示,響應用戶輸入,網絡通訊。并且還要針對J2ME平臺本身的缺點,以及具體的應用,提出自己的改進方法和解決方案。2.J2ME技術概覽2.1J2ME簡介SunMicrosystems公司將J2ME定義為“一種以廣泛的消費性信息產品為目標的,高度優化的java運行時環境”。它主要針對消費類電子設備,例如,蜂窩電話和可視電話、數字機頂盒、汽車導航系統等。J2ME技術在1999年的JavaOneDeveloperConference大會上正式推出,它將Java語言與平臺無關的特性移植到小型潛入式設備上,允許移動無線設備之間共享應用程序。在消費電子和嵌入式設備領域,內存從幾百KB到幾十MB,從沒有屏幕到Web-TV,CPU從低功耗的嵌入式處理器到幾百MHz的RISC處理器,硬件條件的差異是相當大的。這就使得J2ME的標準需要有不同的層次和類別來適應這個復雜的領域,因此相比之下J2ME就比J2SE和J2EE的標準要復雜得多。盡管如此,J2ME在適用于這些設備的同時也保留了Java的傳統特性,即代碼具有可移植性、部署靈敏性、安全的網絡傳輸性和代碼的穩定性等。因此,J2ME目前已經被廣泛應用于消費類嵌入式設備,成為嵌入式開發的一種標準。2.2J2ME體系結構從整體看,J2ME平臺由以下幾部分組成:●Java虛擬機,針對不同的嵌入式設備以及為了滿足不同的需要,提供了KVM和CVM兩大虛擬機。●配置(configuration),它是將某一類特定應用范疇的設備的共性提取出來形成的規范。為開發人員提供了最基礎,能在所有平臺上通用的核心API類庫。●簡表(profile),它是將某一個特殊行業或領域內的設備的特性提取出來,形成對特定領域特性的總結,是作為配置的一個補充。●一些可選包,主要包括設備廠商提供的OEM的API類庫。其中前三項組成了J2ME的基本運行環境。其中Java虛擬機是運行環境的核心,其運行于設備中的操作系統之上,再往上是具體的J2ME配置,包括更具設備的資源需要而提供的基本核心API類庫,配置的上面是一個或者多個針對不同應用領域而設置簡表。JVM(虛擬機)JVM是專門為微型電子設備與資源受限設備如:手機、尋呼機、移動互聯網設備、家用微電子設備等設計的一種輕便、緊湊的JAVA虛擬機。JVM可以為微型電子設備提供一個完整的JAVA運行環境,除了一些微型設備所必需的適當的功能有所不同外,它是由JAVA虛擬機規范定義的真實的JAVA虛擬機。它是專門為那些受資源限制,只有幾百K字節內存的微型設備設計的。基于上述原因,JVM具有以下幾個特點:(1)小,僅具有40KB至80KB的靜態內存;(2)輕便、精巧;(3)模塊化并可定制;(4)盡可能完全緊湊的完成設計目的。2.2.2J2ME配置配置是將基本運行的環境定義為一套核心類和一個運行在特定類型設備上的特定的虛擬機。J2ME中提供了兩種配置:CLDC和CDC。CDC針對的設備主要是數字電視、機頂盒、網絡電話、車載計算設備,特點是有線連接,穩定而持續的電源供應,設備資源比較受限。CLDC支持的設備主要包括無線電話、手機、PDA以及小型零售支付段等。處理能力較弱,只包含程序運行所需要的最小類庫。J2ME簡表簡表是面向配置之上縱向設備,建立在配置的頂部,定義了配置之上受支持設備的類型。目前J2ME領域里使用最廣泛的是移動信息設備簡表(MIDP),主要針對手機和其他雙向移動通信設備而設計的。MIDPlet的開發環境需要有java2SDK1.3版以上與MIDP的類庫、以及后述的運行前驗證工具三種。在J2MEWTK中除了包括MIDP的類庫、運行前驗證工具之外,還會把編譯與包裝(JAR文件化)、JAD文件的創建、模擬器的啟動等在開發MIDP需要用到的操作加以集成。當完成了JDK1.4以及J2MEWTK的安裝以后,就可以開始對游戲項目進行創建了。MIDlet開發的基本開發流程如下:(1)編寫MIDlet程序源代碼;(2)編譯MIDlet程序;(3)對編寫后的類文件進行預校驗;(4)編寫清單文件MANIFEST.MF;(5)對MIDlet程序進行打包;(6)編寫Java應用程序描述符(jad)文件。MIDlet文件的構成:(1)JAR(JavaARchive)文件:集成了ClassFile與圖像、聲音等內容的數據文件,雖然與J2SE的文件相同,但是列表的文件內容不同;(2)JAD(JavaApplicationDescriptor)文件:指定啟動的MIDlet類名稱或是數據文件大小、版本等信息;(3)KDDI的地方,使用組合了JAR文件與JAD文件的KDDI專用的KJK(KDDIJavaeXtension)。生命周期是指程序從開始執行到退出的生命過程。MIDlet是以下列的生命周期來運行的:(1)系統調用繼承自MIDlet類的默認構造方法,創建對象;(2)系統進入MIDlet生命周期的暫停狀態,這個是MIDlet生命周期的第一個狀態;(3)系統調用startAPP()方法,然后進入MIDlet的運行狀態,程序正常執行;(4)如果在暫停轉臺或者運行狀態下發生錯誤,則程序會調用destoryAPP()方法,然后進入銷毀狀態。整個過程如圖2-1所示:圖2-22.3移動設備上游戲的限制在開發J2ME移動游戲過程中,開發人員面對的最大的困難和障礙是,本來在PC機和控制臺上習以為常的應用在移動設備上卻遇到各種限制,包括內存的、屏幕尺寸的、甚至色彩的限制。由于游戲中的用戶輸入、圖形圖像、動畫、聲音和振動的高交互性,這種限制在移動游戲中表現得比移動應用程序更加明顯。此外,不僅要注意不同制造商之間產品的不同,也要了解同一個制造商的不同移動設備模型的差別。不同手機的模式在內存、色彩、屏幕尺寸和用戶界面等各個方面都有很多不同。內存一般情況下,內存被認為是內存區域中的堆棧,在游戲執行的時候儲存信息,在游戲終止后被釋放。顯而易見,手機上可以使用的內存總量要比PC機上少的多,因此在開發游戲的時候,要先查看所針對機型的內存容量,注意自己程序內存使用情況,已防止需要的內存空間超過可以分配的大小。另外的存儲空間包括RMS(RecordManagementSystem)。它可以用來存儲玩家的最高分數或者上次保存的設置。可供使用的RMS大小也是要注意的。PC機上的硬盤和內存在使用一段時間后就會出現碎片,在手機的存儲空間上也會出現這種情況。例如需要寫一個大的對象到內存中,但是卻找不到足夠的一整塊連續的空間,于是系統就將它分成幾塊分別存儲在內存的各個空閑空間中。這不但會導致存儲空間訪問時間的增加,當內存中大的對象被清除后會留下很多內存空洞,從而導致新的對象被存儲時也會遍布內存各處。手機的界面最近幾年,各個手機制造商開始放棄傳統的手機界面,進而追求更為個性化的按鍵和控制,這歸結于制造商對更加友好的用戶界面的孜孜不倦的追求。雖然一些制造商已經意識到沒有絕對最好的用戶界面,只有對某些有特殊需求的特定的群體比較好的用戶界面,這主要取決于用戶除了使用手機打電話外還做什么,比如聽音樂、玩游戲、或這記錄商業事件。當然,新界面的設計也擴展了手機市場的邊界和吸引力。這意味著又增加了開發者需要考慮的一個因素,比如,把數字鍵“5”設定為攻擊,但是也許在某些手機上這個鍵不是很方便就可以按到的。缺少庫文件支持由于J2ME是J2SE的子集,所以它并沒有包含所有的包和類。也就是說要么不使用這些類,要么自己擴展所需要的類。例如,J2ME中不支持浮點數(float),故不能進行小數運算,也不能使用sin、cos和tan運算,但是在游戲開發中,小數是經常要用到的。然而,可以用定點數學運算的方式來代替小數運算。比方說,如果想精確到小數點后三位,可以用1000來表示1.000。在變換的過程中要不斷的乘以或者除以10,以得到正確的結果。至于角度可以用0、30、60、90、120、150、180、210、240、270、300、330、360這種對應角度值的整數值來代替,事實上由于移動設備的屏幕往往都很小,所以太精確的計算也是沒有意義的。3.開發環境及相關技術3.1游戲開發環境操作系統:MicrosoftWindowsXP程序語言:Java2開發包:Java(TM)2StandardEdition(5.0)SunMicro.J2MEWirelessToolKit2.23.2關于WirelessToolKitWTK(WirelessToolKit)是Sun公司針對J2ME推出的用于手機和Palm等移動設備的開發包,是除手機廠商的專用開發包外唯一的手機模擬器開發包。它通用性高,開發出的應用程序可保證能運行在大部分設備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強大的功能和完善的調試手段,但它提供運行模擬器的最基本組件,是其他IDE需集成采用的必備元素。目前我們可以獲取的有四個版本,分別是1.0.4,2.0,2.1和2.2。每個版本都包括英語,日語,簡體中文,繁體中文4個語種包。(1)1.0.4版只能夠開發MIDP1.0(2)2.0版只能夠開發MIDP2.0應用程序;(3)2.1版則可以同時開發MIDP1.0、JTWI(CLDC1.0,MIDP2.0,WMA1.1)可改用CLDC1.1或加入MMAPI1.1,自定義(自己隨機組合Configuration,Profile以及OptionalPackage)三種環境下的應用程序;(4)2.2版中,WTK全面的支持JTWI規范。具體的說,即MIDP2.0,CLDC1.1,WMA2.0,MMAPI1.1,WebServices(JSR172),FileandPIMAPIs(JSR75),BluetoothandOBEXAPIs(JSR82),and3DGraphics(JSR184);同時您也可以使用該版本開發面向CLDC1.0和MIDP1.0的應用程序。系統要求上,WTK2.2至少需要50MB可用硬盤,128MB系統RAM和800MHZPentiumIIICPU。4.《勇闖伏魔洞》RPG游戲設計4.1游戲簡介這是一款益智游戲與RPG角色扮演類的結合,主要還是以RPG類型為主,利用益智游戲的休閑可玩性和RPG角色扮演的故事擴展性相結合,把益智游戲的玩點和RPG的耐玩結合到一起,給玩家一個全新的感受。游戲的主要情節是游戲中的主角不經意間通過一款網絡游戲穿越來到了西元一九五年的西涼召德村中,無意間卷入了一場鬼魅的陰謀之中,從此背負了一個巨大的使命——拯救所有被鬼魅抓走的人。游戲通過做指定的幾個任務,完成任務通過游戲。游戲采用“踩地雷”遇敵方式,同時進入戰斗場面,進行游戲。游戲中玩家需要和各個NPC對話找到相應的任務線索完成任務,其中共有十一個NPC,主角根據NPC的對話找出線索完成任務,其中與三個NPC對話會進入相應的任務場景,需要玩家自己和NPC對話找到。這樣設計是為了增加游戲的可玩性和故事性。為了增加游戲的難度我們特意設計了人工智能這個功能,在游戲戰斗的界面中加入了npc的行為判定,主動攻擊型,玩家進入任務場景時敵人進行追擊和攻擊。判斷檢測范圍,當主角與敵人的距離小于64像素是敵人對主角進行追擊,當主角與敵人的距離小于16像素是敵人對主角進行攻擊。這樣也增加了不同關卡游戲的難度性和可玩性。4.2游戲的流程和類結構4.2.1游戲的基本運行流程本游戲的基本運行流程是在MIDlet啟動后把整個畫布作為一個線程,隨時準備響應用戶按鍵操作的KeyPressed()方法。在主角進入到主場景時開啟與主場景NPC的對話方式,執行主角行走移動方法。通過與NPC對話方式進入任務場景1,當主角擊敗人物場景1所有怪物時,開啟任務場景1NPC對話方式進入任務場景2,失敗則游戲結束。當主角進入任務場景2時,擊敗所有敵人則通過任務場景2的NPC對話系統回到主場景。主角回到主場景后可加血后通過NPC進入任務場景3.當主角進入任務場景3時,擊敗所有怪物則游戲勝利,反之游戲結束。4.2.2游戲的類結構MyMIDlet:游戲的主入口,開始游戲Game_Canvas:游戲類,用于游戲運行的類,實現游戲中的顯示Player:主角類Enemy:敵人類MyMap:地圖類Dialog:對話類Music:音樂類,實現游戲所有音樂,包括初始化和播放。MyMIDMyMIDletMyCanvasGame_CanvasEenmyPlayerMusicDialogMyMap4.3圖像和動畫渲染MIDP2.0相對于1.0來說,最大的變化就是新添加了用于支持游戲的API,它們被放在javax.microedition.lcdui.game包中。游戲API包提供了一系列針對無線設備的游戲開發類。由于無線設備僅有有限的計算能力,因此許多API的目的在于提高Java游戲的性能,并且把原來很多需要手動編寫的代碼如屏幕雙緩沖、圖像剪裁等都交給API間接調用本地代碼來實現。各廠家有相當大的自由來優化它們。游戲API使用了MIDP的低級圖形類接口(Graphics,Image,等等)。整個game包僅有5個Class。GameCanvas這個類是LCDUI的Canvas類的子類,為游戲提供了基本的“屏幕”功能。除了從Canvas繼承下來的方法外,這個類還提供了游戲專用的功能,如查詢當前游戲鍵狀態的能力,同步圖像輸出;這些功能簡化了游戲開發并提高了性能。GameCanvas類提供了基本的游戲用戶接口。除了從Canvas繼承下來的特性(命令,輸入事件等)以外,它還提供了專門針對游戲的功能,比如后備屏幕緩沖和鍵盤狀態查詢的能力。每個GameCanvas實例都會有一個為之創建的專用的緩沖區。因為每個GameCanvas實例都會有一個唯一的緩沖區。可以從GameCanvas實例獲得其對應的Graphics對象,而且,只有對Graphics對象操作,才會修改緩沖區的內容。外部資源如其他的MIDlet或者系統級的通知都不會導致緩沖區內容被修改。LayerLayer類代表游戲中的一個可視化元素,例如Sprite或TiledLayer是它的子類;這個抽象類搭好了層(Layer)的基本框架并提供了一些基本的屬性,如位置,大小,可視與否。出于優化的考慮,不允許直接產生Layer的子類(不能包外繼承)。LayerManager對于有著許多Layer的游戲而言,LayerManager通過實現分層次的自動渲染,從而簡化了游戲開發。它允許開發者設置一個可視窗口(ViewWindow),表示用戶在游戲中可見的窗口;LayerManager自動渲染游戲中的Layer,從而實現期望的視圖效果。LayerManager管理一系列的Layer。LayerManager簡化了這染每個Layer的過程,每個添加的Layer都將在正確的區域并以正確的順序被渲染。LayerManager維護一個順序列表,以便管理如何追加、插入和刪除Layer。一個Layer的索引號關聯了它的Z軸位置(z-order);索引號為0的Layer最接近用戶,索引號越大的Layer離用戶越遠。索引號永遠是連續的,即,如果一個Layer被刪除,后面的Layer的索引號都將調整使得索引號保持連續。SpriteSprite又稱“精靈”,也是一種Layer,可以顯示一幀或多幀的連續圖像。但所有的幀都是相同大小的,并且由一個Image對象提供。Sprite通過循環顯示每—頓,可以實現任意順序的動畫;Sprite類還提供了許多變換(翻轉和旋轉)模式和碰撞檢測方法,能大大簡化游戲邏輯的實現。Sprite是一個基本的可視元素,可以用存儲在圖像中的一幀或多幀來渲染它;輪流顯示不同的幀可以令Sprite實現動畫。翻轉和旋轉等幾種變換方式也能應用于Sprite使之外觀改變。作為Layer子類,Sprite的位置可以改變,并且還能設置其可視與否。TiledLayerTiledLayer又稱“磚塊”,這個類允許開發者在不必使用非常大的Image對象的情況下創建一個大的圖像內容。TiledLayer有許多單元格構成,每個單元格能顯示由一個單一Image對象提供的一組貼圖中的某一個貼圖。單元格也能被動畫貼圖填充,動畫貼圖的內容能非常迅速地變化;這個功能對于動畫顯示非常大的一組單元格非常有用,例如一個充滿水的動態區域。TiledLayer由一系列單元格組成,單元格可被一組貼圖填充。這個類允許不必使用特別大的圖像來創建大的虛擬層。這個技術在2D游戲中被廣泛用于創建特別大的可卷動的背景。在游戲中,某些方法如果改變了Layer,LayerManager,Sprite和TiledLayer對象的狀態,通常并不能立刻顯示出視覺變化。因為這些狀態僅僅存儲在對象里,只有當隨后調用我們自己的paimo方法時才會更新顯示。這種模式非常適合游戲程序,因為在一個游戲循環中,一些對象的狀態會更新,在每個循環的最后,整個屏幕才會被重繪。基于輪詢也是現在視頻游戲的基本結構。由上面的這5個類就能夠實現基本的圖像和動畫的顯示功能。由Sprite類來創建動畫元素,它可以顯示PNG格式文件的某一部分,作為動畫的某一幀。可以方便的對它進行幀的切換,屏幕上位置的變化。以此來顯示游戲中人物、怪物等可移動的部分。用TiledLayer來創建游戲的背景。它能夠將屏幕分割成等大的若干部分,每一部分都可以用PNG文件的一部分來填充。這就可以方便的畫出游戲需要的背景圖片。還可以根據某一塊部分時候填充了圖片,來和Sprite類進行碰撞檢測。Sprite類和TiledLayer類都是Layer類的子類,而LayerManager可以管理這些Layer。它能夠添加和移除一個Layer,也可以對這些Layer進行排序,從而在重畫的時候達到需要的疊加效果。這樣,對于一些小游戲來說,完全可以滿足要求,并且能夠提供相當強的兼容性和可移植性。4.4游戲畫布類Game_Canvas的實現4.4.1Game_Canvas繼承GameCanvas類,用來實現整個游戲的主界面⑴顯示主場景的方法publicvoidpaint(Graphicsg){ }⑵圖層管理器publicvoidLayer_Manager(){ }⑶主場景掃描publicvoidsetViewWindow(){ }⑷主角移動publicvoidPlayer_Move(){ }⑸定義各場景碰撞層publicvoidcollides(){ }⑹主角碰撞后的移動publicvoidpz_move(){ }⑺主角與NPC的碰撞publicvoidcollides_npc(){ }⑻加載任務場景各圖層publicvoidLayer_renwu(){ }⑼繪制血量框publicvoiddraw_hp(){ }⑽怪物的碰撞檢測publicvoidguai_pz(){ }⑾主角攻擊怪物publicvoidpengzhuang_guai(){ }⑿顯示怪物publicvoidhuaguai(){ }⒀按鍵響應publicvoidkeyPressed(intkey){ }4.4.2此游戲畫布類中主要的實現地圖的鋪設主場景和任務場景包括以下這些圖層:背景層(地表層)TiledLayertl_bj=null;碰撞層(建筑層)TiledLayertl_pz=null;NPC(N層)、主角層publicstaticint[]NPC1={0};主場景和任務場景地圖數組文件的制作:新建類MyMap,繼承自CameCanvaspublicclassMyMapextendsGameCanvas{ }定義主場景背景層和碰撞層數組publicstaticintmap_bj[][]={}publicstaticintmap_pz[][]={}顯示主場景:定義控制各場景是否可見的狀態變量booleanview_main=false; booleanview_renwu1=false; booleanview_renwu2=false; booleanview_renwu3=false;定義初始化主場景和任務場景的方法publicvoidinit_zhuchangjing(){ try{ map=Image.createImage("/dituw.png"); }catch(IOExceptione){ e.printStackTrace(); } tl_bj=newTiledLayer(53,20,map,16,16); tl_pz=newTiledLayer(53,20,map,16,16); for(inti=0;i<20;i++){ for(intj=0;j<53;j++){ if(map_bj[i][j]!=0){ tl_bj.setCell(j,i,map_bj[i][j]); } if(map_pz[i][j]!=0){ tl_pz.setCell(j,i,map_pz[i][j]);}}}}publicvoidinit_renwu(){ try{ map1=Image.createImage("/renwu1.png"); map2=Image.createImage("/renwu2.png"); map3=Image.createImage("/renwu3.png"); }catch(IOExceptione){ e.printStackTrace(); } if(view_renwu1){ tl1_bj=newTiledLayer(25,20,map1,16,16); tl1_pz=newTiledLayer(25,20,map1,16,16); for(inti=0;i<20;i++){ for(intj=0;j<25;j++){ if(renwu1_bj[i][j]!=0){ tl1_bj.setCell(j,i,renwu1_bj[i][j]); } if(renwu1_pz[i][j]!=0){ tl1_pz.setCell(j,i,renwu1_pz[i][j]); } } } tl1_bj.setPosition(53*16,0); tl1_pz.setPosition(53*16,0); } if(view_renwu2){ tl2_bj=newTiledLayer(25,20,map2,16,16); tl2_pz=newTiledLayer(25,20,map2,16,16); for(inti=0;i<20;i++){ for(intj=0;j<25;j++){ if(renwu2_bj[i][j]!=0){ tl2_bj.setCell(j,i,renwu2_bj[i][j]); } if(renwu2_pz[i][j]!=0){ tl2_pz.setCell(j,i,renwu2_pz[i][j]); } } } tl2_bj.setPosition(78*16,0); tl2_pz.setPosition(78*16,0); } if(view_renwu3){ tl3_bj=newTiledLayer(30,20,map3,16,16); tl3_pz=newTiledLayer(30,20,map3,16,16); for(inti=0;i<20;i++){ for(intj=0;j<30;j++){ if(renwu3_bj[i][j]!=0){ tl3_bj.setCell(j,i,renwu3_bj[i][j]); } if(renwu3_pz[i][j]!=0){ tl3_pz.setCell(j,i,renwu3_pz[i][j]); } } } tl3_bj.setPosition(103*16,0); tl3_pz.setPosition(103*16,0); } }④定義地圖資源圖片:map=Image.createImage("/dituw.png");map1=Image.createImage("/renwu1.png"); map2=Image.createImage("/renwu2.png"); map3=Image.createImage("/renwu3.png");實例化背景層和碰撞層(屏幕分割20*53,圖片切割16*16)tl_bj=newTiledLayer(53,20,map,16,16); tl_pz=newTiledLayer(53,20,map,16,16);填充背景層和碰撞層(填充圖層)for(inti=0;i<20;i++){ for(intj=0;j<53;j++){ if(map_bj[i][j]!=0){ tl_bj.setCell(j,i,map_bj[i][j]); } if(map_pz[i][j]!=0){ tl_pz.setCell(j,i,map_pz[i][j]); } } }將主場景加入圖層管理器:通過圖層管理器的方法setViewWindow()來設置可視窗口實例化地圖對象和圖層管理器MyMapmymap=newMyMap();LayerManagerlm=newLayerManager();各個圖層的切換是通過圖層管理器的remove()和append()方法來實現的將主場景的背景層和碰撞層加入圖層管理器lm.append(mymap.tl_pz);lm.append(mymap.tl_bj);與NPC的對話定義碰撞NPC的方法publicvoidpz_move(){ switch(orietation){ caseO_UP: player.spPlayer.move(0,6); break; caseO_DOWN: player.spPlayer.move(0,-6); break; caseO_LEFT: player.spPlayer.move(6,0); break; caseO_RIGHT: player.spPlayer.move(-6,0); break; } }確定要和哪些NPC對話,對話內容publicstaticStringdlg[]=newString[]{ "主角:你好,這里是哪里啊?", "小兔:你好,歡迎來到西涼召德村,我是小兔。", "主角:我叫袁熙,我怎么在這里,太奇怪了,我好餓啊,請問哪里有吃的東西?", "小兔:前方有一家客棧,你可以在那里休息。", "主角:謝謝啊。", "主角:老板,你這里有什么吃的啊,我好餓啊!!!", "老板:孩子,這里只有牛肉面了,別的都剛剛賣完。", "主角:好吧,來3碗。", "老板:孩子,看你這么能吃,想必武功也很好吧?", "主角:還行吧,我練過點功夫。", "老板:太好了,最近村長遇到點麻煩,你去幫幫他吧。", "主角:好啊,吃飽了也該練練功夫了。", "主角:村長,我叫袁熙,我聽說您遇上了麻煩,我看看您怎么了?", "村長:哎,最近后山出現了很多妖怪,我們的村民都不敢去后山砍柴、采藥了,這可怎么辦啊!", "主角:哦,我去后山看看吧。希望能幫助你們。", "村長:孩子,太謝謝你了。你和邊上的黑衣人說話,他會放你去后山的。", "主角:你好,我去后山幫村長殺妖怪,你讓我過去吧。", "黑衣人:好吧,后山山路崎嶇,你可要小心啊。", "主角:沒問題,呵呵。", "小姑娘:救命啊!救命啊!!!", "主角:小姑娘,你來這荒郊野嶺的地方干嘛,有什么能幫助你的嗎?", "小姑娘:我爸爸是村里的鐵匠,我來這里幫我爸爸找玄鐵,沒想到遇到了一群強盜把我找的玄鐵都搶走了,我們家就靠這點微薄的收入支撐生活了!你能幫幫我嗎?", "主角:好的,沒問題,你看到那些強盜從哪里逃走了嗎?","小姑娘:他們剛從這里的山洞逃走了,你快點去追吧!", "主角:好的,你先回到村里安全的地方吧,我一定幫你找回玄鐵的!", "主角:請問你是西涼召德村的李鐵匠嗎?","鐵匠:是。", "主角:這個給你,你的女兒讓我幫你從強盜那搶回玄鐵,她現在已經回家了,你也快回家吧這里太不安全了!", "鐵匠:太感謝你了,你真是個好人啊!", "主角:呵呵,別這么說這都是我應該做的!", "鐵匠:你回村找那個神秘人吧,他會在洞口等你的!", "神秘人:年輕人,你怎么受了這么重的傷啊,前面有個醫生你可以找她去看看!", "主角:謝謝了!", "主角:我受傷了你這有什么藥能給我治一治嗎?", "醫生:看你臉色這么蒼白一定是失血過多,趕快把這顆藥丸吃了吧!", "主角:謝謝!", "醫生:不客氣,東面武官門口有個村民好像很著急的在等人,不會是等你呢吧!", "主角:那我去看看!", "村民:鐵匠和他的女兒都安全的回家了,但是還有很多村民被鬼魅抓到了小島上,希望你能救救他們!", "主角:怎么才能去那個小島呢?", "村民:你就沿著這條小路走南拐就能看到有個碼頭了,你可以坐船去那個小島上。", "主角:好的,我一定會救出他們的!", "村民:謝謝你了,年輕人!", "主角:你能帶我去這附近的小島上嗎?", "船夫:那里很危險的,據說還著這一個很兇猛的怪物,你一定要去那里嗎?", "主角:我要去那里救人,很多村民都被那個怪物抓走了,我不能看他們就這樣被吃掉!", "船夫:那好吧,小伙子看你這么善良我就破例帶你去吧!",};一一檢測碰撞,通過布爾值區別碰到哪個NPC了游戲中一共十一個NPC,主角通過collidesWith()方法判斷是否與NPC碰撞,如碰撞上第一個NPC則開啟第一個NPC的對話功能。對話順序如下:knpc8,knpc4,knpc6,knpc5,knpc2,knpc11,knpc7,knpc9,Knpc1,knpc3。設置主角的碰撞區域player.spPlayer.defineCollisionRectangle(18,50,28,10);檢測碰撞并通過drawString()方法顯示對話內容if(player.spPlayer.collidesWith(player.npc8,true)){ lm.insert(player.spPlayer,0); if(knpc8){ g.drawImage(duihuakuang,0,240,0); Dialog.DrawString(Dialog.dlg[count],font,230,g,7,246); if(this.getKeyStates()==GameCanvas.FIRE_PRESSED){ count++; if(count>=5){ knpc8=false; knpc4=true; } } }}敵人的人工智能判斷檢測范圍,檢測范圍內敵人向主角移動if(this.getX()>(hero_x-64)&&this.getX()<(hero_x+64) &&this.getY()>(hero_y-64)&&this.getY()<(hero_y+64)){//在檢測范圍內 if(this.getX()<hero_x&&this.getY()<hero_y){//如果在左上角 //向右移 orietation=O_RIGHT; this.move(this.speed,0); this.Enemy_zhen(moveright); } if(this.getX()>hero_x&&this.getY()<hero_y){//如果在右上角 //向下移動 orietation=O_DOWN; this.move(0,this.speed); this.Enemy_zhen(mo

溫馨提示

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

評論

0/150

提交評論