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

正文內(nèi)容

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

2025-07-15 14:39 本頁面
 

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