版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
學(xué)習(xí)情境手機(jī)游戲的控制第一頁(yè),共四十一頁(yè),編輯于2023年,星期二能力目標(biāo)能熟練實(shí)現(xiàn)線程、啟動(dòng)和停止線程以及合理控制線程的執(zhí)行;使用脫屏畫(huà)布實(shí)現(xiàn)繪制雙緩沖區(qū)技術(shù);能熟練地制作進(jìn)度條;學(xué)會(huì)使用getInstance()的方法獲得對(duì)象實(shí)例;能熟練地在Displayable界面中加入所需按鈕,移除不需要的按鈕;能在代碼中使用if語(yǔ)句或switch語(yǔ)句區(qū)分不同的按鈕,以實(shí)現(xiàn)不同的功能;完成從菜單進(jìn)入相應(yīng)游戲界面,再?gòu)挠螒蚪缑娣祷夭藛蔚牟僮鳎徽_實(shí)現(xiàn)游戲的開(kāi)始、暫停、繼續(xù)、重玩和返回功能;能快速搭建起手機(jī)游戲的制作框架。第二頁(yè),共四十一頁(yè),編輯于2023年,星期二認(rèn)知目標(biāo)了解多線程的概念以及線程的四種狀態(tài);理解可變圖像和不可變圖像的區(qū)別;識(shí)記創(chuàng)建脫屏畫(huà)布、獲取脫屏畫(huà)筆的方法;了解對(duì)象池的概念,理解制作進(jìn)度條的核心思想;了解MIDP框架中對(duì)事件的處理機(jī)制,熟記實(shí)現(xiàn)事件處理的三個(gè)步驟;識(shí)記CommandListener事件監(jiān)聽(tīng)器的注冊(cè)方法和在該監(jiān)聽(tīng)器接口中定義的commandAction()方法;了解ItemStateListener和ItemCommandListener事件監(jiān)聽(tīng)器的注冊(cè)方法和實(shí)現(xiàn)方法;理解游戲狀態(tài)變量在游戲控制中發(fā)揮的作用。第三頁(yè),共四十一頁(yè),編輯于2023年,星期二3.1學(xué)習(xí)情境描述在游戲開(kāi)始前,通常需要完成對(duì)資源的加載操作,載入資源會(huì)出現(xiàn)一定的等待時(shí)間。在游戲中,通常使用進(jìn)度條的方式來(lái)提示用戶:“正在進(jìn)行資源載入,請(qǐng)耐心等待!”。在從菜單進(jìn)入游戲界面,以及在游戲過(guò)程中界面之間的切換、游戲進(jìn)程的“開(kāi)始”、“暫?!薄ⅰ袄^續(xù)”、“返回”、“退出”等,則通常使用按鈕的方式實(shí)現(xiàn)對(duì)用戶操作的響應(yīng)。在一款手機(jī)游戲中,存在很多關(guān)于游戲的控制環(huán)節(jié)。本學(xué)習(xí)情境分為四個(gè)學(xué)習(xí)單元來(lái)完成。單元一,響應(yīng)菜單命令;單元二,使用線程控制游戲進(jìn)程;單元三,制作游戲加載進(jìn)度條;單元四,搭建手機(jī)游戲制作框架。第四頁(yè),共四十一頁(yè),編輯于2023年,星期二3.2響應(yīng)菜單命令在游戲屏幕的左下角或右下角通常會(huì)有一些類似“確定”、“取消”、“退出”、“返回”等操作的提示,稱之為“功能按鈕”。用戶通過(guò)按下鍵盤(pán)上的“左上”或“右上”功能鍵來(lái)響應(yīng)這些“功能按鈕”。使可視界面組件“活”起來(lái),使之具備與用戶交互的能力,成為用戶與手機(jī)游戲溝通的橋梁?!肮δ馨粹o”可以是Command組件構(gòu)造的,也可以是一個(gè)繪制的圖片,當(dāng)然也可以是直接“寫(xiě)”上去的提示文字。本學(xué)習(xí)單元的主要任務(wù):在游戲界面上添加各種形式的按鈕,并通過(guò)這些“功能按鈕”,從菜單項(xiàng)進(jìn)入到游戲界面,再?gòu)挠螒蚪缑娣祷氐街鞑藛?。第五?yè),共四十一頁(yè),編輯于2023年,星期二事件:一個(gè)事件描述了一個(gè)對(duì)象狀態(tài)的改變。例如:點(diǎn)擊按鈕。事件源:產(chǎn)生事件的對(duì)象。當(dāng)這個(gè)對(duì)象的內(nèi)部狀態(tài)改變時(shí),事件就會(huì)產(chǎn)生。事件監(jiān)聽(tīng)器:當(dāng)一個(gè)事件發(fā)生時(shí),對(duì)事件做出響應(yīng)的對(duì)象。在對(duì)應(yīng)的事件監(jiān)聽(tīng)器模型中,事件源和事件監(jiān)聽(tīng)器是通過(guò)注冊(cè)聯(lián)系在一起的。一個(gè)事件源必須注冊(cè)一個(gè)事件監(jiān)聽(tīng)器,這樣當(dāng)事件發(fā)生時(shí),系統(tǒng)會(huì)自動(dòng)傳遞事件,調(diào)用事件監(jiān)聽(tīng)器中定義的方法來(lái)處理事件。在java.microedition.lcdui包中共定義了三種事件監(jiān)聽(tīng)器,以接口的形式存在,分別為:CommandListener、ItemStateListener和ItemCommandListener。
CommandListener事件監(jiān)聽(tīng)器事件源:Displayable對(duì)象(而不是Command按鈕)。注冊(cè)方法:setCommandListener(CommandListenerl)接口方法:publicvoidcommandAction(Commandc,Displayabled)ItemStateListener事件監(jiān)聽(tīng)器事件源:Form類及其擴(kuò)展類。注冊(cè)方法:setItemStateListener(ItemStateListenerl)接口方法:publicvoiditemStateChanged(Itemitem)
ItemCommandListener事件監(jiān)聽(tīng)器事件源:Item類的子類。注冊(cè)方法:setItemCommandListener(ItemCommandListenerl)接口方法:publicvoidCommandAction(Commandcommand,Itemitem)3.2.2知識(shí)準(zhǔn)備:事件處理總之,在MIDP框架中實(shí)現(xiàn)事件處理需要做如下三件事情:在類定義中加入implements子句,表示在該類中要實(shí)現(xiàn)接口。注冊(cè)事件監(jiān)聽(tīng)器。實(shí)現(xiàn)接口中的方法,完成對(duì)事件的處理。第六頁(yè),共四十一頁(yè),編輯于2023年,星期二3.2.3任務(wù)一:使用Command按鈕響應(yīng)菜單命令
第七頁(yè),共四十一頁(yè),編輯于2023年,星期二知識(shí)提煉:Command界面組件Command組件的構(gòu)造方法如下:publicCommand(Stringlabel,intcommandType,intpriority)參數(shù)說(shuō)明:label:標(biāo)簽字符串,表示顯示在按鈕或菜單上的文字。commandType:按鈕類型。分別為SCREEN、BACK、CANCEL、OK、HELP、STOP、EXIT和ITEM。請(qǐng)注意這些類型常量?jī)H僅提供一個(gè)標(biāo)識(shí),并不會(huì)真正實(shí)現(xiàn)相應(yīng)功能,具體功能需要通過(guò)代碼來(lái)實(shí)現(xiàn)。priority:優(yōu)先權(quán)。值越小代表優(yōu)先權(quán)越高,1代表最高優(yōu)先權(quán)。如果存在多個(gè)按鈕需要布局在窗體上,其布局位置根據(jù)優(yōu)先權(quán)決定。但實(shí)際的布局位置由設(shè)備決定。多于兩個(gè)以上的按鈕將構(gòu)成菜單。如果兩個(gè)按鈕類型相同,則優(yōu)先權(quán)的取值應(yīng)不同。在Displayable界面中加入Command組件的方法如下:publicvoidaddCommand(Commandcommand)參數(shù)command為事先定義好的Command組件實(shí)例。第八頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示如果一個(gè)Displayable對(duì)象注冊(cè)了CommandListener事件監(jiān)聽(tīng)器,那么,點(diǎn)擊該Displayable界面上的所有Command按鈕都會(huì)觸發(fā)同一個(gè)commandAction()方法的執(zhí)行,因此在該方法中通常要用if語(yǔ)句或switch語(yǔ)句來(lái)區(qū)分不同的按鈕,以實(shí)現(xiàn)不同的功能。區(qū)分方法有多種,比如:if(command.getCommandType()==Command.EXIT){}該方法是通過(guò)在定義按鈕時(shí)設(shè)定的按鈕類型來(lái)區(qū)分各按鈕。請(qǐng)注意,如果同類型按鈕有多個(gè),該法就不適用了。if(command.getLabel().equals("Exit")){}該方法是通過(guò)按鈕表面的提示文字來(lái)區(qū)分各按鈕。if(command==cmdExit){}該方法是通過(guò)使用事先定義好的按鈕名稱來(lái)區(qū)分各按鈕。第九頁(yè),共四十一頁(yè),編輯于2023年,星期二3.2.4延伸任務(wù):返回主菜單第十頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示MIDlet類實(shí)例是在手機(jī)游戲運(yùn)行前,由系統(tǒng)構(gòu)造的,在游戲運(yùn)行期間是唯一的。也就是說(shuō),MIDlet類實(shí)例不能由用戶構(gòu)造。因此,在本任務(wù)中,通過(guò)聲明一個(gè)靜態(tài)的MIDlet類實(shí)例instance,并在構(gòu)造方法中進(jìn)行實(shí)例化。這樣,就可以在其他類中直接通過(guò)MIDlet類的類名進(jìn)行調(diào)用。在手機(jī)這樣的資源受限設(shè)備中,要嚴(yán)格控制使用new方法實(shí)例化對(duì)象的次數(shù)。而且使用new方法生成的兩個(gè)對(duì)象實(shí)際上是兩個(gè)獨(dú)立的個(gè)體,在操作上不會(huì)實(shí)現(xiàn)同步。因此,在本任務(wù)中,通過(guò)構(gòu)造方法參數(shù)來(lái)傳遞返回對(duì)象,將需要返回的界面(myMenu)作為參數(shù),傳遞到About類對(duì)象中。這樣,在進(jìn)入About界面前,和從About界面返回后,顯示的是同一個(gè)菜單界面實(shí)例。這一點(diǎn),可以從返回前后,當(dāng)前菜單項(xiàng)都是“關(guān)于游戲”得到驗(yàn)證第十一頁(yè),共四十一頁(yè),編輯于2023年,星期二3.2.5任務(wù)二:使用圖片或文字按鈕響應(yīng)菜單命令第十二頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示
Command組件構(gòu)造的“功能按鈕”可以加在所有Displayable類的子類上,包括高級(jí)界面組件和低級(jí)界面組件。響應(yīng)這類按鈕需要由Displayable對(duì)象注冊(cè)一個(gè)CommandListener事件監(jiān)聽(tīng)器,然后通過(guò)實(shí)現(xiàn)在該接口中定義的commandAction()方法進(jìn)行按鈕的響應(yīng)。而由圖片和文字構(gòu)造的“功能按鈕”只能加在低級(jí)界面(Canvas和GameCanvas)上。在實(shí)際的游戲開(kāi)發(fā)中,設(shè)計(jì)并使用與游戲整體風(fēng)格相適應(yīng)的圖片或文字按鈕,會(huì)使游戲界面更加美觀、更具個(gè)性。當(dāng)用戶按下鍵盤(pán)上的“左上”或“右上”功能鍵去響應(yīng)這類按鈕時(shí),系統(tǒng)會(huì)自動(dòng)響應(yīng),并調(diào)用相應(yīng)的按鍵處理方法(比如:keyPressed()方法)進(jìn)行處理。第十三頁(yè),共四十一頁(yè),編輯于2023年,星期二3.3使用線程控制游戲進(jìn)程游戲有一定的幀頻,需要通過(guò)線程來(lái)控制。在本學(xué)習(xí)單元中,首先,通過(guò)多閃屏的實(shí)現(xiàn),來(lái)學(xué)習(xí)使用線程;然后,再對(duì)游戲時(shí)間進(jìn)行倒計(jì)時(shí)的控制,進(jìn)一步熟悉線程;最后,對(duì)線程進(jìn)行深入使用,實(shí)現(xiàn)對(duì)游戲的開(kāi)始、暫停、繼續(xù)和重玩的控制。第十四頁(yè),共四十一頁(yè),編輯于2023年,星期二3.3.2知識(shí)準(zhǔn)備:了解多線程多線程允許在程序中并發(fā)執(zhí)行多個(gè)處理流程,每個(gè)處理流程都成為一個(gè)線程,彼此間相互獨(dú)立。多線程的好處在于可以提高CPU的利用率。但也必須認(rèn)識(shí)到使用多線程可能帶來(lái)的不利因素,比如:線程也是程序,需要占用內(nèi)存。多線程需要協(xié)調(diào)和管理,線程太多會(huì)導(dǎo)致控制太復(fù)雜。線程之間對(duì)共享資源的訪問(wèn)會(huì)產(chǎn)生沖突。第十五頁(yè),共四十一頁(yè),編輯于2023年,星期二3.3.3任務(wù)三:實(shí)現(xiàn)多閃屏第十六頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示1:線程的實(shí)現(xiàn)在Java中實(shí)現(xiàn)線程有兩種途徑:繼承java.lang.Thread類,然后改寫(xiě)run()方法實(shí)現(xiàn)java.lang.Runnable接口,實(shí)現(xiàn)接口中的run()方法由于Java語(yǔ)言不支持多繼承,所以繼承java.lang.Thread類的方法有一個(gè)最大的缺點(diǎn)就是不能再繼承其他的類。而實(shí)現(xiàn)java.lang.Runnable接口的方法只需在已有類的基礎(chǔ)之上多實(shí)現(xiàn)一個(gè)run()方法,沒(méi)有其他多余的負(fù)擔(dān)。因此建議多使用該方法實(shí)現(xiàn)線程。第十七頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示2:線程的啟動(dòng)和停止啟動(dòng)線程:Threadt=newThread(this);t.start();停止線程:正常情況下,run()方法返回時(shí),線程自動(dòng)停止。調(diào)用stop()或destroy()方法也可使線程停止,但會(huì)產(chǎn)生異常,且不會(huì)釋放同步資源,所以不推薦使用。第十八頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示3:線程的控制在run()方法中,線程通常使用一個(gè)while循環(huán)來(lái)控制。在循環(huán)的開(kāi)始,獲取一次循環(huán)的開(kāi)始時(shí)間(st)。循環(huán)的最后,獲取本次循環(huán)的結(jié)束時(shí)間(et)。如果結(jié)束時(shí)間和開(kāi)始時(shí)間的差值(diff=et-st),小于每一幀的指定時(shí)間(rate),就讓線程休眠一個(gè)(rate-diff)的差值時(shí)間。這樣可以強(qiáng)制使每一幀運(yùn)行時(shí)間固定,避免游戲產(chǎn)生忽快忽慢的晃動(dòng)感覺(jué)。第十九頁(yè),共四十一頁(yè),編輯于2023年,星期二3.3.4任務(wù)四:實(shí)現(xiàn)游戲時(shí)間的倒計(jì)時(shí)第二十頁(yè),共四十一頁(yè),編輯于2023年,星期二知識(shí)提煉:脫屏畫(huà)布脫屏畫(huà)布其實(shí)就是通常所說(shuō)的繪制雙緩沖區(qū)技術(shù),是計(jì)算機(jī)動(dòng)畫(huà)的一項(xiàng)傳統(tǒng)技術(shù)。在動(dòng)畫(huà)制作中,造成屏幕閃爍的主要原因在于,畫(huà)面在顯示動(dòng)畫(huà)的同時(shí),程序又在改變它。如何解決這個(gè)矛盾呢?通常的做法是在內(nèi)存開(kāi)辟一片區(qū)域作為后臺(tái)畫(huà)面,程序?qū)λM(jìn)行更新、修改,完成后再在屏幕上顯示它。創(chuàng)建、使用脫屏畫(huà)布的關(guān)鍵步驟如下:(1)創(chuàng)建脫屏畫(huà)布Imagebuffer;buffer=Image.createImage(SCREENWIDTH,SCREENHEIGHT);(2)獲取脫屏畫(huà)筆GraphicsoffG=buffer.getGraphics();(3)改變脫屏畫(huà)布內(nèi)容offG.drawXXX();(4)將脫屏畫(huà)布內(nèi)容顯示到屏幕上g.drawImage(buffer,0,0,g.LEFT|G.TOP);第二十一頁(yè),共四十一頁(yè),編輯于2023年,星期二3.3.4任務(wù)五:
控制游戲的開(kāi)始、暫停、繼續(xù)、重玩和返回游戲進(jìn)行中游戲暫停游戲結(jié)束第二十二頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示游戲的運(yùn)行與停止、暫停與繼續(xù),分別通過(guò)一個(gè)開(kāi)關(guān)變量來(lái)控制。在程序中,使用了boolean型變量isRun表示游戲是否進(jìn)行中,變量isPause表示游戲是否暫停。在run()方法中,使用isRun變量作為while循環(huán)的條件,當(dāng)游戲沒(méi)有暫停的時(shí)候(!isPause),實(shí)現(xiàn)正常的游戲功能。當(dāng)按下“暫停”按鈕時(shí),設(shè)置isPause變量的值為true。此時(shí)while循環(huán)中的if(!isPause)條件就不再成立,下面的語(yǔ)句也就不再執(zhí)行。但while循環(huán)還在繼續(xù),線程并沒(méi)有結(jié)束。當(dāng)按下“繼續(xù)”按鈕時(shí),isPause變量的值又變?yōu)閒alse,if(!isPause)條件成立,繼續(xù)游戲。當(dāng)gameTime變量小于等于0時(shí),設(shè)置isRun變量值為false,此時(shí)while循環(huán)結(jié)束,線程也隨之停止,游戲結(jié)束,顯示“重玩”按鈕。當(dāng)按下“重玩”按鈕時(shí),調(diào)用init()方法重新初始化游戲,重新開(kāi)始線程。第二十三頁(yè),共四十一頁(yè),編輯于2023年,星期二3.3.6知識(shí)拓展:了解MIDlet的生命周期
Java應(yīng)用管理器(JAM)是管理Java應(yīng)用的機(jī)制,它負(fù)責(zé)將MIDlet裝載進(jìn)來(lái),生成一個(gè)MIDlet對(duì)象實(shí)例。該對(duì)象的生命周期完全由JAM控制。MIDlet應(yīng)用程序的構(gòu)造方法僅被JAM調(diào)用一次,開(kāi)發(fā)人員不能通過(guò)new方法隨時(shí)調(diào)用。通常將需要在程序啟動(dòng)時(shí)執(zhí)行一次且只執(zhí)行一次的操作放在構(gòu)造方法中,用來(lái)初始化MIDlet狀態(tài)。一個(gè)MIDle對(duì)象有三種狀態(tài):運(yùn)行狀態(tài)、暫停狀態(tài)和終止?fàn)顟B(tài)。
MIDlet類中聲明了三個(gè)抽象方法:
startApp():用于啟動(dòng)或重新啟動(dòng)一個(gè)MIDlet。該方法可以被系統(tǒng)在任何時(shí)候調(diào)用,其目的是請(qǐng)求或重新請(qǐng)求運(yùn)行MIDlet所需要的資源。
pauseApp():用于暫停一個(gè)MIDlet的運(yùn)行,以釋放此MIDlet占用的資源而用于其他MIDlet的運(yùn)行。
destroyApp():在MIDlet即將被撤消時(shí)由系統(tǒng)調(diào)用,也可由MIDlet自身間接調(diào)用,其目的是在MIDlet撤消前釋放該MIDlet所占資源
需要說(shuō)明的是,這三個(gè)方法體默認(rèn)都是空的,想要實(shí)現(xiàn)開(kāi)始、暫停和釋放資源的功能,需要用戶自行添加相應(yīng)的功能代碼。
JAM通過(guò)調(diào)用startApp()使MIDlet進(jìn)入開(kāi)始狀態(tài),調(diào)用pauseApp()使MIDlet進(jìn)入暫停狀態(tài),調(diào)用destroyApp()使MIDlet進(jìn)入終止?fàn)顟B(tài)。需要說(shuō)明的是,這三個(gè)方法體默認(rèn)都是空的,想要實(shí)現(xiàn)開(kāi)始、暫停和釋放資源的功能,需要用戶自行添加相應(yīng)的功能代碼。
MIDlet類中還定義了notify系列函數(shù),用于請(qǐng)求狀態(tài)的轉(zhuǎn)換。notifyPaused():MIDlet可以使用該方法通知JAM,MIDlet對(duì)象將自動(dòng)進(jìn)入暫停狀態(tài)。resumeRequest():調(diào)用該方法可以使MIDlet對(duì)象從暫停狀態(tài)重新進(jìn)入激活狀態(tài)。調(diào)用該方法時(shí),應(yīng)用程序一般處于暫停狀態(tài),但即使處在暫停狀態(tài)的應(yīng)用程序也可以處理異步事件,比如定時(shí)器timer。notifyDestroyed():該方法通知MIDlet對(duì)象已經(jīng)釋放了所有資源,并已將緩沖區(qū)數(shù)據(jù)保存到了永久存儲(chǔ)記錄中,已經(jīng)進(jìn)入中止?fàn)顟B(tài)。通常在調(diào)用該方法前,先調(diào)用destroyApp()方法,在該方法體中完成清除工作。第二十四頁(yè),共四十一頁(yè),編輯于2023年,星期二高品質(zhì)的游戲依托于高品質(zhì)的畫(huà)面和音效等游戲資源,但手機(jī)畢竟屬于資源受限設(shè)備,在載入這些高品質(zhì)的游戲資源時(shí),將會(huì)出現(xiàn)用戶界面的停滯,用戶會(huì)誤以為程序不響應(yīng)或者是死機(jī)了。此時(shí),就需要使用某種方式來(lái)提示用戶資源的載入情況。比如,可以使用進(jìn)度條來(lái)提醒用戶正在進(jìn)行“讀取數(shù)據(jù)”或“載入資源”。
在本學(xué)習(xí)單元中,首先,通過(guò)高級(jí)用戶界面接口中的Gauge界面組件來(lái)制作簡(jiǎn)單的進(jìn)度條;然后,再使用填充矩形框的方式,通過(guò)查詢資源載入情況,來(lái)實(shí)時(shí)控制進(jìn)度值。
3.4制作游戲加載進(jìn)度條第二十五頁(yè),共四十一頁(yè),編輯于2023年,星期二3.4.2任務(wù)六:用Gauge界面組件制作進(jìn)度條第二十六頁(yè),共四十一頁(yè),編輯于2023年,星期二知識(shí)提煉
Gauge界面組件的構(gòu)造方法如下:publicGauge(Stringlabel,booleaninteractive,intmaxValue,intinitalValue)由于NoneInteractiveGauge類繼承了Gauge類,因此在構(gòu)造方法中,需要首先實(shí)現(xiàn)super()方法,以調(diào)用父類Gauge類的構(gòu)造方法,語(yǔ)句如下:super("",false,10,0);第二十七頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示顯然,交互的Gauge進(jìn)度條是不能反映游戲加載情況的。而非交換的Gauge進(jìn)度條,其進(jìn)度值按照線程中設(shè)定的增幅和頻度自動(dòng)完成遞增過(guò)程,不管游戲資源是否加載完畢,進(jìn)度值的遞增頻率是不變的。這樣的進(jìn)度條實(shí)際上也并不能真實(shí)地反映游戲資源的加載情況。第二十八頁(yè),共四十一頁(yè),編輯于2023年,星期二3.4.3知識(shí)準(zhǔn)備:了解對(duì)象池的概念象手機(jī)這樣的資源受限設(shè)備,內(nèi)存是很緊張的。如果在游戲進(jìn)行過(guò)程中,還需不斷地動(dòng)態(tài)生成對(duì)象或載入資源,游戲就會(huì)停滯,影響體驗(yàn)效果。所以在程序中應(yīng)盡量使用預(yù)先分配好的資源,而不是在使用時(shí)動(dòng)態(tài)分配。比如,可以在游戲主程序的構(gòu)造方法中,把需要?jiǎng)討B(tài)產(chǎn)生的對(duì)象、資源都預(yù)先靜態(tài)生成,形成一個(gè)“對(duì)象池”,再在需要的時(shí)候使用它們。這樣,在游戲開(kāi)始前,會(huì)產(chǎn)生片刻用戶界面的停滯。而游戲一旦開(kāi)始,就不會(huì)再出現(xiàn)停滯現(xiàn)象。如果游戲資源都是在類的構(gòu)造方法中預(yù)先靜態(tài)生成,那么只要資源載入沒(méi)有完成,類就不會(huì)構(gòu)造成功。此時(shí),查詢類的實(shí)例,就是一個(gè)空值。相反,如果類構(gòu)造成功了,說(shuō)明資源已經(jīng)載入完畢,查詢的結(jié)果也就不會(huì)是空值了。第二十九頁(yè),共四十一頁(yè),編輯于2023年,星期二3.4.4任務(wù)七:使用填充矩形框的方式制作進(jìn)度條第三十頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示1:關(guān)于getInstance()方法在程序中,類的實(shí)例通常使用“New構(gòu)造方法”的方式來(lái)創(chuàng)建。如果一個(gè)類被多個(gè)其他類調(diào)用,那么就會(huì)在程序中產(chǎn)生這個(gè)類的多個(gè)實(shí)例。在本任務(wù)中,采用自定義一個(gè)靜態(tài)的getInstance()方法來(lái)獲得類的實(shí)例。這樣就可以做到在整個(gè)程序中只存在一個(gè)類的實(shí)例。因?yàn)樵陟o態(tài)方法中,只能使用靜態(tài)變量,所以在程序中,首先定義了一個(gè)靜態(tài)的類變量instance,在getInstance()方法中,判斷該變量是否為空,如果為空,則先使用構(gòu)造方法創(chuàng)建實(shí)例,然后返回;如果不為空,則直接返回該變量。方法如下:privatestaticGameBodyinstance;publicstaticGameBodygetInstance(){if(instance==null){instance=newGameBody();}returninstance;}第三十一頁(yè),共四十一頁(yè),編輯于2023年,星期二要點(diǎn)提示2:關(guān)于進(jìn)度條前進(jìn)的間隔
程序在正常載入資源的狀態(tài)下,進(jìn)度條前進(jìn)間隔按每100ms增加5的速度遞增。如果進(jìn)度值還沒(méi)有到達(dá)100%,但資源已經(jīng)加載完畢,就加大進(jìn)度條前進(jìn)的間隔,以加快前進(jìn)速度。if(GameBody.getInstance()!=null){step+=50;}
如果進(jìn)度值已經(jīng)到達(dá)100%,但資源加載還沒(méi)有完畢,進(jìn)度值就減小1,使其處于99%的狀態(tài)等待。就像大多數(shù)Windows安裝程序一樣,最后的1%總是要花費(fèi)較長(zhǎng)的時(shí)間等待。
if(progress>100){//如果進(jìn)度值已經(jīng)到了終值(100)
if(GameBody.getInstance()==null){//如果游戲還未加載完畢
progress-=1;//進(jìn)度值減小1,在99%處等待。
}else{//如果游戲已經(jīng)加載完畢
break;//結(jié)束while循環(huán)
}}第三十二頁(yè),共四十一頁(yè),編輯于2023年,星期二3.5搭建手機(jī)游戲制作框架
在前面的各項(xiàng)任務(wù)中,分別完成了閃屏、菜單、幫助、關(guān)于、進(jìn)度條和游戲倒計(jì)時(shí)界面的制作。在本學(xué)習(xí)單元中,首先,把這些界面類快速地關(guān)聯(lián)起來(lái),構(gòu)成一個(gè)簡(jiǎn)單的手機(jī)游戲框架;然后,再進(jìn)行任務(wù)重構(gòu),通過(guò)狀態(tài)變量來(lái)區(qū)分游戲進(jìn)程中的各個(gè)過(guò)程,將在這些界面類中分別實(shí)現(xiàn)的功能,有序地合并到一個(gè)Canvas類中完成。使得代碼緊湊有序,不僅提高了代碼的質(zhì)量,還減少了垃圾回收的負(fù)擔(dān)。第三十三頁(yè),共四十一頁(yè),編輯于2023年,星期二3.5.2任務(wù)八:快速搭建手機(jī)游戲制作框架第三十四頁(yè),共四十一頁(yè),編輯于2023年,星期二3.5.3延伸任務(wù):使用狀態(tài)變量控制游戲進(jìn)程菜單界面
游戲加載
關(guān)于游戲游戲幫助在本任務(wù)中,將上述各界面類合并到一個(gè)Canvas中完成。通過(guò)狀態(tài)變量m_UIState來(lái)區(qū)分游戲進(jìn)程中的各個(gè)過(guò)程。m_UIState變量的值和游戲進(jìn)程之間的對(duì)應(yīng)關(guān)系如下表所示。閃屏界面
第三十五頁(yè),共四十一頁(yè),編輯于2023年,星期二本章小結(jié)1/51.在Java中實(shí)現(xiàn)線程有兩種途徑:一種是繼承java.lang.Thread類,然后改寫(xiě)run()方法;另一種是實(shí)現(xiàn)java.lang.Runnable接口的run()方法。線程通過(guò)start()方法啟動(dòng),在run()方法中控制。當(dāng)run()方法運(yùn)行結(jié)束,線程相應(yīng)終止。2.脫屏畫(huà)布就是通常所說(shuō)的繪制雙緩沖區(qū)技術(shù),能有效地緩解屏幕閃爍。創(chuàng)建、使用脫屏畫(huà)布的關(guān)鍵步驟如下:(1)創(chuàng)建脫屏畫(huà)布Imagebuffer;buffer=Image.createImage(SCREENWIDTH,SCREENHEIGHT);(2)獲取脫屏畫(huà)筆:GraphicsoffG=buffer.getGraphics();(3)改變脫屏畫(huà)布內(nèi)容:offG.drawXXX();(4)將脫屏畫(huà)布內(nèi)容顯示到屏幕上:g.drawImage(buffer,0,0,g.LEFT|G.TOP);第三十六頁(yè),共四十一頁(yè),編輯于2023年,星期二本章小結(jié)2/53.Gauge界面組件是Item類的子類,是一個(gè)采用條形圖代表具體取值的進(jìn)度條,可以被放置在Form組件中。Gauge界面組件可以是交互的,也可以是不交互的。Gauge界面組件的構(gòu)造方法如下:
publicGauge(Stringlabel,booleaninteractive,intmaxValue,intinitalValue)4.制作進(jìn)度條的核心思想是:如果游戲資源都是在類的構(gòu)造方法中預(yù)先靜態(tài)生成,即形成一個(gè)“對(duì)象池”。那么只要資源載入沒(méi)有完成,類就不會(huì)構(gòu)造成功。此時(shí),查詢類的實(shí)例,就是一個(gè)空值。相反,如果類構(gòu)造成功了,說(shuō)明資源已經(jīng)載入完畢,查詢的結(jié)果也不會(huì)是空值了。在運(yùn)行時(shí),如果進(jìn)度值還沒(méi)有到達(dá)100%,但資源已經(jīng)加載完畢,就應(yīng)該加大進(jìn)度條前進(jìn)的間隔,以加快前進(jìn)速度。如果進(jìn)度值已經(jīng)到達(dá)100%,但資源加載還沒(méi)有完畢,應(yīng)該使進(jìn)度條始終處于99%的狀態(tài)等待。第三十七頁(yè),共四十一頁(yè),編輯于2023年,星期二本章小結(jié)3/55.在java.microedition.lcdui包中共定義了三種事件監(jiān)聽(tīng)器,以接口的形式存在,分別為:CommandListener、ItemStateListener和ItemCommandListener。在MIDP框架中實(shí)現(xiàn)事件處理需要做如下三件事情:(1)在類定義中加入implenents子句,表示在該類中要實(shí)現(xiàn)接口
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 住宅小區(qū)外墻改造協(xié)議
- 礦泉水廠保溫系統(tǒng)安裝協(xié)議
- 網(wǎng)絡(luò)短視頻副導(dǎo)演招聘協(xié)議
- 裝飾裝修勞務(wù)協(xié)議
- 市場(chǎng)調(diào)研門(mén)頭租賃合同
- 污水處理工程勞務(wù)合同模板
- 創(chuàng)業(yè)學(xué)校租賃合同
- 花藝作品銷售顧問(wèn)聘用協(xié)議
- 建筑工程施工合同:生態(tài)保護(hù)工程
- 花園租賃協(xié)議模板
- 軟件測(cè)試項(xiàng)目課件04黑盒測(cè)試
- 長(zhǎng)春耐火磚施工方案
- 美術(shù)四年級(jí)上冊(cè)說(shuō)課稿-第14課 漂亮的房間2-蘇少版
- 思明區(qū)公開(kāi)招聘非在編聘用人員報(bào)名表
- 〔部編版〕口語(yǔ)交際:勸告名師課件1
- 運(yùn)用品管圈QCC管理工具消化內(nèi)科-運(yùn)用“日間病房”優(yōu)化科室管理指標(biāo)PDCA
- 導(dǎo)尿術(shù)導(dǎo)尿術(shù)課件
- 生態(tài)停車場(chǎng)監(jiān)理規(guī)劃
- 二年級(jí)特色作業(yè)
- 網(wǎng)絡(luò)信息辨別真?zhèn)?課件
- 賓館酒店標(biāo)準(zhǔn)化-安全管理人員任命書(shū)
評(píng)論
0/150
提交評(píng)論