![Java游戲開發(fā)項目及游戲源碼_第1頁](http://file4.renrendoc.com/view/dd6e174dde2ad7e7b6b3c480708654d0/dd6e174dde2ad7e7b6b3c480708654d01.gif)
![Java游戲開發(fā)項目及游戲源碼_第2頁](http://file4.renrendoc.com/view/dd6e174dde2ad7e7b6b3c480708654d0/dd6e174dde2ad7e7b6b3c480708654d02.gif)
![Java游戲開發(fā)項目及游戲源碼_第3頁](http://file4.renrendoc.com/view/dd6e174dde2ad7e7b6b3c480708654d0/dd6e174dde2ad7e7b6b3c480708654d03.gif)
![Java游戲開發(fā)項目及游戲源碼_第4頁](http://file4.renrendoc.com/view/dd6e174dde2ad7e7b6b3c480708654d0/dd6e174dde2ad7e7b6b3c480708654d04.gif)
![Java游戲開發(fā)項目及游戲源碼_第5頁](http://file4.renrendoc.com/view/dd6e174dde2ad7e7b6b3c480708654d0/dd6e174dde2ad7e7b6b3c480708654d05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
-.z.Java程序設(shè)計工程1.工程背景為了提高學(xué)生動手能力,增加學(xué)生實踐的時機,*軟件公司實習(xí)單位要求學(xué)生5-6人組成開發(fā)團隊進展Java程序工程開發(fā),參考自己團隊的實力與客戶的要求,使用Java語言開發(fā)*一工程,此工程可以是應(yīng)用程序,也可以是游戲開發(fā)等,工程名稱自擬。2.硬件資源和軟件資源(1)每組配備聯(lián)網(wǎng)PC機5-6臺,智能手機一部〔帶有手機數(shù)據(jù)線〕HP打印機一臺。(2)eclipse-SDK--win32軟件開發(fā)程序(含有eclipseme插件)、SUNWTK無線開發(fā)包或Symbian_3_SDK_v0_9等手機開發(fā)包。3.實驗室功能需求(1)實現(xiàn)學(xué)生機和教師機器(效勞器)進展通信,相互共享資源。(2)教師機器(效勞器)上安裝一臺打印機,實現(xiàn)學(xué)生機可以共享打印。(3)實現(xiàn)教師機器(效勞器)連接和訪問Internet。(4)實現(xiàn)每一臺學(xué)生機器訪問Internet。(5)要求為每一工程組學(xué)生機和教師機器分配一個標(biāo)識,即學(xué)生機器的機器名為ST1~ST10,教師機器名為Server。4.工程實施要求(1)要求各工程小組拿出詳細的**Java程序設(shè)計工程報告書〔具體工程規(guī)劃書格式參考附表一〕,關(guān)鍵步驟要有相應(yīng)的截圖。(2)要求工程組長向各小組講解與演示自己小組的工程成果,組長小組成員要熟練的解釋與分析自己負責(zé)編寫的Java代碼或工程分工成果。(3)最后提交用小組命名的文件夾,其中包括開發(fā)所用的所有資料與工程成果。附表一:雷霆戰(zhàn)機工程報告書一、工程概述本工程為一個Java游戲,是一個基于J2ME平臺的飛機射擊類游戲。二、工程開發(fā)團隊三、所用Java相關(guān)知識點用了java的MIDP2.0的游戲類、GameCanvas類、游戲中的多線程應(yīng)用、游戲引擎框架構(gòu)造等等。四、工程需求分析1.游戲程序是一項精度要求很高的程序系統(tǒng),因為其代碼利用率很高。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應(yīng),假設(shè)有絲毫的差異都將很容易導(dǎo)致程序在運行不久后可能出現(xiàn)嚴(yán)重錯誤,甚至死循環(huán)。因此,其邏輯設(shè)計應(yīng)當(dāng)相當(dāng)嚴(yán)謹(jǐn),需將所有可能發(fā)生的事件及意外情況考慮在設(shè)計中。2.游戲中為了美觀,適用性強,可能需要采用外部文件引入的圖片貼圖,有關(guān)貼圖,在MIDP2.0中提供了用于增強游戲功能的game包,使得解決靜態(tài)或動態(tài)、畫面背景、屏幕刷新的雙緩沖等都有較好的解決方案。3.玩家飛機的運行可以通過鍵盤響應(yīng)事件控制,但敵方則因為是自動運行,就需要有一定的智能性;敵人飛機的運行算法也要進展相關(guān)的設(shè)置,已免游戲過于簡單。4.對于雙方發(fā)射的子彈應(yīng)該賦予不同的速度,同時,程序應(yīng)該設(shè)定敵人飛機的子彈不與敵人的飛機進展碰撞檢測,已增加游戲的可玩性。5.雙方的飛機在前進時也需要考慮到是否碰撞到對方飛機,以免重疊運行,造成許多物理上不可能的情況,缺乏真實感。每一次刷新頁面、每前進一步都需要進展相關(guān)的碰撞檢測。6.為了增加界面的美觀,在程序中添加了白云。由于手機屏幕大小有限,所以白云的數(shù)量和出現(xiàn)的位置要經(jīng)過相關(guān)的設(shè)置,才能實現(xiàn)白云不規(guī)則出現(xiàn)的效果。7.游戲的地圖不可能通過繪圖來解決。否則,不僅難于控制和處理過多的元素,也會因過多的大型圖片而不能限制程序的大小,失去手機上程序的原則和Java的優(yōu)勢。8.Java是基于虛擬機的半解釋型編譯系統(tǒng),其執(zhí)行效率較C++等完全編譯后的程序會低很多,程序如果不進展精簡和優(yōu)化,將可能導(dǎo)致運行的不流暢。除開發(fā)過程中對構(gòu)造上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(Obfuscator)進展程序打包后的優(yōu)化。9.游戲的完畢、開場、動態(tài)信息畫面作為構(gòu)成一個程序都是必不可少的重要局部。良好的用戶界面更是吸引用戶的硬指標(biāo),相關(guān)的美術(shù)構(gòu)圖和人性化設(shè)置也需要有一定的考慮。五、類設(shè)計〔包含構(gòu)造圖〕5.1游戲進入前的選擇每個MIDlet程序都必須有一個主類,該類必須繼承自MIDlet。它控制著整個程序的運行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)立、開場、暫停〔手機中很可能有正在運行程序卻突然來電的情況,這時應(yīng)進入暫停狀態(tài)。〕、完畢的函數(shù)。本程序主類為lzhhdm,并實現(xiàn)接口mandLIstener。圖5-1游戲背景介紹圖5-1游戲背景介紹首先顯示的是游戲的背景介紹〔圖5-1〕,為此,在類lzhhdm定義Form類對象a,在startApp()函數(shù)中判斷isSplash是否為真,如果為真的話,將創(chuàng)立Form類的實例a,并且調(diào)用append()方法在表單上放置StringItem類的實例以顯示游戲背景信息。使用語句ok=newmand("ok",mand.OK,1);實例化mand類對象ok。調(diào)用addmand()命令建立ok命令與Form之間的關(guān)聯(lián),調(diào)用setmandListener()命令使Form與mandListener建立關(guān)聯(lián)。調(diào)用Displayable的seturrent()函數(shù)顯示背景介紹窗口。當(dāng)玩家點擊ok后將調(diào)用display.setCurrent(menuscreen) 以顯示游戲菜單menuscreen〔圖5-2〕。圖5-2游戲的菜單圖5-2游戲的菜單類menuscreen繼承自Canvas類,并實現(xiàn)接口Runnable和mandListener。在類menuscreen中定義了lowColor和highColor、highBGColor三個整型變量及布爾型變量co。其中l(wèi)owColor賦值為0*000000FF,代表蘭色,higColor賦值為0*00FF0000,代表紅色,highBGColor賦值為0*00CCCCCC,代表蘭灰色,即背景條。當(dāng)玩家按住上或下鍵時,在函數(shù)keyPressed(intcode)中的整型變量menuInde*相應(yīng)的減1或加1,相應(yīng)的,在paint()函數(shù)中會根據(jù)menuInde*繪制選項是否被選中。在函數(shù)run()中,如果co為真,則不停的repaint(),設(shè)置co的意義在于,當(dāng)進入游戲主畫面后,co賦值為false,以終止繪制選項的repaint(),提高游戲速度。當(dāng)移動選項條到*項,并點擊ok時,在mandAction()方法中根據(jù)menuInde*的值判斷選擇了哪個選項,列如中選擇“關(guān)于〞時,將調(diào)用lzhhdm類中的renwuShow()方法以顯示〞關(guān)于〞界面〔圖5-3〕,在renwuShow()方法中,F(xiàn)orm類對象a=null,表示清空Form,并重新調(diào)用用append()方法在表單上放置StringItem類的實例以顯示游戲關(guān)于信息,“幫助“界面的顯示與〞關(guān)于“界面一樣,只不過調(diào)用的是helpShow()方法。圖5-3關(guān)于界面圖5-3關(guān)于界面5.2mybullets類在介紹游戲主類gameScreen類之前,應(yīng)該先簡要說明一下玩家子彈類mybullets類,實際上,mybullets類是應(yīng)該刪除的,其要實現(xiàn)的功能應(yīng)該放在gameScreen類中,但是由于設(shè)計游戲的過程也是一個學(xué)習(xí)的過程,而在當(dāng)時,我并沒有意識到這一點。Mybullets類繼承自Sprite類,以實現(xiàn)玩家子彈的相關(guān)功能。首先,創(chuàng)立子彈狀態(tài)數(shù)組privateint[][]bullets,其中,[i][0]代表子彈的*坐標(biāo),[i][1]代表子彈的Y坐標(biāo),[i][2]代表子彈Y方向速度,[i][3]代表子彈存活狀態(tài)(由于此類是在早期設(shè)計的,而之后子彈存活狀態(tài)使用了子彈射程作為標(biāo)志位,所以其并沒有起到作用)。類中定義的方法setfirstposition()起到定義玩家子彈發(fā)射坐標(biāo)的作用(此方法在設(shè)計時起到的作用是消除每按一次開火玩家子彈位置就重新定位這個BUG,但是,這個BUG完全可以用設(shè)置標(biāo)志位的方法消除)。方法newposition()實現(xiàn)的功能為更新玩家的子彈位置,并且檢測玩家子彈與普通敵人的碰撞及記錄玩家戰(zhàn)果(更新子彈位置的功能可以由使用move()加設(shè)置標(biāo)志位的方法取代;由于設(shè)計這個類的時候并沒有考慮到添加BOSS等,所以在此檢測碰撞,但添加BOOS等功能后,此處的檢測完全可以和飛機對飛機等的碰撞檢測封裝在同一個方法中)。mybullets類在gameScreen中建立了對象數(shù)組huokebullet[9],代表玩家所能發(fā)射的9發(fā)子彈。進入游戲進入游戲y1>-1550pzbzover==0顯示敵人玩家被擊落了嗎?玩家是否還有時機?繼續(xù)游戲是否過關(guān)返回主界面YYNYYN圖5-4gameScreen類主要關(guān)系流程圖N5.3游戲邏輯及gameScreen類是游戲的主類,決定著敵人何時出現(xiàn),控制著敵人出現(xiàn)的方法,判斷敵人及玩家是否被擊中等。它運行在獨立的線程中,以恒定的頻率刷新畫面。本程序設(shè)置為1/20秒。其主邏輯如圖4-4所示。gameScreen類所實現(xiàn)的功能gameScreen類要實現(xiàn)地圖的滾動、敵人飛機的相關(guān)屬性、玩家的相關(guān)屬性等功能。gameScreen類包括了LayerManager,這樣所有靜態(tài)和動態(tài)的圖象都不需要手動刷新,只需要在LayerManager中參加所有的需要控制的精靈,在統(tǒng)一由LayerManager刷新即可,因此,在gameScreen中創(chuàng)立LayerManager的對象lm,并在構(gòu)造函數(shù)中實例子化。其他精靈類的對象如敵人飛機、玩家飛機、玩家飛機的子彈、敵人的子彈、BOSS及BOSS所屬的子彈都需在gameScreen()類中建立相應(yīng)的對象,并在構(gòu)造喊數(shù)中實例化,且由lm.appned()方法添加到LayerManager類對象lm中。地圖的創(chuàng)立由于手機存儲空間的限制,不可能將整地圖完整地存儲在手機中,為了節(jié)約空間,往往提出地圖中一樣的圖片組成一PNG格式的圖片,然后象拼圖一樣拼出地圖來,專業(yè)的游戲設(shè)計者往往自己寫一個地圖編輯器,以使拼圖過程不是則痛苦。創(chuàng)立地圖就需要使用TiledLayer。TiledLayer指的是由一塊一塊類似用瓷磚拼湊起來的畫面。地圖實際即為TiledLayer的一個對象。先利用TiledLayer的構(gòu)造函數(shù)建立TiledLayer,根據(jù)構(gòu)造函數(shù)的參數(shù)可以給定Cell數(shù)組的大小,并且地圖圖片切割成等尺寸的畫面,并調(diào)用setCell()設(shè)置具體的圖象格容。地圖圖5-5地圖圖5-5地圖因此,創(chuàng)立一個返回TtiledLayer的方法createBackGround(),以便在gameScreen()的構(gòu)造函數(shù)中調(diào)用。在方法中,定義整型數(shù)組map1[]以存儲Cell的索引值。并使用tiledLayer.setCell(column,row,map1[i])設(shè)定TtiledLayer的容,以形成地圖。其中i的值由循環(huán)for(inti=0;i<map1.length;i++)取得,column由語句column=i%15取得、行由row=(i-column)/15取得。畫出地圖后,由lm.append()將地圖添加到LayerManager類對象lm中。由于地圖位于Layer的最低層,即離用戶視線最遠的層,所以Tiledlayer最后一個被添加到lm中。地圖的移動根據(jù)游戲的設(shè)定,游戲中地圖是向下移動的,實現(xiàn)此功能的方法如下:首先,在使用createBackGround()函數(shù)創(chuàng)立地圖數(shù)組時,用(row+1)*16-getHeight()語句對整型變量row2賦值,其中row+1代表地圖有多少列,16為地圖片的高度,而減去getHeight()是因為要留出一個屏幕的可視區(qū)域,由于J2ME規(guī)定坐標(biāo)系中下方向為正,所以使用語句y1=-row2將row2的數(shù)值變?yōu)樨摂?shù)。其次,render()函數(shù)中,使用lm.setViewWindow(0,0,getWidth(),getHeight()+10000)設(shè)定可視區(qū)域的圍,(0,0)表示ViewWindow的起始坐標(biāo),(getWidth(),getHeight()+10000)使用lm.paint(g,0,y1)決定ViewWindow從屏幕的哪里畫起。在run()函數(shù)中的while(conti)中,使用語句y1=y1+1使得每次繪圖都使地圖下移1個象素。(參考圖5-6)圖5-6gameScreen類的構(gòu)造函數(shù)gameScreen類的構(gòu)造函數(shù)要將游戲中出現(xiàn)的所有精靈都實例化,實際上,這種方法嚴(yán)重的占用了存,但在當(dāng)時,我并沒有意識到這一點。由于敵人要求不停的出現(xiàn),但是不可能設(shè)置過多的精靈,解決的方法是設(shè)定6個Sprite類對象j0、j1、j2及ullet1、ullet1、ullet2,分別代表三架敵機及其配屬的子彈。所以在gameScreen類的構(gòu)造函數(shù)分配這6個Sprite類的存儲空間,并且使用newSprite(Imageimg,intwidth,intheight)實例化這6個類變量。同關(guān)尾cboss與游戲進展中的大飛機其他的Sprite類對象都需要使用一樣的方法實例化。同樣處于節(jié)約存的考慮,sboss與cboss同用3個Sprite類對象bossbullet0,1,2。在構(gòu)造函數(shù)中,定義boolean型變量conti=true。conti的作用在于控制是否進展游戲畫面的重繪及其他需要在畫面重繪前進展的運算。在構(gòu)造函數(shù)中,將mybullets類里的no和score初始化,現(xiàn)在看來no的初始化沒有必要,但是score的初始化是必須的,因為這個變量存儲著玩家每次游戲的成績,如果不在此進展初始化,則玩家重新開場游戲后score并不歸0。關(guān)于mandAction()方法每個創(chuàng)立mand實例的J2ME的應(yīng)用程序也必須創(chuàng)立實現(xiàn)mandListener接口的實例。每當(dāng)用戶通過mandAction()方法的方式與命令進展交互的時候,就會通過mandLIstener.所以實現(xiàn)mandListener的類必須實現(xiàn)mandAction()方法。在mandAction()方法中,使用getabel()方法獲取命令的標(biāo)簽。如果getLabel()=“暫停〞時,表示玩家點擊了暫停鍵,此時,conti賦值為false,游戲畫面的繪制及游戲相關(guān)的運算暫停,并且,使用removemand(c)語句將“暫停〞移除,使用addmand(newmand("繼續(xù)",mand.OK,2));將〞繼續(xù)“按紐〞添加進來。當(dāng)玩家點擊“繼續(xù)“時,conti賦值為true,并且,一定要調(diào)用start()方法,否則繼續(xù)功能不可用。必須調(diào)用start()方法的原因是:J2ME的線程已stop()方法拿掉,如果想停頓線程的運做,就必須依靠一個旗標(biāo)(flag),在本程序中,flag就是boolean型變量conti。所以一旦此標(biāo)識變量被設(shè)為false,則while(conti)循環(huán)就會完畢,線程也會跟著完畢。當(dāng)用戶按下“繼續(xù)〞的時候,start()將重新產(chǎn)生一個線程繼續(xù)執(zhí)行相關(guān)的運算和畫面繪制。當(dāng)玩家通關(guān)時或者任務(wù)失敗時,將顯示相應(yīng)信息,并使用上面的方法將“暫停〞鍵變?yōu)椤胺祷亘曟I盤,當(dāng)點擊“返回〞鍵時,將返回主菜單項選擇項,調(diào)用類lzhhdm里的方法menuscreensecond(),在此方法中,實例化一個MenuScreen類對象,并且使選項“新游戲〞改變?yōu)楱曋匦麻_場“(圖5-7)。完成此項功能的語句子為MenuScreen.mainmenu[0]=〞重新開場〞。中選擇〞重新開場“時,使用gamescreen=newgameScreen(this)將使所有變量重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家飛機的當(dāng)前位置等。使用gamescreen.start()重新開場程序的循環(huán)。Sprite類對象的碰撞檢測及相關(guān)屬性游戲進展中,即在while(conti){}中,需要進展玩家飛機、子彈與敵機及敵機子彈與玩家飛機的碰撞檢測,即使用函數(shù)collidesWith(Sprite,boolean)。由于設(shè)計的問題,玩家發(fā)射的子彈與普通敵機的碰撞檢測被寫在了mybullets類中,并且只檢測第一發(fā)子彈是否與敵人相碰撞,如果碰撞為真時,則使用setVisible(false)函數(shù)將敵機隱藏,使用setImage()函數(shù)將子彈精靈的三圖片置換為爆炸圖片(圖5-8)。當(dāng)敵人剩余飛機消失后,即所有的敵人都飛出了屏幕后,使用函數(shù)setVisible(true)將敵機重新設(shè)置為可見。在按“開火〞鍵時,使用setImage()函數(shù)將huokebullets重新設(shè)定為子彈圖片(每次擊落敵機后屏幕上的爆炸效果有3團,并且按“開火〞后爆炸圖片就消失了,實際上setVisavle(false)的應(yīng)該是子彈數(shù)組,而對敵人精靈使用setImage(),這樣效果會好一些)。圖5-8游戲界面圖5-7圖5-8游戲界面圖5-7敵機與玩家的碰撞檢測原理同上,都是使用的collidesWith()函數(shù),遺憾的是,我在寫這段代碼的時候,并沒有考慮設(shè)置玩家有4次時機,所以對敵人飛機setVisable(fasle)了,而將玩家的飛機換成了爆炸圖片,之后,添加了玩家4次時機這個功能,由于玩家被擊落后會重新從屏幕下方進入屏幕,所以爆炸的圖片一閃而過,效果不是很好。玩家10次游戲時機的實現(xiàn)方法根據(jù)游戲設(shè)置,玩家在每關(guān)中有共四次時機,當(dāng)玩家飛機被擊中或撞擊爆炸后,程序首先檢測整型變量playerno的值,并根據(jù)playerno的值決定屏幕右上角所畫玩家飛機標(biāo)志的數(shù)量(參考圖4-8),playerno的初始值設(shè)為3,因為碰撞后才減1,所以玩家共有4次時機,當(dāng)playerno<0時,游戲完畢,同時將變量pver賦值為1,render()或renderboss()函數(shù)中,over=1代表在屏幕上GAMEOVER等相關(guān)信息,同時,將整型變量inputno賦植為1,以使手機的方向鍵失效,以消除玩家可以控制爆炸圖像移動這個BUG。同時整型變量pzbz賦植為1,以消除玩家爆炸圖像繼續(xù)與敵人進展碰撞檢測這個BUG。當(dāng)playerno>0時,碰撞后,將變量planert賦值為1,在之后的if(planert==1)判斷語句中,重新設(shè)定玩家飛機的圖片和可視狀態(tài),同時使用setPosition()函數(shù)設(shè)定玩家非的位置在屏幕下方。設(shè)定pzbz=1,即不檢測碰撞,玩家有短暫時間無敵,無敵時間由屏幕右上角進度條表示。設(shè)定inputno=1,即飛入屏幕的過程中手機鍵盤是不可以用的。設(shè)置planert=2,即以上這些設(shè)置只執(zhí)行一便。在if(planert==2)判斷語句中,使用語句move(0,-2)使飛機自己向上運動,使用if(c1.getY()<(planepo-24))判斷飛機是否到達屏幕最下方(planepo是屏幕下邊緣的坐標(biāo)〕,如條件為真,則將inputno設(shè)置為1,表示鍵盤可用,將planert賦值為3,使其不再執(zhí)行以上各步。input()input()函數(shù)的作用是檢測用戶的輸入。首先使用if(inputno==0)判斷用戶的輸入是否被制止,如為真,則用戶輸入不被制止。其次,調(diào)用getKeyStates()查詢按鍵的狀態(tài)。當(dāng)玩家按方向鍵時,玩家飛機就向不同的方向運行,這需要使用c1.move(int*,inty)函數(shù),當(dāng)玩家控制飛機向左或右飛時,需要使c1.setFrame()函數(shù)改變飛機的圖形(參見圖5-7,此時飛機右飛)。同時,還需要判斷飛機是否飛出屏幕,如,當(dāng)飛機右飛時,用if(c1.get*()>(getWidth()-c1.getWidth()))語句判斷(getWith()為屏幕的寬度,c1.getWidth()為玩家飛機c1的寬度),如果條件為真,則使用c1.setPosition((getWidth()-c1.getWidth()),c1.getY())語句將飛機設(shè)置在緊靠屏幕右邊的位置。上、下、左的設(shè)置原理同上。語句if((keystate&LEFT_PRESSED)==0)的作用是消除左、右飛后在上、下飛時飛機的形態(tài)不變的BUG。如果為真,則執(zhí)行語句c1.setFrame(0),表示只要左鍵松開飛機的形態(tài)都是平飛。根據(jù)游戲設(shè)定,玩家一次最多只能發(fā)三組子彈,并且子彈有射程限制(在類mybullets中使用整型變量no表示),而當(dāng)玩家按下“開火“鍵時,即if((keystate&FIRE_PRESSED)!=0)中判斷條件為真時,首先執(zhí)行循環(huán)語句for(inti=0;i<=6;i=i+3),即檢測3組子彈中每組的第一發(fā),即0,3,6。其次,檢測huokebullet[i].no是否等于1,當(dāng)?shù)扔?時使用語句for(intz=i;z<i+3;z++)初始化該組子彈中的3發(fā)子彈,而設(shè)置子彈位置的函數(shù)應(yīng)該在if(huokebullet[i].no==1)語句外設(shè)置,因為當(dāng)初設(shè)計的時候mybullets類里的函數(shù)寫成了一次設(shè)置三組子彈的形式。huokebullet[z].no=huokebullet[z].bulletheight賦予子彈射程。當(dāng)程序循環(huán)運行時no--,當(dāng)一次發(fā)射了三組子彈后,只有*一組子彈消失,即no等于1后才能繼續(xù)發(fā)射子彈?,F(xiàn)在看來,玩家發(fā)射子彈的設(shè)置是完全失敗的,降低了效率。render()和renderboss()在方法render()過程中,除了要重繪飛機、地圖、子彈外還要在上方繪制關(guān)卡信息、戰(zhàn)果、玩家飛機數(shù)、及無敵狀態(tài)時的無敵時間、大飛機生命條等。首先使用lm.setViewWindow()和lm.paint()設(shè)定可視圍ViewWindow和從哪里畫起(見5.3.3)其次,使用g.drawString()繪制屏幕上方的關(guān)卡信息、戰(zhàn)績、玩家剩余生命標(biāo)志。drawString()中使用String.valueOf(huokebullet[0].rscore()+huokebullet[3].rscore()+huokebullet[6].rscore())返回玩家成績score的字符串表示。其中根據(jù)playerno的值繪出玩家的飛機標(biāo)志數(shù)(應(yīng)該有更好方法,但是沒有想到)當(dāng)每次刷新繪圖頁面時,應(yīng)使用GameCanvas的flushGraphics()將屏SHAPE幕后臺的緩沖區(qū)的圖像刷新到前臺來(flushGraphics()應(yīng)該寫在render(){}的最后)。renderboss()方法重繪的是關(guān)尾的精靈cboss、相關(guān)信息等,與render()的區(qū)別在與于函數(shù)lm.paint(g,0,0),起始坐標(biāo)是不可變的,即,關(guān)尾的地圖背景是不可變的。實際上,renderboss()是完全不需要的,只要在render()函數(shù)中設(shè)置相關(guān)標(biāo)志位就可以解決關(guān)尾的繪圖問題。玩家飛機的生命標(biāo)志使用drawImage()就可以繪制在屏幕上了。圖5-9圖5-95.4游戲中的獎勵及相關(guān)飛機的行為根據(jù)游戲設(shè)定,當(dāng)y1=-1000時,會出現(xiàn)如圖4-8所示的飛機(sboss),當(dāng)玩家擊落他后,屏幕會顯示“援軍到達“,并且玩家剩余飛機數(shù)加1。使用if((y1==-1000)&&(sbz==0)){}設(shè)定sboss的初始位置,根據(jù)游戲設(shè)定,sboos從屏幕上方倒飛入屏幕,所以sboss設(shè)定的初始位置(50,planepoup-65),其中planepoup為屏幕上邊緣的標(biāo)志位。最后,要將sbz賦值為1,消除sboos不停設(shè)置初始位置的BUG。當(dāng)sboss飛入屏幕后,將sbz賦值為2,以執(zhí)行下面的if(sbz==2)語句。圖5-10在判斷語句if(sbz==2)里,將根據(jù)玩家的位置自動飛圖5-10行。首先,根據(jù)玩家飛機的位置對sbmove賦值,當(dāng)c1在sboos的上、下、左、右時,其對應(yīng)的值為1、2、3、4在這4個if語句中,要設(shè)置標(biāo)志位(smovebz==0)。設(shè)置這個標(biāo)志位的目的是防止sboos根據(jù)c1的位置不停的改變運行狀態(tài),即防止sboos成為跟蹤飛機。當(dāng)sboos根據(jù)c1的位置改變一次運行方向后,smovebz賦值為1,即不檢測c1的位置。只有sboss運行到屏幕的邊緣時,才將smovebz重新賦值為0,使其可以再次通過c1的位置決定sboos的運行方向。當(dāng)玩家子彈擊中sboss后,使用sboss.setFrame(1),此時飛機變紅,在本次repaint完畢前,使用sboss.setFrame(0)使飛機變?yōu)楸緛眍伾绦蛟O(shè)定每1/20秒畫一次,由此得到飛機被擊中后變色的效果。(參見圖4-10)。sboos會根據(jù)玩家飛機的位置發(fā)射子彈,根據(jù)游戲設(shè)置,當(dāng)玩家在其上方、左方、右方時,sboss一次發(fā)射1發(fā)子彈,而玩家飛機在其下方時,sboss一次發(fā)射3發(fā)子彈。sboss與cboss共用3發(fā)子彈,因為當(dāng)sboss出現(xiàn)時,離關(guān)尾還遠,所以,為了提高效率,采用這種方法。如果sboos被擊落后,使用函數(shù)setVisable(false)將bossbullet0、bossbullet1、bossbullet2設(shè)置為不見,使用sboss.setImage()函數(shù)將sboos的圖片設(shè)置為爆炸圖片。同時,玩家生命標(biāo)志playerno加1,sbz賦值為-1,使得sboos無法發(fā)射子彈,sbpzbz賦值為1,使得玩家的子彈不與sboos進展碰撞檢測。同時在屏幕中使用drawString()繪制“援軍到達〞四個字,隨著屏幕的運動,爆炸圖片逐漸進入屏幕下方,當(dāng)sboos.getY()>palnepo,通過改變標(biāo)志位的值使得drawSteing()不在執(zhí)行,四字消失。如果玩家被擊落后并沒有點“返回“,而此時,背景會一直運動到關(guān)尾,考慮到其與關(guān)尾BOSS共用3發(fā)子彈,如sboos不消失,將會出現(xiàn)子彈亂飛的情況。所以,如果判斷語句if((sboss.getY()==getHeight()))為真,則表示離地圖的終點只有一個屏幕的距離時,sbz賦值為-1、sbpzbz賦值為1(含義上面已經(jīng)說明)。同時調(diào)用sboss.move(0,-3),使sboos快速飛出屏幕,直到判斷語句if(sboss.getY()<-65)為真時,調(diào)用下面的函數(shù)setVisable(false),使得sboos不可見。5.5普通敵人相關(guān)屬性普通敵人是指游戲中不斷出現(xiàn)的蘭色飛機。首先在程序中首先定義了aik、aip兩個Random()類對象,ai和aipp兩個整型變量。程序中使用switch(ai)語句判斷下一次的飛機出現(xiàn)情況,為了到達不重復(fù)出現(xiàn)的效果,使用語句ai=aik.ne*tInt()%4〔同樣應(yīng)該在構(gòu)造函數(shù)中放置此語句和aipp=aip.ne*tInt()%5,以使每次游戲開場的時候敵人飛機的出現(xiàn)順序是不固定的〕,以隨機出現(xiàn)0,1,2,3四個整數(shù)(代表著飛機的四種出現(xiàn)情況〕。情況1:使用aipp=aip.ne*tInt()%5取得隨機數(shù)aipp,根據(jù)下面三條語句設(shè)置飛機的出現(xiàn)位置:j0.setPosition(100-aipp*30,planepoup+24);j1.setPosition(100,planepoup); j2.setPosition(100+aipp*30,planepoup-24);;將getHeight()/8賦給整型變量kkk,每次循環(huán)kkk-1,當(dāng)kkk<=1時飛機轉(zhuǎn)向,當(dāng)aipp>0時,飛機向左下方運行,使用語句setFrame(0)、move(-3,3)達成向左下方運動的效果。當(dāng)aipp<0時,向右下方運動,實現(xiàn)方法同上。情況2:初始位置設(shè)置方法同情況1。當(dāng)kkk〈0時,飛機掉頭向上飛,其中setFrame(3),move(-4,0)。情況3:初始位置設(shè)置方法同情況1。當(dāng)kkk〈0時,飛機只向左轉(zhuǎn)。設(shè)置情況3的原因是在更多的隨機位置出現(xiàn)敵機。情況4:初始位置設(shè)置方法同情況1。但其中的飛機j1具有跟蹤能力,其實現(xiàn)方法如下:使用2個if語句if(j1.get*()<c1.get*())、if(j1.get*()>c1.get*())判斷J1在c1的左或右側(cè),并且實時根據(jù)判斷情況使用setFrame()和move()改變飛機的形態(tài),使用語句if((j1.get*()<c1.get*())&&((j1.get*()+48)>c1.get*())&&(j1.getY()<c1.getY()))判斷c1是否在j1的下方,當(dāng)c1在j1的下方時,發(fā)射子彈ullet1。以上四種情況的最后,都將使用函數(shù)ne*tInt()產(chǎn)生ai,aipp的值。設(shè)置整型數(shù)組[4],對應(yīng)著4種出現(xiàn)情況的標(biāo)志位。如,執(zhí)行情況1,首先執(zhí)行判斷語句if([0]==1),在此語句中,首先使用setVisable(true)函數(shù)將敵人飛機設(shè)置為可見的,并根據(jù)上次運行的qipp的值設(shè)置敵人飛機的初始位置最后,[0]賦值為2。接著執(zhí)行判斷語句if([0]==2),在此語句中,首先使用move()函數(shù)使飛機向下運動,同時kkk減1,當(dāng)kkk<=0時,飛機轉(zhuǎn)向,此時,根據(jù)aipp的正負判斷飛機向哪邊轉(zhuǎn)向。當(dāng)飛機飛出屏幕時,[0]賦值為3。需要注意的一點是,當(dāng)取得ai的數(shù)值時,一定要寫上這條語句:[ai]=1;因為當(dāng)4種情況都出現(xiàn)一便的時候,標(biāo)志位[]里的數(shù)值都將變?yōu)?,如果不將其重新賦值為1,敵人飛機將只能出現(xiàn)4次。其他3種情況也大致如此。普通敵人是否發(fā)射子彈由以下語句if(((j1.get*()<=c1.get*()-18)||((j2.get*()-6)>=c1.get*()))&(z==0)),即c1在j1左側(cè)18象素圍或j2左側(cè)6象素圍時,j0、j1、j2一起發(fā)射子彈,z=1,表示在這組子彈消失前敵人不發(fā)射子彈。如果jpb的值為0,則判斷語句if(jpb==0)里的move()語句將一直執(zhí)行下去。之后,還需要對每發(fā)子彈于玩家飛機進展碰撞檢測,如果碰撞,則將碰撞的這發(fā)子彈設(shè)置為不可見。5.6白云的實現(xiàn)原理為了游戲界面更加美觀,程序中設(shè)定了精靈數(shù)組cloud[i]來表示白云,由于白云應(yīng)該在所有飛機的上方,即cloud[i]應(yīng)該最早被append()到LayerManager中,或者使用insert(cloud[],0)在索引數(shù)值0處插入Layer,本程序采用了第一種方法,即在gameScreen類的構(gòu)造函數(shù)中按游戲設(shè)置的順序使用lm.append()參加到LayerManager之中。程序中設(shè)定白云數(shù)為5。首先設(shè)置白云的初始位置,其語句如下:cloud[0].setPosition(25,planepoup-(65));cloud[1].setPosition(80,planepoup-(140));cloud[2].setPosition(112,planepoup-(90));cloud[3].setPosition(175,planepoup-(200));cloud[4].setPosition(223,planepoup-(70));其原理為:將屏幕的*數(shù)軸和Y數(shù)軸各分成5份,即在*軸的5個圍每個圍出現(xiàn)一朵白云,Y軸的每個圍也只能出現(xiàn)一朵。所以的白云的起始位置在每次游戲開場時是固定的。白云位置設(shè)定后,使用move(0,1)使白云移動,由于白云初始位置設(shè)定在屏幕的不同區(qū)域,故其移動出屏幕的先后順序是不同的,使用if(cloud[].getY()>planepo)判斷白云是否飛出屏幕。如果為真則使用cloud[].setPosition(cloudposition*40,planepoup)設(shè)置白云的位置,其中,cloudposition=aicloud.ne*tInt()%5,aicloud為Random()類對象。乘以40表示其在*軸出現(xiàn)的圍是多少,cloud[0]、cloud[1]、cloud[2]、cloud[3]、cloud[4]乘以的值分別為40,30、55、15、22。以達成白云的隨機出現(xiàn)效果。5.7關(guān)尾BOSS及相關(guān)屬性關(guān)尾處飛機在屏幕上方橫向移動,而背景地圖不動,所以使用renderboss()重繪屏幕,其中,paint(g,0,0)表示屏幕繪制點在坐標(biāo)軸(0,0)處。BOSS生命進度條由以下語句繪制:g.setColor(255,0,0);g.fillRect(2,2,60,5);//生命進度條背靜紅g.setColor(255,255,255);g.fillRect(2,2,bosslife,5);//生命進度條前景白其中bosslife記錄著BOSS的生命值,其初始值為0,當(dāng)玩家每擊中一次BOSS,其值加5,,即化出白色進度條,當(dāng)bosslife==60時,表示過關(guān),除玩家飛機與子彈外的其他Sprite均使用setVisable(false)使其不在顯示,同樣的pzbz要賦予1,以消除玩家飛機還能與敵人碰撞的BUG。如果cboss.get*()<0,則表示其在屏幕左方出界,應(yīng)改為右飛。同理如果cboss.get*()>(getWidth()-cboss.getWidth()),則表示其在屏幕右方出界,應(yīng)改為左飛。在飛機橫向飛行中,使用以下語句判斷飛機是否開火:if(((cboss.get*()<=c1.get*()-10)||(cboss.get*()<=c1.get*()+60))&&(sz==0))當(dāng)每發(fā)一組子彈后,sz=1,則飛機無法開火,知道子彈飛出屏幕,sz才重新設(shè)定為0。而((cboss.get*()<=c1.get*()-10)||(cboss.get*()<=c1.get*()+60)表示當(dāng)玩家飛機處于BOSS的左右各10個象素的圍時。BOSS開火。關(guān)尾參見圖5-10。5.8本章小結(jié)第四章中按照相應(yīng)的步驟描述了所有關(guān)鍵類的具體算法實現(xiàn),引用了相關(guān)函數(shù)進展了具體流程的解釋,并對原理稍復(fù)雜的函數(shù)做了詳細的分析。對游戲有關(guān)的各運行面也做了展示。圖5-10關(guān)尾圖5-10關(guān)尾六、詳細程序代碼與分析Lzhhdm.java負責(zé):mportjava*.microedition.midlet.MIDlet;importjava*.microedition.midlet.MIDletStateChangeE*ception;/**主程序*/importjava*.microedition.lcdui.*;publicclasslzhhdme*tendsMIDletimplementsmandListener{publicDisplaydisplay;privateImagesplashLogo;privatebooleanisSplash=true;publicForma;privateAlertalert;intlength;privateMenuScreenmenuscreen;privategameScreengamescreen;privatemandok,back;privatebyte[]byteInputData;publiclzhhdm() { }protectedvoidstartApp()throwsMIDletStateChangeE*ception{display=Display.getDisplay(this);menuscreen=newMenuScreen(this);if(isSplash) {System.gc();a=null;a=newForm("黑夜行動");ok=newmand("ok",mand.OK,1);a.append(newStringItem(null,"2037年12月12日,一群不明飛行物出現(xiàn)在松田上空,松田空戰(zhàn)部隊奮起還擊,接下來就是進展一場驚心動魄的大戰(zhàn)。。。。。。"));a.addmand(ok);a.setmandListener(this);display.setCurrent(a); } }protectedvoidmenuscreenShow() {display.setCurrent(menuscreen); }protectedvoidmenuscreensecond(){menuscreen=newMenuScreen(this);MenuScreen.mainmenu[0]="重新開場";//玩完一遍或犧牲了后在玩一遍菜單第一項改為重新開場display.setCurrent(menuscreen); }protectedvoidpauseApp(){}protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeE*ception{ }protectedvoidhelShow() {System.gc();a=null;a=newForm("黑夜行動");back=newmand("返回",mand.BACK,1);a.append(newStringItem(null,"操作方式:上2下8左4右6開火5"));a.append(newStringItem(null,"彈藥數(shù):一次最多打三組"));a.addmand(ok);a.setmandListener(this);display.setCurrent(a); }protectedvoidrenwuShow() {System.gc();a=null; a=newForm("黑夜行動");back=newmand("返回",mand.BACK,1);a.append(newStringItem(null,"游戲名稱:雷霆戰(zhàn)績之黑夜行動"));a.append(newStringItem(null,"版本號:1.00"));a.append(newStringItem(null,"制09網(wǎng)絡(luò)1第六組"));a.addmand(ok);a.setmandListener(this);display.setCurrent(a); }protectedvoidgameShow() {try{ System.gc();gamescreen=null;gamescreen=newgameScreen(this);gamescreen.start();display.setCurrent(gamescreen);gamescreen.conti=true; }catch(E*ceptione*p) { System.out.println("dfg"); } }publicvoidmandAction(mandarg0,Displayablearg1){a=null; System.gc();this.menuscreenShow(); } }MenuScreen.java負責(zé):importjava*.microedition.lcdui.*;//MenuScreen類繼承CanvasimplementsRunnable,mandListener類publicclassMenuScreene*tendsCanvasimplementsRunnable,mandListener{Fontlowfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_MEDIUM);Fonthighfont=Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_BOLD,Font.SIZE_MEDIUM);intlowColor=0*000000FF;//定義變量的顏色為黑色inthighColor=0*00FF0000;//定義變量的顏色為黑色inthighBGColor=0*00CCCCCC;//定義變量的顏色為黑色intwidth;booleanco;intheight;intstartHeight;//定義開場游戲時飛機的高度intspacing=highfont.getHeight()/2;publicstaticString[]mainmenu={"新游戲","幫助","關(guān)于"};intmenuInde*; ThreadmenuThread;privatemandok=newmand("ok",mand.OK,1);privatelzhhdmmidlet;//構(gòu)造方法publicMenuScreen(lzhhdmmidlet) { this.midlet=midlet;width=getWidth();height=getHeight();startHeight=(highfont.getHeight()*mainmenu.length)+((mainmenu.length-1)*spacing);startHeight=(height-startHeight)/2;menuInde*=0; addmand(ok);setmandListener(this); menuThread=newThread(this);menuThread.start();co=true; }publicvoidrun() {while(co) {repaint(); } }//覆蓋超類的抽象方法paintpublicvoidpaint(Graphicsg) { g.setColor(0*00FFFFFF);//設(shè)置畫筆的顏色為黑色 g.fillRect(0,0,width,height);//繪制填充的圖形,將屏幕底色填充成白色for(inti=0;i<mainmenu.length;i++) {if(i==menuInde*) { g.setColor(highBGColor); g.fillRect(0,startHeight+(i*highfont.getHeight())+spacing,width,highfont.getHeight()); g.setFont(highfont); g.setColor(highColor);//繪制畫筆的顏色為黑色 g.drawString(mainmenu[i],(width-highfont.stringWidth(mainmenu[i]))/2,startHeight+(i*highfont.getHeight())+spacing,20); }else { g.setFont(lowfont); g.setColor(lowColor); g.drawString(mainmenu[i],(width-lowfont.stringWidth(mainmenu[i]))/2,startHeight+(i*highfont.getHeight())+spacing,20); } } }//按鍵事件處理publicvoidkeyPressed(intcode){//這是返回到上一個界面if(getGameAction(code)==Canvas.UP&&menuInde*-1>=0) {menuInde*--; }//顯示下一個界面elseif(getGameAction(code)==Canvas.DOWN&&menuInde*+1<mainmenu.length) {menuInde*++; } }publicvoidmandAction(mandc,Displayabled) {if(c==ok) {switch(menuInde*) {case0:co=false;midlet.gameShow();break;case1:midlet.helShow();break;case2:midlet.renwuShow();break; } } }}Mybullets.java//玩家子彈類//子彈因為飛機的不同而不同importjava*.microedition.lcdui.*;importjava*.microedition.lcdui.game.*;publicclassmybulletse*tendsSprite{publicintscore=0;//戰(zhàn)果privateint[][]bullets;//子彈數(shù)組//[i][0]子彈*坐標(biāo)//[i][1]子彈Y坐標(biāo)//[i][2]子彈Y方向速度//[i][3]子彈存活狀態(tài)privateintbulletstotal;//數(shù)組的長度,即一次可以打出多少炮彈,視飛機型號不同而不同publicintwidth,bulletheight;//屏幕的高和寬publicintno=0;publicmybullets(Imageimg,intpicwidth,intpicheight,intbulletstotal,intwidth,intheight) {super(img,picwidth,picheight);this.bulletstotal=bulletstotal;bullets=newint[bulletstotal][4];this.width=width;this.bulletheight=height/7;//初始子彈射程 }publicvoidinitBullets(inti)//初始化子彈狀態(tài)數(shù)組{bullets[i][3]=1;bullets[i][2]=0;}publicvoidupdata(inti)//根據(jù)速度更新子彈下一楨的位置,出界消失{bullets[i][1]+=bullets[i][2];}publicvoidsetfirstposition(int*,inty,intnof,Spritesprite[],Imageimg)//第一科子彈的起始位置{ sprite[nof].setVisible(true);sprite[nof+1].setVisible(true);sprite[nof+2].setVisible(true);//nof第F顆子彈,NOT第NOF+2顆子bullets[nof][0]=*+10;//第一子彈*位置bullets[nof][1]=y-24;//第一子彈〔最上面的〕Y位置,24是飛機左上的點的坐標(biāo),所以應(yīng)減多點,和后面子彈拉開距離sprite[nof].setImage(img,6,6);bullets[nof+1][1]=bullets[nof][1]+10;//第N+1子彈Y位置bullets[nof+1][0]=*+10;//第N+1子彈*位置sprite[nof+1].setImage(img,6,6);bullets[nof+2][1]=bullets[nof+1][1]+10;//第N+2子彈Y位置bullets[nof+2][0]=*+10;//第N+2子彈*位置sprite[nof+2].setImage(img,6,6);}publicvoidnewposition(Spritesprite[],inti,intv,Spritejp0,Spritejp1,Spritejp2,Spriteboss,Imageimg){ bullets[i][2]-=5;//因為子彈是向上走的,所以是減 sprite[i].setPosition(bullets[i][0],bullets[i][1]+bullets[i][2]); sprite[i+1].setPosition(bullets[i][0],bullets[i+1][1]+bullets[i][2]); sprite[i+2].setPosition(bullets[i][0],bullets[i+2][1]+bullets[i][2]);if(sprite[i].collidesWith(jp0,true))//玩家子彈與敵人碰撞檢測{ sprite[i].setImage(img,32,32); sprite[i+1].setImage(img,32,32); sprite[i+2].setImage(img,32,32); sprite[i].setFrame(1); sprite[i+1].setFrame(1); sprite[i+2].setFrame(2);bullets[i][3]=0;bullets[i+1][3]=0;bullets[i+2][3]=0; jp0.setVisible(false);no=1; score=score+1; }if(sprite[i].collidesWith(jp1,true)){ sprite[i].setImage(img,32,32); sprite[i+1].setImage(img,32,32); sprite[i+2].setImage(img,32,32); sprite[i].setFrame(1); sprite[i+1].setFrame(1); sprite[i+2].setFrame(2);bullets[i][3]=0;bullets[i+1][3]=0;bullets[i+2][3]=0; jp1.setVisible(false);no=1;score=score+1;}if(sprite[i].collidesWith(jp2,true)){ sprite[i].setImage(img,32,32); sprite[i+1].setImage(img,32,32); sprite[i+2].setImage(img,32,32); sprite[i].setFrame(1); sprite[i+1].setFrame(1); sprite[i+2].setFrame(2);bullets[i][3]=0;bullets[i+1][3]=0;bullets[i+2][3]=0; jp2.setVisible(false);no=1;score=score+1; }}publicbooleanisAlive(inti){if(bullets[i][3]==1)returntrue;elsereturnfalse;}publicvoidsetAlive(inti){for(intz=i;z<i+3;z++) {bullets[i][3]=0; }}publicintrscore(){returnscore;}publicvoidclean(inti,Spritesprite[]){for(intz=i;z<i+3;z++) { sprite[z].setVisible(false);no=1; } }}負責(zé):gameScreen.java//游戲窗口//在這個類里檢測碰撞importjava*.microedition.lcdui.*;importjava*.microedition.lcdui.game.*;importjava.util.*;publicclassgameScreene*tendsGameCanvasimplementsRunnable,mandListener{privateFormal;publicLayerManagerlm,lm1;TiledLayerb1;intheight=getHeight();intbosscolor=0;intsbosscolor=0;intsbz=0;//小BOSS相關(guān)標(biāo)志位intsbmove=0;//小BOSS移動標(biāo)志位置0不動1上2下3左4右intsfire=0;//SBOOS開火intsmovebz=0;//SBOSS移動標(biāo)志intsbpzbz=0;//SBOOS與玩家子彈碰撞標(biāo)志intslife=0;//sboss生命intsbo=0;//sboss和飛機碰撞后玩家飛機自動出現(xiàn)的標(biāo)志位intdrawslife=0;//畫SBOSS生命標(biāo)志位intlr=0;intdrawadd=0;//增加一個飛機畫個標(biāo)志intpzbz=0;//碰狀標(biāo)記,解決中途被掛掉后的碰撞BUGintpzbzover=0;//解決過關(guān)后的敵機器仍然出現(xiàn)問題 intplaylife=-1;//玩家延續(xù)生命標(biāo)志位intbosslife=0;//bosslifeintinputno=0;//鍵盤輸入標(biāo)志位intposition=0;intj1b=0;//CASE3語句里J1具有跟蹤能力的子彈intsz=-1;//boss子彈標(biāo)志intsbsz0=-1;//sboss左子彈標(biāo)志intsbsz1=-1;//sboss右子彈intsbsz2=-1;//SBOSS上子intsbsz3=-1;//SBOSS下子彈intplanepo;//飛機下方參照坐標(biāo)intplanepoup;//飛機上方參照坐標(biāo)intkkk;intgz=0;//上跟蹤標(biāo)志位置intgzks=0;//跟蹤開場標(biāo)志位intjiangli=0;//獎勵標(biāo)志位intjplaneno;intcloundno=0;intright=0;//BOSS移動標(biāo)志位,初始化向右移動intleft=1;intboss=0;intover=0;intai=0;intplanert=-1;//表示是否三次時機都沒了intsupermen=0;//玩家掛后短暫無敵intovercmd=0;intbossover=0;intjpb=-12;//敵人子彈是否運行標(biāo)志位intaipp=0;intz=0;intcloudposition;Randomaik=newRandom();Randomaip=newRandom();Randomaicloud=newRandom();int[]=newint[5];//敵人飛機,白云出現(xiàn)標(biāo)志intplayerno=10;//玩家剩余飛機標(biāo)志,3,2,1三次,0就是掛了privatemybullets[]huokebullet=newmybullets[9];privateSpriteullet0,ullet1,ullet2,bossbullet0,bossbullet1,bossbullet2;privateSpritecloud[]=newSprite[5];//白云彩privateMenuScreenms;privateSpritec1,sboss,cboss,j0,j1,j2,boss1;//2D時為玩家飛機privatelzhhdmmidlet;ints1=0;//無敵時間1ints2=65;//無敵時間2ints3=0;//無敵時間3introw2;introw;intplanecolor=0;//自己的飛機無敵的時候邊紅intplanecoco=0;//變紅控制publicintby1;publicinty1;publicgameScreen(lzhhdmmidlet) {super(true); System.gc();this.midlet=midlet;addmand(newmand("暫停",mand.BACK,1));setmandListener(this);lm=newLayerManager();c1=newSprite(img("/pic/MyPlaneFrames.png"),24,24);//,getWidth(),getHeight()+1000);cboss=newSprite(img("/pic/boss.png"),65,50);//長*寬ullet0=newSprite(img("/pic/bullet.png"),6,6);ullet1=newSprite(img("/pic/bullet.png"),6,6);ullet2=newSprite(img("/pic/bullet.png"),6,6);bossbullet0=newSprite(img("/pic/bullet.png"),6,6);bossbullet1=newSprite(img("/pic/bullet.png"),6,6);bossbullet2=newSprite(img("/pic/bullet.png"),6,6);sboss=newSprite(img("/pic/smallboss.png"),65,50);b1=createBackGround();//創(chuàng)立背景c1.setPosition(getWidth()/2,row2+getHeight()-25);//精靈的起始位置row2+getHeight()-25=1655//精靈是精靈的坐標(biāo),而下面的Y1是畫屏幕的位置//System.out.println("ffffffffffff");planepoup=row2;//屏幕上方邊界planepo=row2+getHeight();//屏幕下方邊界j0=newSprite(img("/pic/jplane2.png"),24,22);//寬24,高22j1=newSprite(img("/pic/jplane2.png"),24,22);j2=newSprite(img("/pic/jplane2.png"),24,22);kkk=getHeight()/8;cboss.setVisible(false);//aipp=3;ai=aik.ne*tInt()%4;if(ai<0)ai=-ai;aipp=aip.ne*tInt()%3;if(aipp==0)//動態(tài)確定下一組敵機位置的參數(shù) {aipp=aip.ne*tInt()%3; }try {for(inti=0;i<=4;i++) {cloud[i]=newSprite(img("/pic/cloud1.png"),16,16);lm.append(cloud[i]); }}catch(E*ceptione) { System.out.println("cloud"); }lm.append(cboss);lm.append(j0);lm.append(j1);lm.append(j2);lm.append(bossbullet0);lm.append(bossbullet1);lm.append(bossbullet2);lm.append(ullet0);lm.append(ullet1);lm.append(ullet2);lm.append(sboss);[0]=1;[1]=1;[2]=1;[3]=1;try {for(inti=0;i<9;i++) {huokebullet[i]=playerbullet("/pic/bullet.png"); }}catch(E*ceptione){}try {for(inti=0;i<=8;i=i+3) {huokebullet[i].no=1;//okhuokebullet[i].score=0; }}catch(E*ceptione){System.out.println("ffffffffffffff");}for(inti=0;i<9;i++){lm.append(huokebullet[i]); }lm.append(c1);lm.append(b1); }privateImageimg(Stringpic) { Imageimg=null;try { img=Image.createImage(pic); }catch(E*ceptione*p) { System.out.println(e*p); }returnimg; }privatemybulletsplayerbullet(Stringpic)//,intp*,intpy,inttotal,intwidth,intheight) { Imageimg=null;try { img=Image.createImage(pic); }catch(E*ceptione*p) { System.out.println(e*p); }returnnewmybullets(img,6,6,21,getWidth(),getHeight());// }publicTiledLayercreateBackGround() { Imageimg=null;try { img=Image.createImage("/pic/beijing.png"); }catch(E*ceptione*p) { System.out.println("layercreateimage"); }//負責(zé): TiledLayertiledLayer=newTiledLayer(50,200,img,16,16);int[]map1= {3,1,1,3,3,3,1,3,3,3,3,3,3,2,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 1,3,1,1,1,1,1,1,1,1,1,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,1,3,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,1,3,3,3,3,3,3,4, 3,3,1,1,1,1,1,1,1,1,1,1,1,1,4, 3,3,1,3,3,3,3,3,3,3,3,3,3,1,4, 3,1,3,3,3,1,3,3,3,1,3,3,1,3,4, 3,3,3,3,1,3,3,3,3,3,1,3,3,3,4, 3,3,3,1,3,3,3,3,3,3,3,1,1,3,4, 3,1,1,3,1,1,1,1,1,1,1,3,1,3,4, 3,3,3,3,3,3,3,1,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,1,
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度婚內(nèi)出軌離婚協(xié)議范本:財產(chǎn)分割與子女撫養(yǎng)
- 2025年度房產(chǎn)抵押貸款合同生效條件合同
- 2025年度外賣配送環(huán)保措施協(xié)議
- 2025年度高級講師團隊聘用合同書
- 2025年度新能源汽車股份購買合同范本
- 2025年度海鹽二手房交易房產(chǎn)評估服務(wù)合同
- 二零二五年度模具設(shè)計軟件授權(quán)使用合同-@-1
- 電商平臺廣告創(chuàng)意設(shè)計與用戶體驗提升
- 現(xiàn)代辦公室安全文化培育與實踐探索
- 電子商務(wù)物流網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化研究
- 漸變方格模板
- 環(huán)境因素匯總識別及評價表(保衛(wèi)部 )
- GB/T 33880-2017熱等靜壓鋁硅合金板材
- 消防安全風(fēng)險辨識清單
- 超市店長考核方案(實例)
- 2023年版勞動實踐河北科學(xué)技術(shù)出版社一年級下冊全冊教案
- 方案報審表(樣表)
- 除銹、油漆檢驗批質(zhì)量驗收記錄樣表
- pp顧問的常見面試問題
- 法理學(xué)原理與案例完整版教學(xué)課件全套ppt教程
- 軟體家具、沙發(fā)質(zhì)量檢驗及工藝
評論
0/150
提交評論