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

正文內(nèi)容

基于j2me為平臺的坦克大戰(zhàn)游戲開發(fā)論文-資料下載頁

2024-11-17 21:54本頁面

【導(dǎo)讀】設(shè)備的飛速發(fā)展而誕生的一項新的開發(fā)技術(shù)。它定位在消費性電子產(chǎn)品的應(yīng)用。上,對設(shè)備的智能化、多樣化,提供了革命性的解決方案,并因其“WriteOnce,runanywhere”的Java特性而提高開發(fā)的效率。著不可忽視的作用。本論文著眼于J2ME技術(shù)的應(yīng)用,開發(fā)一款可商用的手機游。戲程序——坦克大戰(zhàn)。本程序的界面和運作方式繼承于日本任天堂公司在20世。更流行的硬件平臺提供應(yīng)用軟件。構(gòu)分析和具體功能的實現(xiàn)。Java語言是美國SunMicrosystem的JamesGosling、PratrickNaughton及Mike. 逐年攀升,生產(chǎn)效率不斷上升,產(chǎn)品價格比個人電腦的摩爾定律有更驚人的下調(diào),根據(jù)官方公布的統(tǒng)計數(shù)據(jù),我國移動電話用戶。依托這樣的市場,一旦無線Java應(yīng)用大規(guī)模開展起來,將會創(chuàng)造。僅僅短短幾年,J2ME仍是一種新型的技術(shù),中文資料除臺灣出版過相關(guān)書籍外,公司也僅成立于1999年。本論文中第一章介紹游戲機軟硬件歷史、Java語言、J2ME及其相關(guān)技術(shù);第三章分析該作品設(shè)計的思想和流程,介紹總體結(jié)構(gòu);第五章提及了開發(fā)過程、心得體會、經(jīng)驗和感想。

  

