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

正文內(nèi)容

畢業(yè)設(shè)計(jì)基于j2me的手機(jī)游戲設(shè)計(jì)-文庫吧資料

2025-06-26 13:10本頁面
  

【正文】 用read()函數(shù)可將流中的下一個(gè)字節(jié)讀出,并返回此字節(jié)代表的整數(shù)。地圖由外部文件讀入。 構(gòu)造函數(shù)中,需初始化地圖。 其他,如Sprite類的gameover字樣、記分統(tǒng)計(jì)畫面也都需在此主邏輯中建立相應(yīng)對象。BattleCanvas包括了LayerManager,這樣所有靜態(tài)和動(dòng)態(tài)的圖象都不需要手動(dòng)刷新,只需要在LayerManager中加入所有的需控制的元素,再統(tǒng)一由LayerManager刷新即可。它們分別為:EnemySprite和UserSprite。其主邏輯如圖43所示。刷新速度需大于30/秒才能使畫面顯示因人眼的暫時(shí)停留效應(yīng)流暢運(yùn)行。 主游戲邏輯及其涉及到的若干類開始敵人小于0 顯示記分畫面最后一關(guān)?進(jìn)入下一關(guān)敵人數(shù)量大于屏幕上的數(shù)量嗎?增加一個(gè)敵人玩家是否死亡顯示GameOver重繪屏幕內(nèi)存回收結(jié)束YNYNNYYN BattleCanvas類主要關(guān)系流程圖 BattleCanvas主管著所有類之間的協(xié)調(diào),決定何時(shí)死亡,何時(shí)分配新的敵人,及控制敵人出現(xiàn)處的閃光圖標(biāo)、游戲結(jié)束后的動(dòng)態(tài)Gameover字樣。getSelectIndex()可檢測到選擇的項(xiàng)目的序號(hào),序號(hào)從0開始遞增。鍵盤事件中,可用getCommandType()返回的Command類型來確定選擇的是什么按鈕。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。 使用說明畫面startChoice繼承了接口mandListener,這樣,就可以使用高級(jí)界面的Command按鈕。但是當(dāng)顯示的畫面元素超過一屏大小時(shí),將自動(dòng)轉(zhuǎn)換為永久狀態(tài)。Alert對象用于顯示提示、警告等告之用戶信息的臨時(shí)閃現(xiàn)的屏幕,它可作為setCurrent的參數(shù),提前顯示在最終需要顯示的屏幕前。在startApp()函數(shù)中,隨即調(diào)用了Displable的setCurrent()函數(shù)將當(dāng)前屏幕設(shè)置為startChoice。運(yùn)行畫面如圖41所示。)、結(jié)束的函數(shù)。它控制著整個(gè)程序的運(yùn)行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。具體算法的代碼實(shí)現(xiàn)和詳細(xì)流程將在下章介紹。 內(nèi)存監(jiān)視器 本章小結(jié) 第三章中介紹了程序的流程、相關(guān)技術(shù)的思想及其在本程序中的應(yīng)用。由于Java語言中,不像許多其他的如C++語言,不需要指定回收函數(shù)中特定不使用的資源,資源回收機(jī)制將自動(dòng)清空無效變量占用的空間。如圖34,是內(nèi)存跟蹤測試隨時(shí)間變化的調(diào)試器。 模擬器的相關(guān)調(diào)試 IDE整合的Wireless Tool Kit提供了許多在運(yùn)行時(shí)監(jiān)視運(yùn)行狀態(tài)的工具。為了能與各種IDE集成,就像Java2 SDK一樣,混淆器采用命令行參數(shù)的形式,以便可被其調(diào)用。由于以上介紹的減少變量、函數(shù)的命名長度的關(guān)系?;煜鲗⒋a中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰挠⑽淖帜复?hào),如果缺乏相應(yīng)的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。如果不加以施行有效的措施,將造成嚴(yán)重的后果。從而不能保護(hù)作者的知識(shí)成果。 混淆器(Obfuscator)的使用Java 語言并沒有完全編譯成二進(jìn)制可執(zhí)行文件,需要虛擬機(jī)來執(zhí)行。第三是減少圖形數(shù)據(jù)的大小。所有這些可以借助混淆器來幫助實(shí)現(xiàn)。其方法有:第一,就是盡量縮短命名的長度。 內(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è)上限對每種手機(jī)都不一樣,大部分在一兩百KB內(nèi)。因?yàn)槊總€(gè)記錄包括用戶名和分?jǐn)?shù),因此需要使用多字段的方式編入。在輸入記錄前,要求用戶在TextField框中寫入他自己的名字。一共可以存儲(chǔ)10條最高分。反之若要讀取數(shù)據(jù),則先要串接一個(gè)DataInputStream對象和ByteArrayInputStream,依字段的數(shù)據(jù)類用readInt()、readBoolean()等方法讀取。方法一中所有的字段只能以字符串的形式存儲(chǔ),要對這些字段作進(jìn)一步的處理非常麻煩。符號(hào)不能和字段內(nèi)的數(shù)據(jù)相同的字符。主要有兩種方法:1. 標(biāo)記法。Record是以字節(jié)為基本單位來存放的,所以所有要寫入record的數(shù)據(jù)都必須先將其轉(zhuǎn)為字節(jié)才能寫入,從record所讀出來的數(shù)據(jù)也是字節(jié),必須將其轉(zhuǎn)換為原先寫入時(shí)的數(shù)據(jù)類型才有意義。區(qū)別記錄的唯一標(biāo)記是他們的ID值,作為記錄集的主鍵。記錄是字節(jié)數(shù)組。RecordStore的API采用了時(shí)間戳的概念,其長整型變量由System的currentTimeMillis()函數(shù)返回決定。訪問模式會(huì)在準(zhǔn)備提供共享的RecordStore被建立時(shí)被創(chuàng)建。當(dāng)MIDlet包從平臺(tái)中被移除后,所有與該包有關(guān)的的記錄集都同時(shí)會(huì)被移除。RMS包中包括RecordStore類。微小的存儲(chǔ)空間也限制了它們的結(jié)構(gòu)不能過于復(fù)雜。 RMS數(shù)據(jù)庫系統(tǒng)MIDP為MIDlets提供了一種永久存儲(chǔ)和后來讀出數(shù)據(jù)的數(shù)據(jù)庫解決方案,被稱為Record Managerment System(RMS),是一種類簡單的基于記錄的數(shù)據(jù)庫。子彈對不同障礙物將有不同的反映。玩家的子彈需要在每一步檢測所有敵人的子彈的運(yùn)行狀態(tài)。其次,子彈之間需要檢測是否碰撞。分為兩種情況,如果此子彈來自于敵方,將只檢測玩家坦克,因?yàn)閿撤街g的子彈必須允許可以透明的穿過,以保證不會(huì)在敵人之間發(fā)生子彈的消減。在其出現(xiàn)在屏幕上的運(yùn)行周期中,每一步都需要循環(huán)檢測以下條件:是否與某坦克發(fā)生了碰撞,即擊中了這輛坦克。 子彈的運(yùn)行和控制每一個(gè)坦克都有他自己的一顆子彈,這顆子彈在任何一輛坦克被構(gòu)造時(shí)就一直存在,直至此坦克生命的結(jié)束,子彈的再次只是將屏幕上暫時(shí)掩蓋的圖象重新置于坦克炮筒才恰當(dāng)位置,并使其顯示出來,這與現(xiàn)實(shí)中每個(gè)子彈都是單獨(dú)的個(gè)體有所不同。這是允許的,但需要對他們標(biāo)注狀態(tài),即當(dāng)坦克剛出現(xiàn)時(shí)暫時(shí)允許重合,一旦在某個(gè)時(shí)間他們脫離了重合狀態(tài),就不能在允許重合,如果不設(shè)置這樣的判斷,剛出現(xiàn)的坦克將會(huì)因?yàn)槭艿阶枞肋h(yuǎn)不能前進(jìn),坦克將混成一團(tuán)。另外,坦克的發(fā)炮間隔和轉(zhuǎn)后的具體方向都由隨機(jī)數(shù)決定。如果一定發(fā)生轉(zhuǎn)向,試想,當(dāng)敵方碰到玩家時(shí),如果它立即轉(zhuǎn)向,將不會(huì)對玩家發(fā)射射向他的子彈,就不構(gòu)成任何威脅,當(dāng)然,也不能永遠(yuǎn)不轉(zhuǎn)向。敵人可以自動(dòng)行走,但是應(yīng)當(dāng)在以下適當(dāng)?shù)那闆r下轉(zhuǎn)向:首先是是否超出界面的邊界,其次是是否與地圖障礙物發(fā)生了碰撞,再次是是否與用戶坦克發(fā)生了碰撞。如果發(fā)生碰撞,則坦克應(yīng)當(dāng)選擇掉轉(zhuǎn)方向,此時(shí),兩輛碰撞的坦克又因?yàn)槠渚匦螀^(qū)域不重合而不符合collidesWith的條件,就可以繼續(xù)正常運(yùn)行了。在多出的11個(gè)象素中,按照每個(gè)象素依次檢查此象素是否于外界發(fā)生碰撞,如果不是按照象素檢查,則當(dāng)坦克與障礙物錯(cuò)位并同時(shí)與兩種物體接觸時(shí)將有可能忽略檢測其中的一樣物體。因?yàn)槿绻l(fā)生碰撞,collidesWith成立,則兩輛坦克已經(jīng)發(fā)生了圖象重合,違反了規(guī)則,甚至若再進(jìn)行collidesWith判斷的話,其結(jié)果將永為真。Sprite類中提供了collidesWith函數(shù),用于判斷是否與某個(gè)TiledLayer、Sprite、Image的對象有圖象上的重合(即游戲中的碰撞)。同時(shí),這樣的機(jī)制也可檢測到幾個(gè)鍵同時(shí)按下的狀態(tài),從而提供斜向運(yùn)行等相應(yīng)功能。只需要此一個(gè)函數(shù)的返回值就可以返回所有鍵的狀態(tài)。 GameCanvas提供getKeyStates函數(shù)可獲取當(dāng)前鍵盤上的信息。同時(shí),事件的執(zhí)行周期也并不一定適合游戲的場合,也許需要更高頻率執(zhí)行的按鍵卻只能在指定的周期內(nèi)規(guī)律的響應(yīng)。這樣的機(jī)制并不適合某些游戲場合。 坦克的控制和敵方的智能運(yùn)行 。繪制動(dòng)畫時(shí)經(jīng)常需要不斷地更新畫面,而更新畫面的操作就是先將屏幕以fillRect()的方式清除,再將下一張圖片畫在屏幕上,然而反復(fù)的清除及重繪會(huì)造成屏幕的閃爍現(xiàn)象(flicker),因此使用雙重緩沖的好處就是在背景進(jìn)行這個(gè)清除及重繪的操作,再將完成的繪圖拷貝到屏幕上,由于用戶看不到清除的操作,因此就不會(huì)出現(xiàn)閃爍的現(xiàn)象了。Image類提供了一個(gè)建立背景的靜態(tài)方法createImage(int width, int height),再利用getGraphics()方法取得屬于這個(gè)背景的Graphics對象,所進(jìn)行的繪圖操作都會(huì)作用在背景上,等到全部的繪圖操作完成后,再調(diào)用drawImage()方法將背景的數(shù)據(jù)復(fù)制到實(shí)際顯示的屏幕上。 有關(guān)繪圖的一些技術(shù),進(jìn)行游戲繪圖一般需要手動(dòng)編程使用雙緩沖。如果整塊地圖均由繪圖產(chǎn)生,將導(dǎo)致體積迅速增加,且對坦克與障礙物的碰撞也難以檢測。每塊障礙物都有其響應(yīng)的代號(hào),其中,用戶需保護(hù)的總部因?yàn)轶w積稍大,使用了四塊圖象格顯示。多塊格可由大塊同時(shí)替換組合而模擬動(dòng)態(tài)的背景,這不需要逐塊替換所有的靜態(tài)圖象格而顯得非常方便。這項(xiàng)技術(shù)通常應(yīng)用在2D游戲平臺(tái)的滾動(dòng)背景的繪圖。TiledLayer是有一組圖象格元素(grid of cells)組成的整塊虛擬圖象。本程序中的坦克的參考點(diǎn)定義在圖片正中,以便簡便的實(shí)現(xiàn)轉(zhuǎn)向等功能。參考點(diǎn)由defineReferencePixel函數(shù)確定未翻轉(zhuǎn)圖片狀態(tài)時(shí)的坐標(biāo)。在有些情況下,控制主角的翻轉(zhuǎn),尤其是多幅圖片配合顯示的過程,如果將多圖的共享定位點(diǎn)設(shè)置在通常的左上角,將很不容易控制,因?yàn)樵S多翻轉(zhuǎn)都是以其他點(diǎn)為參考電的(比如,中心點(diǎn))。每個(gè)小圖按照其排列順序有相應(yīng)的序號(hào),在程序中調(diào)用其序號(hào),就可以繪制出相應(yīng)的圖片。圖片可翻轉(zhuǎn)、顛倒、由一個(gè)主角圖片就可以方便的得到所有方向的顯示狀態(tài),相比原先只能使用Canvas繪圖,需要將所有方向的主角圖象都繪制在png圖象中簡化了許多。Sprite類是繼承自Layer的用于存儲(chǔ)多楨的基本可視元素。本程序中所有的地圖、坦克都采用LM控制,敵方坦克的生成由附加一個(gè)EnemySprite對象得到。LM中的View Window控制著與LM相對坐標(biāo)的可視區(qū)域。層的序號(hào)相當(dāng)于坐標(biāo)的Z軸,0層表示最接近用戶視覺,層數(shù)越高,離用戶越遠(yuǎn)。它包括了一系列自動(dòng)獲取了代號(hào)和位置的層,簡化了各層加入游戲畫面的過程,提供了自動(dòng)排序和繪制的能力。地圖繪制、主角的動(dòng)態(tài)顯示、按鍵的檢測、圖層的控制等游戲?qū)俚奶匦远嫉玫搅嗽谝苿?dòng)設(shè)備上最大的發(fā)揮。實(shí)現(xiàn)了方便的管理和程序體積的精簡。使用Image類中的createImage函數(shù)可從整圖中分割出所需要的元素。PNG格式圖片中包含許多定義其圖片特性的冗余部分(Chunks)。PNG格式提供透明背景的圖象,這對繪制游戲畫面和被操縱主角極有幫助。其對象會(huì)被傳給Canvas的paint()函數(shù),以便最終顯示。它具有24位深度色彩的繪制能力,以三原色分別各占一個(gè)字節(jié)表示其顏色。本程序中,操縱用戶坦克運(yùn)行的按鍵都定義為游戲控制鍵,這樣便能適應(yīng)所有的機(jī)器。鍵盤事件由鍵代碼指定,但這樣控制游戲會(huì)導(dǎo)致缺乏通用性,并不是每個(gè)設(shè)備的鍵盤布局都適合游戲的操作。從程序開發(fā)的觀點(diǎn)看,Canvas類可與高級(jí)Screen類交互,程序可在需要時(shí)在Canvas中摻入高級(jí)類的組件。載入過程中將對所得分?jǐn)?shù)與以往歷史比較,放置到合適的位置中,形成排序。在每關(guān)的結(jié)束或死亡后都將載入ScoreScreen類,統(tǒng)計(jì)當(dāng)前的分?jǐn)?shù)。圖33是程序中類之間的UML分析圖。在選擇開始后,將運(yùn)行BattleCanvas類中的總流程控制。載入程序后首先啟動(dòng)的是程序介紹的信息畫面。Logo 畫面選項(xiàng)畫面主程序屏幕繪圖本關(guān)記分統(tǒng)計(jì)顯示GameOver顯示歷史記分表About開始敵方需要出坦克時(shí),生成坦克初始化參數(shù)死亡時(shí)符合結(jié)束條件時(shí) 本程序的主流程圖程序?yàn)樾枰瓿瑟?dú)立功能的需顯示的模塊設(shè)置了單獨(dú)的類。以便程序進(jìn)入相關(guān)的分支執(zhí)行相關(guān)的反應(yīng)代碼,結(jié)束游戲或統(tǒng)計(jì)分?jǐn)?shù)等。在屏幕重繪的主程序中,將在每次的循環(huán)中判斷若干事件。用戶坦克自誕生之時(shí)起將擁有一發(fā)子彈,子彈雖然開在單獨(dú)的線程中,但運(yùn)行結(jié)束后(比如撞到相關(guān)物體或敵方坦克時(shí))并不結(jié)束子彈對象,只是將其線程終止。用戶控制的坦克運(yùn)行在主線程中,隨屏幕刷新的頻率而步進(jìn)。運(yùn)行程序后允許用戶選擇執(zhí)行選項(xiàng)菜單,在開始游戲后將先從外部文件載入地圖文件,對背景的所有物體進(jìn)行繪圖。這三種狀態(tài)的轉(zhuǎn)換關(guān)系如圖31所示。消減狀態(tài)(Destroyed)停止?fàn)顟B(tài)(Paused)運(yùn)行狀態(tài)(Active)StartApp()DestroyApp()呼叫MIDlet的構(gòu)造函數(shù)DestroyApp()PauseApp() MIDlet的流程。 程序流程MIDlet suite是MIDP應(yīng)用程序的最小單位,JAM負(fù)責(zé)將手機(jī)內(nèi)的MIDlet suite以圖形化的方式呈現(xiàn),讓用戶能夠選取欲執(zhí)行的MIDlet suite,一旦選取了某個(gè)MIDlet suite,操作系統(tǒng)就會(huì)激活KVM執(zhí)行里面的MIDlet。除開發(fā)過程中對結(jié)構(gòu)上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(Obfuscator)進(jìn)行程序打包后的優(yōu)化。其數(shù)據(jù)庫結(jié)構(gòu)較為簡單,被稱之為RMS系統(tǒng)。記錄分?jǐn)?shù)的存儲(chǔ)方式也需要有較好的解決方案。8. 用戶運(yùn)行游戲時(shí)需要有分?jǐn)?shù)記錄的可能。否則,不僅難于控制和處理過多的元素,也會(huì)因過多的大型圖片而不能限制程序的大小,失去手機(jī)上程序的原則和Java的優(yōu)勢。良好的用戶界面更是吸引用戶的硬指標(biāo),相關(guān)的美術(shù)構(gòu)圖也需要有一定的考慮。每一次刷新頁面、每前進(jìn)一步都需要將所有的周圍環(huán)境都進(jìn)行掃描。如此過多的線程同時(shí)在本來效率就不高的KVM虛擬機(jī)上運(yùn)行,也許會(huì)導(dǎo)致程序的緩慢。這需要對所有的對象有較好的控制。4. 對于雙方坦克發(fā)出的子彈的控制也需要對其跟蹤控制,子彈也需要處在獨(dú)立的線程中。Java的多線程能力為實(shí)現(xiàn)這樣的游戲提供了可能。2. 游戲中為了美觀,適用性強(qiáng),可能需要采用外部文件引入的圖片貼圖,有關(guān)貼圖,使得解決靜態(tài)或動(dòng)態(tài)、畫面背景、屏幕刷新的雙緩沖等都有較好的解
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1