【正文】
我在一星期內(nèi)寫了1500行代碼,經(jīng)過了幾百次的調(diào)試,終于完成了現(xiàn)在的程序。臺灣的王森寫了兩本較好的書,給了我很大的幫助,但對設(shè)計該游戲來說,仍只夠入門。游戲程序最大限度的利用了硬件條件,因此展現(xiàn)出的畫面往往多彩絢麗、效果驚人。 經(jīng)驗和感想 坦克大戰(zhàn)作為畢業(yè)設(shè)計,是本人目前做過的最大的程序。 3. 子彈和敵人經(jīng)常會與畫面的刷新的線程不同步,造成畫面閃爍。對游戲有關(guān)的各運行界面也做了展示。就不將當前關(guān)得到的分數(shù)加入到總分的計算里,否則就調(diào)用totalScore=totalScore+levelScore進行累加。drawList()函數(shù)繪畫出當前的屏幕分數(shù)。score=()將所得的被寫入的數(shù)據(jù)流輸送到score的字節(jié)數(shù)組中。為了能控制一輛坦克在同一時間只能發(fā)射一發(fā)子彈,在子彈生命運行結(jié)束時候,()恢復(fù)坦克繼續(xù)發(fā)炮的能力。當來自玩家時,將首先檢測所有的敵人發(fā)出的子彈,當發(fā)生子彈間的碰撞時,用戶的子彈將被移除,雖然按照道理敵人的子彈同時也應(yīng)被移除,但敵人子彈是運行在另一線程中的,應(yīng)當由它自己來控制為好,用戶的子彈只需要管理好自己的狀態(tài)就可以了。地圖的tiledLayer對象中并不存在序號為20的塊,最大只為19。amp。當擊中了需要作出反映的物體時,就分別采取措施:擊中草時,由于沒有定義相關(guān)函數(shù),就不會有任何反映,會重合在草上正常通過;擊中磚塊時,將產(chǎn)生爆炸,調(diào)用setCell將當前塊置為空,并產(chǎn)生爆炸效果。在go()函數(shù)中首先檢測是否正處于碰撞狀態(tài)中,如果不是,就需要取消Beginner的狀態(tài),因為不需要Beginner這樣的特殊身份,讓別的坦克不檢測了。在運行的線程中,需在每前進的一步驟中循環(huán)做下列事件:如果坦克已死亡,立刻退出。 collidesWithOtherTank()將檢測是否與其他坦克(包括敵人和玩家)。此時返回的值的范圍就確定在1~4之間,正好對應(yīng)四個方向。 首先,EnemySprite繼承了Runable接口。在collidesEnemy()函數(shù)中,將有一個for循環(huán)按照敵人數(shù)組的序號依次檢測6次。die()、resetPosition()、getLife()都是很簡短的函數(shù),但卻提供必不可少的功能。因為子彈是屬于坦克的,它的屬性需要跟當前的坦克保持一致。它返回一個boolean值,提供給go()函數(shù),做進一步的判斷。游戲的最終運行狀態(tài)如圖47所示。在出現(xiàn)正式畫面前設(shè)置了一個loading state*字樣的單獨屏幕,調(diào)用了loadinglevel()函數(shù),并停滯了1500毫秒,提示用戶做好準備。以在兩秒鐘內(nèi)反復(fù)閃現(xiàn)兩次為一個生命周期。在構(gòu)造函數(shù)自己調(diào)用了線程的start后,程序?qū)㈤_始循環(huán)運行,直至跳出while的循環(huán)。繪出地圖后,可用LayerManager的append()將地圖放置在第一層。 構(gòu)造函數(shù)中,需初始化地圖。其主邏輯如圖44所示。鍵盤事件中,可用getCommandType()返回的Command類型來確定選擇的是什么按鈕。當將FOREVER作為Alert的參數(shù)時,將永久顯示,直到用戶點擊相應(yīng)按鈕手動結(jié)束。該類中擁有可以管理程序的創(chuàng)建、開始、暫停(手機中很可能有正在運行程序卻突然來電的情況,這時應(yīng)進入暫停狀態(tài)。其中,允許強制垃圾回收(Garbage Collection)。 混淆器的作用不僅僅是保護代碼,它也有精簡編譯后程序大小的作用。將PNG格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了chunks,將比合并前的總大小減少許多。打印到屏幕上時,記錄ID號即為排名,因此將顯示三項數(shù)據(jù)。利用輸入輸出流可以寫入及讀取不同數(shù)據(jù)類型的數(shù)據(jù),做法是在寫入數(shù)據(jù)時先將一個DataOutputStream數(shù)據(jù)流對象串接到一個ByteArrayOutStream數(shù)據(jù)流對象,然后再依字段的數(shù)據(jù)類型用writeInt()、writeBoolean()等方法寫入,最后把ByteArrayOutputStream內(nèi)的元素數(shù)據(jù)寫入record中。第一項記錄的ID是1,其后的每個記錄ID遞增。同一個包內(nèi)的MIDlets可以直接互相訪問它們的記錄集,不同包內(nèi)也可產(chǎn)生共享,但這需要有包的授權(quán)屬性決定。對磚墻將有能力將其擊毀,使之在畫面上消失;對水泥鋼筋將不能發(fā)生作用,子彈也不能通過;對于河流,坦克不可以通過,但子彈可以;對于草叢,子彈和坦克都可以通過。子彈使用的是象素級的碰撞檢測,因為子彈的圖片形狀不規(guī)則,如果使用矩形碰撞檢測,將有可能在子彈尚未接觸到物體時就已返回碰撞的真值。本程序設(shè)置為:當碰撞到障礙物或邊界時立即轉(zhuǎn)向,但碰到玩家坦克時需要有一個等待的時間,這個時間由碰撞前隨機取得的在某方向上的持續(xù)行走步數(shù)決定,當發(fā)生坦克間碰撞時,此隨機數(shù)將在下一次循環(huán)前減少為原來的2/3,這樣就實現(xiàn)了加快轉(zhuǎn)向的時間,避免死鎖在一個方向上靜止的停留過長的時間。為了提前預(yù)知碰撞,可以將所有坦克的碰撞范圍設(shè)定為一個比坦克圖片稍大一些的矩形,此矩形僅在坦克前方比坦克圖形多出一個象素。將以位的形式返回鍵盤上所有鍵的按與釋放的狀態(tài),當bit為1時,鍵就是被按下的狀態(tài),為0時則為釋放狀態(tài)。不過在某些MIDP的實現(xiàn)上已經(jīng)加上了雙重緩沖的支持,因此在處理前應(yīng)先利用Canvas類的isDoubleBuffer()方法來判斷。地圖背景分為20*22個圖象格,每個格使用一個字節(jié)表示其中的障礙物,圖象文件存儲在外部文件中,以16進制的整數(shù)串表示,因此每個地圖的大小為固定的440字節(jié)。子彈的參考點設(shè)置在子彈底部的中心,因為子彈一出炮筒的時候緊挨著坦克的象素就是其底部中心。Sprite也可以從整合的圖象中讀圖,讀圖時將把大圖分解為若干等寬等高的小圖。層號總是連續(xù)的,即使有中間的層被移除,其他層的序號會作相應(yīng)的調(diào)整以保持整體的完整性。在Game包中的TiledLayer和Sprite類都整合了這樣的功能。程序只能在paint()函數(shù)中使用Graphics繪制,GameCanvas可調(diào)用getGraphics()函數(shù)直接繪制在緩沖區(qū)上,可以在任何時間請求傳輸?shù)角芭_。 提供低級繪制的Canvas類為了能有程序開發(fā)人員控制接口的外觀和行為,需要使用大量的初級用戶接口類,尤其在游戲程序中,幾乎完全依賴的就是Canvas抽象類進行繪圖。閃過后載入StartChoice類,為用戶提供可選擇的選項。用戶坦克自誕生之時起將擁有一發(fā)子彈,子彈雖然開在單獨的線程中,但運行結(jié)束后(比如撞到相關(guān)物體或敵方坦克時)并不結(jié)束子彈對象,只是將其線程終止。MIDlet及相關(guān)的支持類組成了MIDP應(yīng)用程序的實際內(nèi)容。如何采用合理的記分標準,需要進行適當?shù)脑O(shè)計。5. 雙方的坦克在前進時也需要考慮到是否碰撞到相關(guān)物體或?qū)Ψ教箍?,以免重疊運行,造成許多物理上不可能的情況,缺乏真實感。3. 己方坦克的運行可以通過鍵盤響應(yīng)事件控制,但敵方則因為是自動運行,就需要有一定其一定的智能性;同時,出現(xiàn)在屏幕上的敵方可能會有較多的數(shù)量,這需要為每個敵方開辟一個線程以便能讓其獨立運行。它所使用的傳輸媒體可以是紅外線、網(wǎng)絡(luò)、以及其他可用來傳輸?shù)拿襟w。Jbuilder是一種處于市場領(lǐng)先地位的跨平臺環(huán)境,主要用于構(gòu)建具有行業(yè)實力的企業(yè)Java應(yīng)用程序。2. 安全性Java的編程類似C++,但舍棄了C++的指針對存儲器地址的直接操作,程序運行時,內(nèi)存由操作系統(tǒng)分配,這樣可以避免病毒通過指針入侵系統(tǒng)。6502 芯片cpu 主頻為8 bit,12 MHz,內(nèi)存8k,畫面 52色,同屏最多顯示其中的13色,聲音2個矩波,1個三角波,1個雜音,1個PCM音頻(見圖12)。好的手機游戲應(yīng)該利用那些更新的設(shè)備特征和網(wǎng)絡(luò)基礎(chǔ)設(shè)備的優(yōu)點?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最好方法??芍袛嘈? 多任務(wù)處理是手機生活方式的基本特征。盡管每個手機游戲都不貴,但是巨大的使用量(如:每人每星期一個新游戲)將使得這個市場商機無限??v觀IT產(chǎn)業(yè)的歷史,就像軍事的發(fā)展時常推動計算機的演化一樣,計算機游戲已經(jīng)成為技術(shù)創(chuàng)新背后的動力之一。也就是說, J2ME 先把所有的嵌入式裝置利用Configuration 的概念區(qū)隔成兩種抽象的型態(tài)。 游戲業(yè)務(wù)及J2ME概況圖11 Java 平臺的結(jié)構(gòu)雖然 Java 已經(jīng)被用到許多企業(yè)級軟體上,可是其實骨子里面還是非常適合用在嵌入式系統(tǒng)之中。本文可算是對新技術(shù)的一些嘗試,代表對無線平臺應(yīng)用程序推廣的一些努力。它最初的目標是 16位或 32位處理器,16 MHz時鐘頻率,512K或更少內(nèi)存的設(shè)備。Java語言面向?qū)ο蟮膬?yōu)勢也使得開發(fā)游戲變得非常容易。[關(guān)鍵字]:J2ME,手機游戲,Java,坦克大戰(zhàn)ABSTRACTJava has an advantage of running in different platforms that shows its power in developing for the mobile device. The advantage of objectoriented of Java makes development of games easily.When cell phone is getting ever more popular nowadays, with the implementation of Java technology on mobile equipment, increment of capital on munication service exhibits its force on people’s everyday life, providing them ever fast information just in hand. This dissertation focuses on implementation of J2ME technology and has developed a mercial game suite run on mobile phones—Tank. This application inherits many characters of the old fashioned game Battle City which developed by Nintendo in 1980s. It transports the classical product to mobile phones, offering corresponding software for such more popular hardware platform.This dissertation introduces the characteristic of Nintendo FC machine and its software, J2ME and its relative technology as well as this program’s structure and analysis of implementation in details. [Keywords]: J2ME, mobile game, Java, tank, Battle City.引 言自從Java問世以來,Sun公司已經(jīng)成功的將Java平臺技術(shù)推廣到臺式計算機與服務(wù)器。依托這樣的市場,一旦無線Java應(yīng)用大規(guī)模開展起來,將會創(chuàng)造出比短信業(yè)務(wù)更為驚人的利潤。而Java技術(shù)在無線應(yīng)用方面的優(yōu)勢非常明顯:1. 應(yīng)用程序可按需下載,而不是購買由硬件商提供的套件,可升級空間大。J2ME 在設(shè)計其規(guī)格的時候,遵循著“對各種不同的裝置而造出一個單一的開發(fā)系統(tǒng)是沒有意義的事”這個基本原則。幸運的是,Java被設(shè)計成一種安全的語言。手機已經(jīng)與現(xiàn)代生活方式緊緊地結(jié)合在一起。消費者不會花幾個小時去研究一個3元的手動操作的游戲?;谟嗛啠菏謾C游戲的盈利成功取決于他們巨大的使用量。 這款主機的性能比當時的多數(shù)主機都要強大,而價格上卻便宜得多。第二章 開發(fā)環(huán)境及相關(guān)技術(shù)的介紹 開發(fā)環(huán)境操作系統(tǒng):Microsoft Windows XP程序語言:Java 2開發(fā)包: Java(TM) 2 Standard Edition (build ) Sun Micro. J2ME Wireless Tool Kit IDE: Borland Jbuilder 9 Java語言的特點1. 平臺無關(guān)性Java引進虛擬機原理,并運行于虛擬機,實現(xiàn)不同平臺之間的Java接口。Java取消了C語言的結(jié)構(gòu)、指針、define語句、多重繼承、goto語句、操作符、重載等不易被掌握的特性,提供垃圾收集器自動回收不用的內(nèi)存空間。它通用性高,開發(fā)出的應(yīng)用程序可保證能運行在大部分設(shè)備上,而不像專用廠商具有一定的不兼容性。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應(yīng),若有絲毫的差別都將很容易導(dǎo)致程序在運行不久后可能出現(xiàn)嚴重錯誤,甚至死循環(huán)。這需要對所有的對象有較好的控制。否則,不僅難于控制和處理過多的元素,也會因過多的大型圖片而不能限制程序的大小,失去手機上程序的原則和Java的優(yōu)勢。除開發(fā)過程中對結(jié)構(gòu)上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(Obfuscator)進行程序打包后的優(yōu)化。在主程序運行的線程中,畫面刷新將以一定的頻率采用雙緩沖技術(shù)對屏幕重繪,實時反映整個游戲的進行狀態(tài)。主程序流程如圖32所示:Logo 畫面選項畫面主程序屏幕繪圖本關(guān)記分統(tǒng)計顯示GameOver顯示歷史記分表About開始敵方需要出坦克時,生成坦克初始化參數(shù)死亡時符合結(jié)束條件時圖32 本程序的主流程圖程序為需要完成獨立功能的需顯示的模塊設(shè)置了單獨的類。在每關(guān)的結(jié)束或死亡后都將載入ScoreScreen類,統(tǒng)計當前的分數(shù)。本程序中,操縱用戶坦克運行的按鍵都定義為游戲控制鍵,這樣便能適應(yīng)所有的