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

正文內(nèi)容

基于j2me的java游戲坦克大戰(zhàn)的開發(fā)畢業(yè)設(shè)計(jì)論文-在線瀏覽

2024-07-29 14:39本頁面
  

【正文】 序可在需要時(shí)在Canvas中摻入高級(jí)類的組件。鍵盤事件由鍵代碼指定,但這樣控制游戲會(huì)導(dǎo)致缺乏通用性,并不是每個(gè)設(shè)備的鍵盤布局都適合游戲的操作。本程序中,操縱用戶坦克運(yùn)行的按鍵都定義為游戲控制鍵,這樣便能適應(yīng)所有的機(jī)器。它具有24位深度色彩的繪制能力,以三原色分別各占一個(gè)字節(jié)表示其顏色。其對(duì)象會(huì)被傳給Canvas的paint()函數(shù),以便最終顯示。PNG格式提供透明背景的圖象,這對(duì)繪制游戲畫面和被操縱主角極有幫助。PNG格式圖片中包含許多定義其圖片特性的冗余部分(Chunks)。使用Image類中的createImage函數(shù)可從整圖中分割出所需要的元素。實(shí)現(xiàn)了方便的管理和程序體積的精簡。地圖繪制、主角的動(dòng)態(tài)顯示、按鍵的檢測(cè)、圖層的控制等游戲?qū)俚奶匦远嫉玫搅嗽谝苿?dòng)設(shè)備上最大的發(fā)揮。它包括了一系列自動(dòng)獲取了代號(hào)和位置的層,簡化了各層加入游戲畫面的過程,提供了自動(dòng)排序和繪制的能力。層的序號(hào)相當(dāng)于坐標(biāo)的Z軸,0層表示最接近用戶視覺,層數(shù)越高,離用戶越遠(yuǎn)。LM中的View Window控制著與LM相對(duì)坐標(biāo)的可視區(qū)域。本程序中所有的地圖、坦克都采用LM控制,敵方坦克的生成由附加一個(gè)EnemySprite對(duì)象得到。Sprite類是繼承自Layer的用于存儲(chǔ)多楨的基本可視元素。圖片可翻轉(zhuǎn)、顛倒、由一個(gè)主角圖片就可以方便的得到所有方向的顯示狀態(tài),相比原先只能使用Canvas繪圖,需要將所有方向的主角圖象都繪制在png圖象中簡化了許多。每個(gè)小圖按照其排列順序有相應(yīng)的序號(hào),在程序中調(diào)用其序號(hào),就可以繪制出相應(yīng)的圖片。在有些情況下,控制主角的翻轉(zhuǎn),尤其是多幅圖片配合顯示的過程,如果將多圖的共享定位點(diǎn)設(shè)置在通常的左上角,將很不容易控制,因?yàn)樵S多翻轉(zhuǎn)都是以其他點(diǎn)為參考電的(比如,中心點(diǎn))。參考點(diǎn)由defineReferencePixel函數(shù)確定未翻轉(zhuǎn)圖片狀態(tài)時(shí)的坐標(biāo)。本程序中的坦克的參考點(diǎn)定義在圖片正中,以便簡便的實(shí)現(xiàn)轉(zhuǎn)向等功能。TiledLayer是有一組圖象格元素(grid of cells)組成的整塊虛擬圖象。這項(xiàng)技術(shù)通常應(yīng)用在2D游戲平臺(tái)的滾動(dòng)背景的繪圖。多塊格可由大塊同時(shí)替換組合而模擬動(dòng)態(tài)的背景,這不需要逐塊替換所有的靜態(tài)圖象格而顯得非常方便。每塊障礙物都有其響應(yīng)的代號(hào),其中,用戶需保護(hù)的總部因?yàn)轶w積稍大,使用了四塊圖象格顯示。如果整塊地圖均由繪圖產(chǎn)生,將導(dǎo)致體積迅速增加,且對(duì)坦克與障礙物的碰撞也難以檢測(cè)。 第二章 游戲的設(shè)計(jì)思路 坦克的控制和敵方的智能運(yùn)行 。這樣的機(jī)制并不適合某些游戲場合。同時(shí),事件的執(zhí)行周期也并不一定適合游戲的場合,也許需要更高頻率執(zhí)行的按鍵卻只能在指定的周期內(nèi)規(guī)律的響應(yīng)。 GameCanvas提供getKeyStates函數(shù)可獲取當(dāng)前鍵盤上的信息。只需要此一個(gè)函數(shù)的返回值就可以返回所有鍵的狀態(tài)。同時(shí),這樣的機(jī)制也可檢測(cè)到幾個(gè)鍵同時(shí)按下的狀態(tài),從而提供斜向運(yùn)行等相應(yīng)功能。Sprite類中提供了collidesWith函數(shù),用于判斷是否與某個(gè)TiledLayer、Sprite、Image的對(duì)象有圖象上的重合(即游戲中的碰撞)。因?yàn)槿绻l(fā)生碰撞,collidesWith成立,則兩輛坦克已經(jīng)發(fā)生了圖象重合,違反了規(guī)則,甚至若再進(jìn)行collidesWith判斷的話,其結(jié)果將永為真。在多出的11個(gè)象素中,按照每個(gè)象素依次檢查此象素是否于外界發(fā)生碰撞,如果不是按照象素檢查,則當(dāng)坦克與障礙物錯(cuò)位并同時(shí)與兩種物體接觸時(shí)將有可能忽略檢測(cè)其中的一樣物體。如果發(fā)生碰撞,則坦克應(yīng)當(dāng)選擇掉轉(zhuǎn)方向,此時(shí),兩輛碰撞的坦克又因?yàn)槠渚匦螀^(qū)域不重合而不符合collidesWith的條件,就可以繼續(xù)正常運(yùn)行了。敵人可以自動(dòng)行走,但是應(yīng)當(dāng)在以下適當(dāng)?shù)那闆r下轉(zhuǎn)向:首先是是否超出界面的邊界,其次是是否與地圖障礙物發(fā)生了碰撞,再次是是否與用戶坦克發(fā)生了碰撞。如果一定發(fā)生轉(zhuǎn)向,試想,當(dāng)敵方碰到玩家時(shí),如果它立即轉(zhuǎn)向,將不會(huì)對(duì)玩家發(fā)射射向他的子彈,就不構(gòu)成任何威脅,當(dāng)然,也不能永遠(yuǎn)不轉(zhuǎn)向。另外,坦克的發(fā)炮間隔和轉(zhuǎn)后的具體方向都由隨機(jī)數(shù)決定。這是允許的,但需要對(duì)他們標(biāo)注狀態(tài),即當(dāng)坦克剛出現(xiàn)時(shí)暫時(shí)允許重合,一旦在某個(gè)時(shí)間他們脫離了重合狀態(tài),就不能在允許重合,如果不設(shè)置這樣的判斷,剛出現(xiàn)的坦克將會(huì)因?yàn)槭艿阶枞肋h(yuǎn)不能前進(jìn),坦克將混成一團(tuán)。 子彈的運(yùn)行和控制每一個(gè)坦克都有他自己的一顆子彈,這顆子彈在任何一輛坦克被構(gòu)造時(shí)就一直存在,直至此坦克生命的結(jié)束,子彈的再次只是將屏幕上暫時(shí)掩蓋的圖象重新置于坦克炮筒才恰當(dāng)位置,并使其顯示出來,這與現(xiàn)實(shí)中每個(gè)子彈都是單獨(dú)的個(gè)體有所不同。在其出現(xiàn)在屏幕上的運(yùn)行周期中,每一步都需要循環(huán)檢測(cè)以下條件:是否與某坦克發(fā)生了碰撞,即擊中了這輛坦克。分為兩種情況,如果此子彈來自于敵方,將只檢測(cè)玩家坦克,因?yàn)閿撤街g的子彈必須允許可以透明的穿過,以保證不會(huì)在敵人之間發(fā)生子彈的消減。其次,子彈之間需要檢測(cè)是否碰撞。玩家的子彈需要在每一步檢測(cè)所有敵人的子彈的運(yùn)行狀態(tài)。子彈對(duì)不同障礙物將有不同的反映。 RMS數(shù)據(jù)庫系統(tǒng)MIDP為MIDlets提供了一種永久存儲(chǔ)和后來讀出數(shù)據(jù)的數(shù)據(jù)庫解決方案,被稱為Record Managerment System(RMS),是一種類簡單的基于記錄的數(shù)據(jù)庫。微小的存儲(chǔ)空間也限制了它們的結(jié)構(gòu)不能過于復(fù)雜。RMS包中包括RecordStore類。當(dāng)MIDlet包從平臺(tái)中被移除后,所有與該包有關(guān)的的記錄集都同時(shí)會(huì)被移除。訪問模式會(huì)在準(zhǔn)備提供共享的RecordStore被建立時(shí)被創(chuàng)建。RecordStore的API采用了時(shí)間戳的概念,其長整型變量由System的currentTimeMillis()函數(shù)返回決定。記錄是字節(jié)數(shù)組。區(qū)別記錄的唯一標(biāo)記是他們的ID值,作為記錄集的主鍵。Record是以字節(jié)為基本單位來存放的,所以所有要寫入record的數(shù)據(jù)都必須先將其轉(zhuǎn)為字節(jié)才能寫入,從record所讀出來的數(shù)據(jù)也是字節(jié),必須將其轉(zhuǎn)換為原先寫入時(shí)的數(shù)據(jù)類型才有意義。主要有兩種方法:1. 標(biāo)記法。符號(hào)不能和字段內(nèi)的數(shù)據(jù)相同的字符。方法一中所有的字段只能以字符串的形式存儲(chǔ),要對(duì)這些字段作進(jìn)一步的處理非常麻煩。反之若要讀取數(shù)據(jù),則先要串接一個(gè)DataInputStream對(duì)象和ByteArrayInputStream,依字段的數(shù)據(jù)類用readInt()、readBoolean()等方法讀取。一共可以存儲(chǔ)10條最高分。在輸入記錄前,要求用戶在TextField框中寫入他自己的名字。因?yàn)槊總€(gè)記錄包括用戶名和分?jǐn)?shù),因此需要使用多字段的方式編入。 內(nèi)存使用的最佳化通常在MIDP應(yīng)用程序的手機(jī)執(zhí)行環(huán)境中,所牽涉的內(nèi)存有下列三種:﹡應(yīng)用程序存儲(chǔ)內(nèi)存﹡RecordStore存儲(chǔ)內(nèi)存﹡執(zhí)行時(shí)期內(nèi)存(Java Heap)其中前兩種是持久性的內(nèi)存,關(guān)閉電源后還能保持?jǐn)?shù)據(jù)的正確性,通常這兩種內(nèi)存所能存儲(chǔ)的容量是合并計(jì)算的,這個(gè)上限對(duì)每種手機(jī)都不一樣,大部分在一兩百KB內(nèi)。其方法有:第一,就是盡量縮短命名的長度。所有這些可以借助混淆器來幫助實(shí)現(xiàn)。第三是減少圖形數(shù)據(jù)的大小。 混淆器(Obfuscator)的使用Java 語言并沒有完全編譯成二進(jìn)制可執(zhí)行文件,需要虛擬機(jī)來執(zhí)行。從而不能保護(hù)作者的知識(shí)成果。如果不加以施行有效的措施,將造成嚴(yán)重的后果?;煜鲗⒋a中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰挠⑽淖帜复?hào),如果缺乏相應(yīng)的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。由于以上介紹的減少變量、函數(shù)的命名長度的關(guān)系。為了能與各種IDE集成,就像Java2 SDK一樣,混淆器采用命令行參數(shù)的形式,以便可被其調(diào)用。第三章 程序分析和具體實(shí)現(xiàn) 游戲進(jìn)入前的選擇圖31 游戲前的選項(xiàng)畫面每個(gè)MIDlet程序都必須有一個(gè)主類,該類必須繼承自MIDlet。該類中擁有可以管理程序的創(chuàng)建、開始、暫停(手機(jī)中很可能有正在運(yùn)行程序卻突然來電的情況,這時(shí)應(yīng)進(jìn)入暫停狀態(tài)。進(jìn)入時(shí),首先載入畫面的不是游戲運(yùn)行狀態(tài),而是提供選項(xiàng),當(dāng)再次選擇Start Game時(shí)才正式運(yùn)行。因此,在TankMain的構(gòu)造函數(shù)中分配了StartChoice類,即選項(xiàng)畫面的內(nèi)存空間。在顯示高級(jí)用戶界面前,建造了一個(gè)Alert類。當(dāng)將FOREVER作為Alert的參數(shù)時(shí),將永久顯示,直到用戶點(diǎn)擊相應(yīng)按鈕手動(dòng)結(jié)束。在此,由于貼在Alert上的圖片大小超出了其范圍,故已成為永久狀態(tài)。圖43 使用說明畫面startChoice繼承了接口mandListener,這樣,就可以使用高級(jí)界面的Command按鈕。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。鍵盤事件中,可用getCommandType()返回的Command類型來確定選擇的是什么按鈕。getSelectIndex()可檢測(cè)到選擇的項(xiàng)目的序號(hào),序號(hào)從0開始遞增。開始敵人數(shù)量小于0嗎?顯示記分畫面最后一關(guān)或死亡了嗎?進(jìn)入下一關(guān)敵人數(shù)量大于屏幕上的數(shù)量嗎?增加一個(gè)敵人玩家是否死亡顯示GameOver重繪屏幕內(nèi)存回收結(jié)束YNYNNYYN圖34 BattleCanvas類主要關(guān)系流程圖 主游戲邏輯及其涉及到的若干類 BattleCanvas主管著所有類之間的協(xié)調(diào),決定何時(shí)死亡,何時(shí)分配新的敵人,及控制敵人出現(xiàn)處的閃光圖標(biāo)、游戲結(jié)束后的動(dòng)態(tài)Gameover字樣。刷新速度需大于30/秒才能使畫面顯示因人眼的暫時(shí)停留效應(yīng)流暢運(yùn)行。其主邏輯如圖44所示。它們分別為:EnemySprite和UserSprite。BattleCanvas包括了LayerManager,這樣所有靜態(tài)和動(dòng)態(tài)的圖象都不需要手動(dòng)刷新,只需要在LayerManager中加入所有的需控制的元素,再統(tǒng)一由LayerManager刷新即可。 其他,如Sprite類的gameover字樣、記分統(tǒng)計(jì)畫面也都需在此主邏輯中建立相應(yīng)對(duì)象。 構(gòu)造函數(shù)中,需初始化地圖。地圖由外部文件讀入。在創(chuàng)建了InputStream類的map對(duì)象后,使用read()函數(shù)可將流中的下一個(gè)字節(jié)讀出,并返回此字節(jié)代表的整數(shù)。用二維循環(huán)將讀出的每個(gè)整數(shù),通過setCell()將整幅地圖畫出即可。繪出地圖后,可用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è)Enem
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1