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

正文內(nèi)容

基于j2me的java游戲坦克大戰(zhàn)的開發(fā)畢業(yè)設(shè)計(jì)論文(編輯修改稿)

2024-07-15 14:39 本頁面
 

【文章內(nèi)容簡介】 yOutputStream將不同種類的數(shù)據(jù)類型打包,以字節(jié)流的形式發(fā)送和接收。區(qū)別記錄的唯一標(biāo)記是他們的ID值,作為記錄集的主鍵。第一項(xiàng)記錄的ID是1,其后的每個(gè)記錄ID遞增。Record是以字節(jié)為基本單位來存放的,所以所有要寫入record的數(shù)據(jù)都必須先將其轉(zhuǎn)為字節(jié)才能寫入,從record所讀出來的數(shù)據(jù)也是字節(jié),必須將其轉(zhuǎn)換為原先寫入時(shí)的數(shù)據(jù)類型才有意義。然而讀取或?qū)懭氲淖止?jié)數(shù)組都只能代表一個(gè)字段的信息,如果需要讀取或?qū)懭攵鄠€(gè)字段就必須要將數(shù)據(jù)轉(zhuǎn)換成字節(jié)信息,并且提供適當(dāng)?shù)臋C(jī)制來分隔這些信息。主要有兩種方法:1. 標(biāo)記法。將所有要存放的數(shù)據(jù)用字符串表示,但是在字段和字段之間以一個(gè)特殊的符號(hào)作為分隔。符號(hào)不能和字段內(nèi)的數(shù)據(jù)相同的字符。2.利用輸入/輸出流這一種方法較上一種復(fù)雜,但是較為實(shí)用。方法一中所有的字段只能以字符串的形式存儲(chǔ),要對(duì)這些字段作進(jìn)一步的處理非常麻煩。利用輸入輸出流可以寫入及讀取不同數(shù)據(jù)類型的數(shù)據(jù),做法是在寫入數(shù)據(jù)時(shí)先將一個(gè)DataOutputStream數(shù)據(jù)流對(duì)象串接到一個(gè)ByteArrayOutStream數(shù)據(jù)流對(duì)象,然后再依字段的數(shù)據(jù)類型用writeInt()、writeBoolean()等方法寫入,最后把ByteArrayOutputStream內(nèi)的元素?cái)?shù)據(jù)寫入record中。反之若要讀取數(shù)據(jù),則先要串接一個(gè)DataInputStream對(duì)象和ByteArrayInputStream,依字段的數(shù)據(jù)類用readInt()、readBoolean()等方法讀取。 本程序中主要存放在永久區(qū)的內(nèi)容為用戶得到的最高分?jǐn)?shù)的記錄。一共可以存儲(chǔ)10條最高分。每次有新的更高的記錄就會(huì)插入進(jìn)相應(yīng)的位置,將最低一名排擠出記錄。在輸入記錄前,要求用戶在TextField框中寫入他自己的名字。返回的getString可以將名字輸送給字節(jié)流。因?yàn)槊總€(gè)記錄包括用戶名和分?jǐn)?shù),因此需要使用多字段的方式編入。打印到屏幕上時(shí),記錄ID號(hào)即為排名,因此將顯示三項(xiàng)數(shù)據(jù)。 內(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)。在這樣的情況下需要在不影響原有功能的情況下適當(dāng)?shù)目s減JAR文件的大小,除了可以克服內(nèi)存空間的限制外,也能大幅度縮短下載的時(shí)間(費(fèi)用也降低了),勢必會(huì)有更多的人愿意下載所開發(fā)的程序。其方法有:第一,就是盡量縮短命名的長度。在應(yīng)用程序內(nèi),對(duì)于所建立的類、接口、方法及變量名而言,都需要賦予一個(gè)識(shí)別的名稱,所命名的名稱每多一個(gè)字符就會(huì)在類文件內(nèi)多產(chǎn)生一個(gè)字節(jié),對(duì)于一個(gè)較復(fù)雜的應(yīng)用程序而言就會(huì)增加為數(shù)不小的數(shù)據(jù)量。所有這些可以借助混淆器來幫助實(shí)現(xiàn)。第二是減少復(fù)雜的程序結(jié)構(gòu),為一些共同的行為建立一個(gè)抽象類(Abstract Class) 來表示繼承的子類的共通性。第三是減少圖形數(shù)據(jù)的大小。將PNG格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了chunks,將比合并前的總大小減少許多。 混淆器(Obfuscator)的使用Java 語言并沒有完全編譯成二進(jìn)制可執(zhí)行文件,需要虛擬機(jī)來執(zhí)行。它包括了所有的信息。,從而不能保護(hù)作者的知識(shí)成果。目前流行的如decode,JAD等反編譯工具可以以很快的速度生成源文件。如果不加以施行有效的措施,將造成嚴(yán)重的后果。由此引入混淆器的概念?;煜鲗⒋a中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰挠⑽淖帜复?hào),如果缺乏相應(yīng)的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。 混淆器的作用不僅僅是保護(hù)代碼,它也有精簡編譯后程序大小的作用。由于以上介紹的減少變量、函數(shù)的命名長度的關(guān)系?;煜螅w積大約能減少25%,這對(duì)當(dāng)前費(fèi)用較貴的無線網(wǎng)絡(luò)傳輸是有一定意義的。為了能與各種IDE集成,就像Java2 SDK一樣,混淆器采用命令行參數(shù)的形式,以便可被其調(diào)用。目前流行的Obfuscator有RetroGuard等。第三章 程序分析和具體實(shí)現(xiàn) 游戲進(jìn)入前的選擇圖31 游戲前的選項(xiàng)畫面每個(gè)MIDlet程序都必須有一個(gè)主類,該類必須繼承自MIDlet。它控制著整個(gè)程序的運(yùn)行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)建、開始、暫停(手機(jī)中很可能有正在運(yùn)行程序卻突然來電的情況,這時(shí)應(yīng)進(jìn)入暫停狀態(tài)。)、結(jié)束的函數(shù)。進(jìn)入時(shí),首先載入畫面的不是游戲運(yùn)行狀態(tài),而是提供選項(xiàng),當(dāng)再次選擇Start Game時(shí)才正式運(yùn)行。運(yùn)行畫面如圖31所示。因此,在TankMain的構(gòu)造函數(shù)中分配了StartChoice類,即選項(xiàng)畫面的內(nèi)存空間。在startApp()函數(shù)中,隨即調(diào)用了Displable的setCurrent()函數(shù)將當(dāng)前屏幕設(shè)置為startChoice。在顯示高級(jí)用戶界面前,建造了一個(gè)Alert類。Alert對(duì)象用于顯示提示、警告等告之用戶信息的臨時(shí)閃現(xiàn)的屏幕,它可作為setCurrent的參數(shù),提前顯示在最終需要顯示的屏幕前。當(dāng)將FOREVER作為Alert的參數(shù)時(shí),將永久顯示,直到用戶點(diǎn)擊相應(yīng)按鈕手動(dòng)結(jié)束。但是當(dāng)顯示的畫面元素超過一屏大小時(shí),將自動(dòng)轉(zhuǎn)換為永久狀態(tài)。在此,由于貼在Alert上的圖片大小超出了其范圍,故已成為永久狀態(tài)。效果如圖32所示。圖43 使用說明畫面startChoice繼承了接口mandListener,這樣,就可以使用高級(jí)界面的Command按鈕。繼承了mandListener的類必須擁有mandAction(),以決定對(duì)按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。在設(shè)置好mandlistener后,需要調(diào)用setCommandListener()以將按鈕事件激活。鍵盤事件中,可用getCommandType()返回的Command類型來確定選擇的是什么按鈕。startChoice繼承了List類,用于顯示列表選項(xiàng),使用其append()函數(shù)可將選項(xiàng)加入到列表中。getSelectIndex()可檢測到選擇的項(xiàng)目的序號(hào),序號(hào)從0開始遞增。其中,當(dāng)選擇第一項(xiàng)時(shí)將載入正式游戲畫面BattleCanvas類,第二項(xiàng)將顯示幫助信息(效果如圖33),第三項(xiàng)則是重新顯示與作品和作者相關(guān)的logo畫面。開始敵人數(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字樣。它運(yùn)行在獨(dú)立的線程中,以恒定的頻率刷新畫面。刷新速度需大于30/秒才能使畫面顯示因人眼的暫時(shí)停留效應(yīng)流暢運(yùn)行。本程序設(shè)置為20毫秒。其主邏輯如圖44所示。程序中建立了另外的兩個(gè)類,分別表述了敵人坦克和玩家坦克的功能。它們分別為:EnemySprite和UserSprite。這兩個(gè)類均在BattleCanvas中建立了對(duì)象,以便進(jìn)行統(tǒng)一調(diào)度。BattleCanvas包括了LayerManager,這樣所有靜態(tài)和動(dòng)態(tài)的圖象都不需要手動(dòng)刷新,只需要在LayerManager中加入所有的需控制的元素,再統(tǒng)一由LayerManager刷新即可。因此,有必要在其中創(chuàng)立一個(gè)LayerManager的對(duì)象。 其他,如Sprite類的gameover字樣、記分統(tǒng)計(jì)畫面也都需在此主邏輯中建立相應(yīng)對(duì)象。還需保存的變量有,游戲開始時(shí)間、結(jié)束時(shí)間(用于統(tǒng)計(jì)分?jǐn)?shù))、敵人的總數(shù)、屏幕上敵人的數(shù)量、下一個(gè)敵人需要出現(xiàn)的位置(總共允許在三個(gè)不同的位置出現(xiàn),分別位于屏幕的左、中、右方)、游戲是否已成功結(jié)束或是否已死亡。 構(gòu)造函數(shù)中,需初始化地圖。地圖實(shí)際即為TiledLayer的一個(gè)對(duì)象,可調(diào)用setCell設(shè)置其具體的圖象格內(nèi)容。地圖由外部文件讀入。外部文件分別命名為level*.png,利用MIDP中唯一獲取外部文件為程序內(nèi)資源的getResourceAsStream()函數(shù)將地圖文件讀入程序。在創(chuàng)建了InputStream類的map對(duì)象后,使用read()函數(shù)可將流中的下一個(gè)字節(jié)讀出,并返回此字節(jié)代表的整數(shù)。每個(gè)整數(shù)代表一種障礙物。用二維循環(huán)將讀出的每個(gè)整數(shù),通過setCell()將整幅地圖畫出即可。地圖文件可用十六進(jìn)制的文本編輯器生成,如本程序使用的Ultraedit。繪出地圖后,可用LayerManager的append()將地圖放置在第一層。這是很有必要的。因?yàn)榈貓D上的障礙物之一——草,在坦克運(yùn)行中時(shí)是必須處于坦克的上層的,否則將失去真實(shí)性。為此,地圖必須首先載入。由于敵人將依次出現(xiàn)在屏幕上,同時(shí)出現(xiàn)的數(shù)量應(yīng)當(dāng)受到控制。本程序設(shè)置為6。所以在構(gòu)造函數(shù)中,也應(yīng)當(dāng)分配6個(gè)EnemySprite對(duì)象的內(nèi)存空間。構(gòu)造坦克時(shí),將把坦克的png圖片作為參數(shù)傳遞給EnemySprite和UserSprite,BattleCanvas中創(chuàng)建坦克僅調(diào)用createEnemy()和createUser()實(shí)現(xiàn)。在構(gòu)造函數(shù)自己調(diào)用了線程的start后,程序?qū)㈤_始循環(huán)運(yùn)行,直至跳出while的循環(huán)。每次循環(huán)中將檢測是否死亡,屏幕上坦克的數(shù)量,是否該過關(guān)統(tǒng)計(jì)分?jǐn)?shù),檢測用戶輸入的按鍵、重繪整個(gè)屏幕及回收垃圾內(nèi)存(Garbage Collection)。當(dāng)敵人坦克完全死亡時(shí)(enemyNum為0),需調(diào)用System類的currentTimeMillis()賦值給結(jié)果的時(shí)間。接著調(diào)用setCurrent()顯示統(tǒng)計(jì)分?jǐn)?shù)的畫面,為了進(jìn)入下一關(guān),統(tǒng)計(jì)畫面只是停留四秒,就重新轉(zhuǎn)回BattleCanvas畫面。當(dāng)然,如果當(dāng)前已是最后一關(guān),就不會(huì)再轉(zhuǎn)回。進(jìn)入下一關(guān)時(shí),許多變量需要重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家坦克的當(dāng)前位置。圖35 游戲結(jié)束的畫面如果游戲未結(jié)束,則需判斷屏上坦克是否已小于還剩坦克的總數(shù),如果是這樣,就需要再提供一輛坦克。提供新坦克之前,在屏幕上設(shè)置了一個(gè)專用指示的閃光符號(hào),它繼承了Sprite,運(yùn)行在單獨(dú)的線程中。以在兩秒鐘內(nèi)反復(fù)閃現(xiàn)兩次為一個(gè)生命周期。當(dāng)它閃光完
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1