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

正文內(nèi)容

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

2024-11-17 21:54本頁(yè)面

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

  

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