freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于j2me的java游戲坦克大戰(zhàn)的開(kāi)發(fā)畢業(yè)設(shè)計(jì)畢業(yè)設(shè)計(jì)論文-閱讀頁(yè)

2025-07-03 14:48本頁(yè)面
  

【正文】 ecode,JAD等反編譯工具可以以很快的速度生成源文件。由此引入混淆器的概念。 混淆器的作用不僅僅是保護(hù)代碼,它也有精簡(jiǎn)編譯后程序大小的作用?;煜?,體積大約能減少25%,這對(duì)當(dāng)前費(fèi)用較貴的無(wú)線網(wǎng)絡(luò)傳輸是有一定意義的。目前流行的Obfuscator有RetroGuard等。 包括內(nèi)存狀況的檢測(cè)(手機(jī)上的內(nèi)存空間十分有限,必須時(shí)刻關(guān)注機(jī)載內(nèi)存是否大于程序所能使用到的最大可能的內(nèi)存空間),網(wǎng)絡(luò)狀況的檢測(cè),運(yùn)行函數(shù)的跟蹤等。其中,允許強(qiáng)制垃圾回收(Garbage Collection)。在程序運(yùn)行中也可以調(diào)用System類(lèi)的gc()函數(shù)手動(dòng)收回廢棄的內(nèi)存。分別對(duì)繪圖、數(shù)據(jù)庫(kù)、游戲基本算法等做了詳細(xì)敘述。 第四章 程序分析和具體實(shí)現(xiàn) 游戲進(jìn)入前的選擇圖41 游戲前的選項(xiàng)畫(huà)面每個(gè)MIDlet程序都必須有一個(gè)主類(lèi),該類(lèi)必須繼承自MIDlet。該類(lèi)中擁有可以管理程序的創(chuàng)建、開(kāi)始、暫停(手機(jī)中很可能有正在運(yùn)行程序卻突然來(lái)電的情況,這時(shí)應(yīng)進(jìn)入暫停狀態(tài)。圖42 程序開(kāi)始時(shí)的logo畫(huà)面進(jìn)入時(shí),首先載入畫(huà)面的不是游戲運(yùn)行狀態(tài),而是提供選項(xiàng),當(dāng)再次選擇Start Game時(shí)才正式運(yùn)行。因此,在TankMain的構(gòu)造函數(shù)中分配了StartChoice類(lèi),即選項(xiàng)畫(huà)面的內(nèi)存空間。在顯示高級(jí)用戶(hù)界面前,建造了一個(gè)Alert類(lèi)。當(dāng)將FOREVER作為Alert的參數(shù)時(shí),將永久顯示,直到用戶(hù)點(diǎn)擊相應(yīng)按鈕手動(dòng)結(jié)束。在此,由于貼在Alert上的圖片大小超出了其范圍,故已成為永久狀態(tài)。圖43 使用說(shuō)明畫(huà)面startChoice繼承了接口mandListener,這樣,就可以使用高級(jí)界面的Command按鈕。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。鍵盤(pán)事件中,可用getCommandType()返回的Command類(lèi)型來(lái)確定選擇的是什么按鈕。getSelectIndex()可檢測(cè)到選擇的項(xiàng)目的序號(hào),序號(hào)從0開(kāi)始遞增。開(kāi)始敵人數(shù)量小于0嗎?顯示記分畫(huà)面最后一關(guān)或死亡了嗎?進(jìn)入下一關(guān)敵人數(shù)量大于屏幕上的數(shù)量嗎?增加一個(gè)敵人玩家是否死亡顯示GameOver重繪屏幕內(nèi)存回收結(jié)束YNYNNYYN圖44 BattleCanvas類(lèi)主要關(guān)系流程圖 主游戲邏輯及其涉及到的若干類(lèi) BattleCanvas主管著所有類(lèi)之間的協(xié)調(diào),決定何時(shí)死亡,何時(shí)分配新的敵人,及控制敵人出現(xiàn)處的閃光圖標(biāo)、游戲結(jié)束后的動(dòng)態(tài)Gameover字樣。刷新速度需大于30/秒才能使畫(huà)面顯示因人眼的暫時(shí)停留效應(yīng)流暢運(yùn)行。其主邏輯如圖44所示。它們分別為:EnemySprite和UserSprite。BattleCanvas包括了LayerManager,這樣所有靜態(tài)和動(dòng)態(tài)的圖象都不需要手動(dòng)刷新,只需要在LayerManager中加入所有的需控制的元素,再統(tǒng)一由LayerManager刷新即可。 其他,如Sprite類(lèi)的gameover字樣、記分統(tǒng)計(jì)畫(huà)面也都需在此主邏輯中建立相應(yīng)對(duì)象。 構(gòu)造函數(shù)中,需初始化地圖。地圖由外部文件讀入。在創(chuàng)建了InputStream類(lèi)的map對(duì)象后,使用read()函數(shù)可將流中的下一個(gè)字節(jié)讀出,并返回此字節(jié)代表的整數(shù)。用二維循環(huán)將讀出的每個(gè)整數(shù),通過(guò)setCell()將整幅地圖畫(huà)出即可。繪出地圖后,可用LayerManager的append()將地圖放置在第一層。因?yàn)榈貓D上的障礙物之一——草,在坦克運(yùn)行中時(shí)是必須處于坦克的上層的,否則將失去真實(shí)性。由于敵人將依次出現(xiàn)在屏幕上,同時(shí)出現(xiàn)的數(shù)量應(yīng)當(dāng)受到控制。所以在構(gòu)造函數(shù)中,也應(yīng)當(dāng)分配6個(gè)EnemySprite對(duì)象的內(nèi)存空間。在構(gòu)造函數(shù)自己調(diào)用了線程的start后,程序?qū)㈤_(kāi)始循環(huán)運(yùn)行,直至跳出while的循環(huán)。當(dāng)敵人坦克完全死亡時(shí)(enemyNum為0),需調(diào)用System類(lèi)的currentTimeMillis()賦值給結(jié)果的時(shí)間。當(dāng)然,如果當(dāng)前已是最后一關(guān),就不會(huì)再轉(zhuǎn)回。圖45 游戲結(jié)束的畫(huà)面如果游戲未結(jié)束,則需判斷屏上坦克是否已小于還剩坦克的總數(shù),如果是這樣,就需要再提供一輛坦克。以在兩秒鐘內(nèi)反復(fù)閃現(xiàn)兩次為一個(gè)生命周期。這樣可提示玩家具體敵人將在什么時(shí)刻出現(xiàn),以便做好準(zhǔn)備。本程序設(shè)置的兩次坦克出現(xiàn)的最小間隔為2秒。效果如圖45所示。在出現(xiàn)正式畫(huà)面前設(shè)置了一個(gè)loading state*字樣的單獨(dú)屏幕,調(diào)用了loadinglevel()函數(shù),并停滯了1500毫秒,提示用戶(hù)做好準(zhǔn)備。圖47 游戲運(yùn)行中的模擬器畫(huà)面在繪圖的render()過(guò)程中,除了要重繪坦克、地圖、子彈外,還會(huì)在右邊空白處繪出一個(gè)生命統(tǒng)計(jì)欄。該三維欄的上方為白色,下方為黑色,就創(chuàng)造了立體感。在允許敵人出現(xiàn)前,需要檢測(cè)給即將出現(xiàn)的敵人分配一個(gè)數(shù)組序號(hào)。游戲的最終運(yùn)行狀態(tài)如圖47所示。EnemeySprite和UserSprite都繼承了該類(lèi)以簡(jiǎn)化結(jié)構(gòu)。構(gòu)造函數(shù)中創(chuàng)建了每個(gè)坦克必須擁有的一顆子彈,這些子彈就將只跟隨自己的坦克調(diào)動(dòng)。在setBulletDirection()中,將根據(jù)坦克當(dāng)前的方向確定子彈出膛后的方向,其中setRefPixelPosition()將子彈的參考點(diǎn)設(shè)置在其未變形狀態(tài)的底部,setXY()將其放置到炮口的位置,setTransform()將其圖片方向轉(zhuǎn)到需要使用的位置。它返回一個(gè)boolean值,提供給go()函數(shù),做進(jìn)一步的判斷。在得到障礙物屬性后,判斷其序號(hào)是否與草相同,或是否為空(序號(hào)為0)。 玩家坦克的功能屬性 構(gòu)造函數(shù)中需要將坦克方向設(shè)置為向上,因?yàn)閯偝霈F(xiàn)時(shí)就是這樣的狀態(tài)。需要聯(lián)系的還有自身坦克、地圖。因?yàn)樽訌検菍儆谔箍说?,它的屬性需要跟?dāng)前的坦克保持一致。最終調(diào)用其start()開(kāi)始子彈自己的線程。無(wú)論子彈是屬于敵人還是玩家的,它都必須記錄自己的來(lái)源和攻擊的對(duì)象。這樣,它才能有掃描的目標(biāo)。die()、resetPosition()、getLife()都是很簡(jiǎn)短的函數(shù),但卻提供必不可少的功能。在go()函數(shù),每個(gè)方向在走前都須用if (canPass(UP)amp。!collidesEnemy())檢測(cè)是否可以行走。collidesEnenmy檢測(cè)是否前方有坦克阻礙行動(dòng)。在collidesEnemy()函數(shù)中,將有一個(gè)for循環(huán)按照敵人數(shù)組的序號(hào)依次檢測(cè)6次。否則,當(dāng)玩家向上走,而有敵人從左方向右走,并且已經(jīng)碰撞到玩家坦克時(shí),玩家坦克會(huì)因?yàn)楸慌卸ㄒ雅c敵人發(fā)生碰撞而不允許前進(jìn)。這樣的判斷必須排除在考慮范圍外。 敵人坦克的功能屬性 由于和UserSrite同屬于一個(gè)TankSprite的繼承類(lèi),其功能就與UserSprite有很大的相似之處,但也有其自身的特別屬性。 首先,EnemySprite繼承了Runable接口。因此,它可以運(yùn)行在單獨(dú)的線程中。此函數(shù)由BattleCanvas調(diào)用。Random random=new Random(())。此時(shí)返回的值的范圍就確定在1~4之間,正好對(duì)應(yīng)四個(gè)方向。getRandomStep()的原理類(lèi)似: Random random=new Random(())。只是需要乘以每秒會(huì)刷新的屏幕的次數(shù)。每個(gè)敵人還需要擁有一個(gè)內(nèi)部的所有敵人的數(shù)組元素。 collidesWithOtherTank()將檢測(cè)是否與其他坦克(包括敵人和玩家)。if(i==number)break 。collidesInOtherTank()雖與上面的函數(shù)很相似,但仍有一些細(xì)微不同,那就是不需要在檢測(cè)前設(shè)置被檢測(cè)方的矩形區(qū)域。此函數(shù)用來(lái)檢測(cè)是否在剛出現(xiàn)時(shí)就與其他坦克發(fā)生碰撞的。在運(yùn)行的線程中,需在每前進(jìn)的一步驟中循環(huán)做下列事件:如果坦克已死亡,立刻退出。如果不是剛出現(xiàn)(由isBeginner決定),判斷是否與將其他坦克發(fā)生碰撞,就向當(dāng)前方向前進(jìn)一步驟,否則,將需要循環(huán)檢測(cè)的當(dāng)前隨機(jī)步數(shù)減少為原先的2/3(為了加速離開(kāi)的時(shí)間)。當(dāng)隨機(jī)發(fā)炮數(shù)減少到0時(shí),就進(jìn)行發(fā)炮的動(dòng)作。當(dāng)所有的步驟走完后,因?yàn)樾枰D(zhuǎn)動(dòng)方向,于是,調(diào)用一次隨機(jī)取得方向的函數(shù)再次獲值。在go()函數(shù)中首先檢測(cè)是否正處于碰撞狀態(tài)中,如果不是,就需要取消Beginner的狀態(tài),因?yàn)椴恍枰狟eginner這樣的特殊身份,讓別的坦克不檢測(cè)了。如果是,就不應(yīng)該受到其他坦克的影響而直接改變坐標(biāo),但若不是,就應(yīng)當(dāng)遠(yuǎn)地不動(dòng)。它擁有一個(gè)很重要的變量,isFromEnemy。其主要功能流程圖見(jiàn)圖49。當(dāng)擊中了需要作出反映的物體時(shí),就分別采取措施:擊中草時(shí),由于沒(méi)有定義相關(guān)函數(shù),就不會(huì)有任何反映,會(huì)重合在草上正常通過(guò);擊中磚塊時(shí),將產(chǎn)生爆炸,調(diào)用setCell將當(dāng)前塊置為空,并產(chǎn)生爆炸效果。爆炸效果需要將圖片insert進(jìn)第0層,這樣才不至于被其他景物所覆蓋,爆炸結(jié)束后layerManager會(huì)自動(dòng)相應(yīng)調(diào)整。 setShootCheck(EnemySprite enemySprite[]);setUserSprite(UserSprite userSprite);setEnemySprite(EnemySprite enemySprite)都是將相關(guān)的坦克傳入到子彈類(lèi)里來(lái),以便確認(rèn)來(lái)源或攻擊目標(biāo)。amp。amp。amp。這幾項(xiàng)參數(shù)在編寫(xiě)時(shí)很容易出錯(cuò)。如果程序在子彈已經(jīng)到達(dá)X軸的155坐標(biāo)時(shí)仍允許子彈繼續(xù)運(yùn)行,子彈將一次性向右運(yùn)行2個(gè)象素,到達(dá)157點(diǎn)。地圖的tiledLayer對(duì)象中并不存在序號(hào)為20的塊,最大只為19。 子彈運(yùn)行中,將用collidesWith(tiledLayer,true)測(cè)試是否碰撞上了地圖。這將針對(duì)四個(gè)不同的方向分別以象素級(jí)檢測(cè)。 如果沒(méi)有擊中物體,就繼續(xù)檢測(cè)是否擊中了某輛坦克。當(dāng)來(lái)自玩家時(shí),將首先檢測(cè)所有的敵人發(fā)出的子彈,當(dāng)發(fā)生子彈間的碰撞時(shí),用戶(hù)的子彈將被移除,雖然按照道理敵人的子彈同時(shí)也應(yīng)被移除,但敵人子彈是運(yùn)行在另一線程中的,應(yīng)當(dāng)由它自己來(lái)控制為好,用戶(hù)的子彈只需要管理好自己的狀態(tài)就可以了。 如果是來(lái)自敵人的子彈,將同樣檢測(cè)與玩家子彈的碰撞,及與玩家坦克的碰撞如有碰撞,玩家生命數(shù)減少一位,位置重置。因?yàn)閘ayerManager的remove函數(shù)并不會(huì)真正將層移除。如果不放置到屏外,敵人坦克仍會(huì)被阻擋,子彈仍會(huì)再次擊中用戶(hù)坦克。為了能控制一輛坦克在同一時(shí)間只能發(fā)射一發(fā)子彈,在子彈生命運(yùn)行結(jié)束時(shí)候,()恢復(fù)坦克繼續(xù)發(fā)炮的能力。 記分系統(tǒng)記分系統(tǒng)的功能指定在ScoreScreen類(lèi)內(nèi)。在BattleCanvas請(qǐng)求調(diào)入分?jǐn)?shù)統(tǒng)計(jì)的屏幕時(shí),將首先調(diào)用initRs()初始化一些環(huán)境變量。隨后將分別建立ByteArrayOutputStream 和DataOutputStream以便實(shí)現(xiàn)多字段的記錄。score=()將所得的被寫(xiě)入的數(shù)據(jù)流輸送到score的字節(jié)數(shù)組中。getScore()函數(shù)得到所需要序號(hào)的分?jǐn)?shù)。使用它只是為了將記錄的指針向后推移到可以讀出分?jǐn)?shù)字段的位置。(i+1,record,0,)將把已讀出的當(dāng)前位置的記錄寫(xiě)入到下一條中,當(dāng)發(fā)現(xiàn)移動(dòng)完畢后當(dāng)前序號(hào)即為所需要插入的位置時(shí),(name), (score),(i,record,0,),將記錄寫(xiě)入。drawList()函數(shù)繪畫(huà)出當(dāng)前的屏幕分?jǐn)?shù)。效果如圖49顯示。在這個(gè)在刷新屏幕時(shí)(repaint()被調(diào)用)需要執(zhí)行的方法中,設(shè)置了一個(gè)整形的duration,用來(lái)記錄完成一關(guān)所用的時(shí)間。每關(guān)的分?jǐn)?shù)被設(shè)置為100000/duration。就不將當(dāng)前關(guān)得到的分?jǐn)?shù)加入到總分的計(jì)算里,否則就調(diào)用totalScore=totalScore+levelScore進(jìn)行累加。如果需要進(jìn)入下一關(guān),則進(jìn)入本關(guān)統(tǒng)計(jì)分?jǐn)?shù)的顯示。按鈕由addCommand()加入,并設(shè)置了mandListener()確定按鍵事件發(fā)生后的動(dòng)作。當(dāng)用戶(hù)的分?jǐn)?shù)達(dá)到一定的高度可以寫(xiě)進(jìn)記錄時(shí),將調(diào)用inputName=new Form(Congratulations)創(chuàng)建一個(gè)新的Form類(lèi)的屏幕,其中包括一個(gè)TextField,允許用戶(hù)輸入自己的姓名,這樣使用getString就可以將輸入讀出,寫(xiě)入到記錄中。對(duì)游戲有關(guān)的各運(yùn)行界面也做了展示。經(jīng)過(guò)了細(xì)心的調(diào)試和排錯(cuò)解決了絕大部分的問(wèn)題。即使是作為操作系統(tǒng)的各種版本的Windows也時(shí)常會(huì)發(fā)生許多類(lèi)型的錯(cuò)誤和漏洞。目前發(fā)現(xiàn)的bug和未完善的功能列表如下:1. 與敵人對(duì)子彈的時(shí)候有時(shí)候可能會(huì)出現(xiàn)當(dāng)敵人死后,自己若仍在原地,子彈會(huì)發(fā)不出去。 3. 子彈和敵人經(jīng)常會(huì)與畫(huà)面的刷新的線程不同步,造成畫(huà)面閃爍。即使刷屏沒(méi)有間隔也不會(huì)提高速度。6. 當(dāng)敵人和自己同時(shí)死亡時(shí),仍會(huì)過(guò)關(guān),但Game Over字樣會(huì)出現(xiàn),下一關(guān)坦克不會(huì)出現(xiàn),但可以隱身發(fā)炮。 2. 有時(shí)會(huì)莫名其妙的死機(jī)。 經(jīng)驗(yàn)和感想 坦克大戰(zhàn)作為畢業(yè)設(shè)計(jì),是本人目前做過(guò)的最大的程序。本科期間做過(guò)很多課程設(shè)計(jì),大多規(guī)模很小。因?yàn)槠涓鱾€(gè)模塊間的聯(lián)系十分緊密,代碼重復(fù)執(zhí)行率高,當(dāng)經(jīng)過(guò)無(wú)數(shù)次的調(diào)試、修改后,能最終看到成品,有無(wú)比自豪的心情。大家作品的最終結(jié)果都離不開(kāi)同一個(gè)模式。游戲程序最大限度的利用了硬件條件,因此展現(xiàn)出的畫(huà)面往往多彩絢麗、效果驚人。本畢業(yè)設(shè)計(jì)建立在Java平臺(tái)上,是本人以前未曾接觸過(guò)的領(lǐng)域。學(xué)習(xí)該平臺(tái)背景和功能的時(shí)間遠(yuǎn)遠(yuǎn)超出了我想象的時(shí)間。很多相關(guān)的技術(shù),如需要使用到的線程、RMS數(shù)據(jù)庫(kù)、Game包的新功能、高級(jí)、低級(jí)圖形界面的使用、時(shí)鐘的控制、貼圖,每一項(xiàng)都需要花一定的時(shí)間去掌握和熟悉。臺(tái)灣的王森寫(xiě)了兩本較好的書(shū),給了我很大的幫助,但對(duì)設(shè)計(jì)該游戲來(lái)說(shuō),仍只夠入門(mén)。英文原版介紹的確比市面上所有的書(shū)籍都更為詳細(xì)和準(zhǔn)確。在終于可以照貓畫(huà)虎的寫(xiě)出一小段動(dòng)畫(huà)的代碼時(shí),已經(jīng)過(guò)去了相當(dāng)長(zhǎng)的準(zhǔn)備時(shí)間。指導(dǎo)老師說(shuō)Java的上手比較困難,需要配置的環(huán)境和掌握的背景比較多。我在一星期內(nèi)寫(xiě)了1500行代碼,經(jīng)過(guò)了幾百次的調(diào)試,終于完成了現(xiàn)在的程序。本程序打包后體積23K,運(yùn)行時(shí)如進(jìn)行g(shù)c()內(nèi)存回收可將運(yùn)行時(shí)堆內(nèi)存控制在50K以?xún)?nèi),大小與目前大部分手機(jī)的100K左右的可使用內(nèi)存和500K左右的
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1