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

正文內(nèi)容

坦克大戰(zhàn)設(shè)計報告(編輯修改稿)

2025-08-30 11:05 本頁面
 

【文章內(nèi)容簡介】 置為 startChoice。圖 游戲前的選項畫面 圖 使用說明畫面startChoice 繼承了接口 mandListener,這樣,就可以使用高級界面的Command 按鈕。繼承了 mandListener 的類必須擁有 mandAction(),以決定對按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。在設(shè)置好mandlistener 后,需要調(diào)用 setCommandListener()以將按鈕事件激活。鍵盤事件中,可用 getCommandType()返回的 Command 類型來確定選擇的是什么按鈕。startChoice 繼承了 List 類,用于顯示列表選項,使用其 append()函數(shù)可將選項加入到列表中。getSelectIndex()可檢測到選擇的項目的序號,序號從 0 開始遞增。其中,當(dāng)選擇第一項時將載入正式游戲畫面 BattleCanvas 類,第二項將顯示幫助信息( 效果如圖 ),第三項則是重新顯示與作品和作者相關(guān)的 logo 畫面。 主游戲邏輯及其涉及到的若干類 BattleCanvas 主管著所有類之間的協(xié)調(diào),決定何時死亡,何時分配新的敵人,及控制敵人出現(xiàn)處的閃光圖標(biāo)、游戲結(jié)束后的動態(tài) Gameover 字樣。它運行在獨立的線程中,以恒定的頻率刷新畫面。刷新速度需大于 30/秒才能使畫面顯示因人眼的暫時停留效應(yīng)流暢運行。本程序設(shè)置為 20 毫秒。其主邏輯如圖 44 所示。程序中建立了另外的兩個類,分別表述了敵人坦克和玩家坦克的功能。它們分別為:EnemySprite 和 UserSprite。這兩個類均在 BattleCanvas 中建立了對象,以便進(jìn)行統(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()將整幅地圖畫出即可。地圖文件可用十六進(jìn)制的文本編輯器生成,如本程序使用的 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ù)的畫面,為了進(jìn)入下一關(guān),統(tǒng)計畫面只是停留四秒,就重新轉(zhuǎn)回 BattleCanvas 畫面。當(dāng)然,如果當(dāng)前已是最后一關(guān),就不會再轉(zhuǎn)回。進(jìn)入下一關(guān)時,許多變量需要重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家坦克的當(dāng)前位置。如果游戲未結(jié)束,則需判斷屏上坦克是否已小于還剩坦克的總數(shù),如果是這樣,就需要再提供一輛坦克。提供新坦克之前,在屏幕上設(shè)置了一個專用指圖 游戲結(jié)束的畫面示的閃光符號,它繼承了 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 字樣的圖片覆蓋到最上層,效果如圖 所示。在檢測用戶輸入的 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ù),并停滯了 1500 毫秒,提示用戶做好準(zhǔn)備。效果如圖 所示。在繪圖的 render()過程中,除了要重繪坦克、地圖、子彈外,還會在右邊空白處繪出一個生命統(tǒng)計欄。并反復(fù)使用 Graphics 的 drawLine()、drawImage()繪畫出一個三維的效果,增強(qiáng)視覺感。該三維欄的上方為白色,下方為黑色,就創(chuàng)造了立體感。在每次刷新繪圖頁面時,應(yīng)使用 GameCanvas 的 flushGraphics()將屏幕后臺的緩沖區(qū)內(nèi)的圖象刷新到前臺來。在允許敵人出現(xiàn)前,需要檢測給即將出現(xiàn)的敵人分配一個數(shù)組序號。在程圖 裝載中的畫面序中調(diào)用了 getNullEnemyIndex()進(jìn)行測試,當(dāng)返回為1 時說明沒有序號可以分配,否則,將返回空的序號。游戲的最終運行狀態(tài)如圖 所示。 坦克的共同行為在 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)動。相關(guān)代碼:private static int transformDirection[]= { TRANS_NONE,TRANS_ROT90,TRANS_ROT180,TRANS_ROT270 }。 private int currentDirection=0。 //if no direction defined,it will //stay where it is. public BulletSprite(Image image) throws IOException{ super(image)。 defineReferencePixel(1, 3)。 //center and bottom of the bullet }圖 游戲運行中的模擬器畫面為了能提前預(yù)測碰撞,調(diào)用了 defineCollisionRectangle(0,1,11,12)將碰撞矩形向前設(shè)置了一個象素,具體原理見第二章。在 setBulletDirection()中,將根據(jù)坦克當(dāng)前的方向確定子彈出膛后的方向,其中 setRefPixelPosition()將子彈的參考點設(shè)置在其未變形狀態(tài)的底部,setXY()將其放置到炮口的位置,setTransform() 將其圖片方向轉(zhuǎn)到需要使用的位置。canPass()函數(shù)將返回坦克是否能夠向前前進(jìn),考慮到的因素有邊界、障礙物。它返回一個 boolean 值,提供給 go()函數(shù),做進(jìn)一步的判斷。getTileIndex()將檢測傳遞來的象素處是什么類型的障礙物,它將象素除以 8(即障礙物的象素寬度) ,取整,再通過 getCell()得到。在得到障礙物屬性后,判斷其序號是否與草相同,或是否為空(序號為 0)。因為所有的障礙物中只有草不會阻礙坦克的向前運行。 玩家坦克的功能屬性 構(gòu)造函數(shù)中需要將坦克方向設(shè)置為向上,因為剛出現(xiàn)時就是這樣的狀態(tài)。當(dāng)開炮時,調(diào)用 BulletSprite 的 setLayerManager()將子彈與 layerManager 聯(lián)系起來。需要聯(lián)系的還有自身坦克、地圖。這些都由坦克傳遞給子彈。因為子彈是屬于坦克的,它的屬性需要跟當(dāng)前的坦克保持一致。接著使用 append()將子彈貼到 layerManager 上顯示出來。最終調(diào)用其 start()開始子彈自己的線程。子彈一旦開始運行,就脫離
點擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1