【正文】 用也降低了),勢必會有更多的人愿意下載 所開發(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í)行文件,編譯出的 .class 文件是一種介于源程序和二進制之間的一中基于半解釋的 字節(jié)碼,需要虛擬機來執(zhí)行。它包括了所有的信息 。然而這樣會導(dǎo)致 .class 很容易被反編譯為源代碼,從而不能保護作者的知識成果。目前流行的如 decode,JAD 等反編譯工具可以以很快的速度生成源文件。如果不加以施行有效的措施,將造成嚴(yán)重的后果。 由此引入混淆器的概念。混淆器將代 碼中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰挠⑽淖帜复?,如果缺乏相?yīng)的 函數(shù)名 指示和 程序注釋,即使被反編譯,也將難以閱讀。 混淆器的作用不僅僅是保護代碼,它也有精簡編譯后程序大小的作用。 由于以上介紹的減少變量、函數(shù)的命名長度的關(guān)系 ,編譯后也會從 .class 文件中減少這些冗余的信息。 混淆后,體積大約能減少 25%,這對當(dāng)前費用較貴的無線網(wǎng)絡(luò)傳輸是有一定意義的 。 為了能與各種 IDE 集成, 就像 Java2 SDK 一樣, 混淆器 采用命令行參數(shù)的形式 ,以便可被其調(diào)用。 目前流行的 Obfuscator 有 RetroGuard 等。 模擬器的相關(guān)調(diào)試 IDE 整合的 Wireless Tool Kit 提供了許多在運行時監(jiān)視運行狀態(tài)的工具。 包括內(nèi)存狀況的檢測(手機上的內(nèi)存空間十分有限,必須時刻關(guān)注機載內(nèi)存是否大于程序所能使用到的最大可能的內(nèi)存空間),網(wǎng)絡(luò)狀況的檢測,運行函數(shù)的跟蹤等。如圖 34,是內(nèi)存跟蹤測試隨時間變化的調(diào)試器。其中,允許 強制 垃圾回收 (Garbage Collection)。由于 Java 語言中,不像許多其他的如 C++語言,不需要指定回收函數(shù)中特定不使用的資源,資源回收機制將自動清空無效變量占用的 空間 。在程序運行中也可以調(diào)用 System 類的 gc()函數(shù)手動收回廢棄的內(nèi)存。 18 本章小結(jié) : 第三章中介紹了程序的流程、相關(guān)技術(shù)的思想及其在本程序中的應(yīng)用。分別對繪圖、數(shù)據(jù)庫、游戲基本算法等做了詳細(xì)敘述。具體算法的代碼實現(xiàn)和詳細(xì)流程將在下章介紹。 圖 34 內(nèi)存監(jiān)視器 19 第四章 程序 分析和具體實現(xiàn) 游戲 進入前的選擇 每個 MIDlet 程序都必須有一個主類,該類必須繼承自 MIDlet。它控制著整個程序的運行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)建、開始、 暫停(手機中很可能有正在運行程序卻突然來電的情況,這時應(yīng)進入暫停狀態(tài)。)、結(jié)束的函數(shù)。 進入時,首先載入畫面的不是游戲運行狀態(tài),而是提供選項,當(dāng)再次選擇 Start Game 時才正式運行。運行畫面如圖 41 所示。 因此,在 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)。 效果如圖 42所示。 startChoice 繼承了接口 mandListener,這樣,就可以使用高級界面的 Command 按鈕。 繼承了 mandListener 的類必須擁有 mandAction(),以決定對按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。 在設(shè)置好 mandlistener 后,需要調(diào)用 setCommandListener()以將按鈕事件激活 。 鍵盤事件中,可用 getCommandType()返回的 Command 類型來確定選擇的是什么按鈕。 startChoice 繼承了 List 類,用于顯示列表選項,使用其 append()函數(shù)可將選項加入到列表中。getSelectIndex()可檢測到選擇的項目的序號,序號從 0 開始遞增。 其中,當(dāng)選擇第一項時將載入正式游戲畫面 BattleCanvas類,第二項將顯示幫助信息 (效圖 41 游戲前 的選項畫面 圖 42 程序開始時的 logo畫面 圖 43 使用說明畫面 20 果如圖 43),第三項則是重新顯示 與作品和作者相關(guān)的 logo 畫面。 主游戲 邏輯 及其涉及到的若干類 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。 開始 敵人數(shù)量小于 0 嗎? 顯示記分畫面 最后一關(guān)或死亡了嗎? 進入下一關(guān) 敵人數(shù)量大于屏幕上的數(shù)量嗎? 增加一個敵人 玩家是否死亡 顯示 GameOver 重繪屏幕 內(nèi)存回收 結(jié)束 Y N Y N N Y Y N 圖 44 BattleCanvas 類主要關(guān)系流程圖 21 圖 45 游戲結(jié)束的畫面 繪出地圖后,可用 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)前位置。 如果游戲未結(jié)束,則需判斷屏上坦克是否已小于還剩坦克的總數(shù),如果是這樣,就需要再提供一輛坦克。提 供新坦克之前,在屏幕上設(shè)置了一個專用指示的閃光符號 ,它繼承了 Sprite,運行在單獨的線程中。 以在兩秒鐘內(nèi)反復(fù)閃現(xiàn)兩次為一個生命周期。當(dāng)它閃光完畢后,敵人就會從閃光位置出現(xiàn)。這樣可提示玩家具體敵人將在什么時刻出現(xiàn) ,以便做好準(zhǔn)備。 閃光位置設(shè)置了三處坐標(biāo),由于敵人不能同時出現(xiàn),便設(shè)置了 enemyOutDelay 的倒數(shù)計時,每次屏幕刷新會減少一次計數(shù),直到為 0時就準(zhǔn)備一輛坦克。 本程序設(shè)置的兩次坦克出現(xiàn)的最小間隔為 2秒。 如果玩家已經(jīng)死亡,就需要使用 LayerManager的 insert()將 gameover 字樣插 入到最上層,以免被其他物體覆蓋。 效果如圖 45所示。 在檢測用戶輸入 的input()函數(shù)中,當(dāng)按方向鍵時,玩家坦克就將向不同的方向運行,這調(diào)用了UserSprite 的 go()函數(shù) ;當(dāng)開炮時,就調(diào)用其fire()函數(shù),作出相應(yīng)的行為。 在出現(xiàn)正式畫面前設(shè)置了一個 loading state*字樣的單獨屏幕,調(diào)用了 loadinglevel()函數(shù),并停滯了 圖 46 裝載中的畫面 22 1500 毫秒,提示用戶做好準(zhǔn)備。 效果如圖 46所示 。 在繪圖的 render()過程中,除了要重繪坦克、地圖、子彈外,還會 在右邊空白處繪出一個生命統(tǒng)計欄。并反 復(fù)使用 Graphics 的 drawLine()、drawImage()繪畫出一個三維的效果,增強視覺感。該三維欄的上方為白色,下方為黑色,就創(chuàng)造了立體感。 在每次刷新繪圖頁面時,應(yīng)使用 GameCanvas的 flushGraphics()將屏 幕后臺的緩沖區(qū)內(nèi)的圖象刷新到前臺來。 在允許敵人出現(xiàn)前,需要檢測給即將出現(xiàn)的敵人分配一個數(shù)組序號。在程序中調(diào)用了getNullEnemyIndex()進行測試,當(dāng)返回為 1 時說明沒有序號可以分配,否則,將返回空的序號。 游戲 的最終運行狀態(tài)如圖 47所示。 坦克的共同行為 在 TankSprite 中定義了所有坦克 (包括敵方坦克和玩家坦克 )的共同行為和屬性。 EnemeySprite和 UserSprite 都繼承了該類以簡化結(jié)構(gòu)。 在transformDirection[]中定義了坦克四個方向分別應(yīng)將原始圖片旋轉(zhuǎn)的角度,分別為TRANS_NONE,TRANS_ROT90,TRANS_ROT180,TRANS_ROT270,以便在后來的 setTransform()中將這些常量代入。 構(gòu)造函數(shù)中創(chuàng)建了每個坦克必須擁有的一顆子彈,這些子彈就將只跟隨自己的坦克調(diào)動。 為了能提前預(yù)測碰撞,調(diào)用了 defineCollisionRectangle(0,1,11,12)將碰撞矩形向前設(shè)置了一個象素,具體原理見第二章。 在 setBulletDirection()中,將根據(jù)坦克當(dāng)前的方向確定子彈出膛后的方向,其中 setRefPixelPosition()將子彈的參考點設(shè)置在其未變形狀態(tài)的底部,setXY()將其放置到炮口的位置, setTransform()將其圖片方向轉(zhuǎn)到需要使用的位置。 canPass()函數(shù)將返回坦克是否能夠向前前進, 考慮到的因素有邊界、障礙物。它返回一個 boolean 值,提供給 go()函數(shù),做進一步的判斷。 getTileIndex()將檢測傳遞來的象素處是什么類型的障礙物,它將象素除以 8(即障礙物的象素寬度 ),取整,再通過 getCell()得到。 在得到障礙物屬性后,判斷其
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1