![學(xué)習(xí)情境游戲開發(fā)_第1頁](http://file4.renrendoc.com/view/4d11798daadb1f83a4006ac5db26b07c/4d11798daadb1f83a4006ac5db26b07c1.gif)
![學(xué)習(xí)情境游戲開發(fā)_第2頁](http://file4.renrendoc.com/view/4d11798daadb1f83a4006ac5db26b07c/4d11798daadb1f83a4006ac5db26b07c2.gif)
![學(xué)習(xí)情境游戲開發(fā)_第3頁](http://file4.renrendoc.com/view/4d11798daadb1f83a4006ac5db26b07c/4d11798daadb1f83a4006ac5db26b07c3.gif)
![學(xué)習(xí)情境游戲開發(fā)_第4頁](http://file4.renrendoc.com/view/4d11798daadb1f83a4006ac5db26b07c/4d11798daadb1f83a4006ac5db26b07c4.gif)
![學(xué)習(xí)情境游戲開發(fā)_第5頁](http://file4.renrendoc.com/view/4d11798daadb1f83a4006ac5db26b07c/4d11798daadb1f83a4006ac5db26b07c5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
學(xué)習(xí)情境游戲開發(fā)第一頁,共六十頁,2022年,8月28日能力目標(biāo)學(xué)會使用GameCvanvas類的按鍵響應(yīng)方法;會熟練構(gòu)造精靈類;學(xué)會使用精靈實(shí)現(xiàn)動畫的自動播放;能熟練設(shè)置精靈出現(xiàn)的位置、顯示幀、切換幀和繪制幀的方法。學(xué)會使用Vector類創(chuàng)建子彈、移動子彈和繪制子彈;學(xué)會自定義對象類的方法,構(gòu)造一個游戲?qū)ο螅粚W(xué)會使用變量來模擬計數(shù)器功能,實(shí)現(xiàn)游戲?qū)ο笠圆煌念l率運(yùn)動;熟練掌握使用setTransform()方法,實(shí)現(xiàn)精靈對象的旋轉(zhuǎn);熟練掌握使用精靈類提供的方法進(jìn)行碰撞的檢測;……第二頁,共六十頁,2022年,8月28日認(rèn)知目標(biāo)認(rèn)識游戲的屏幕GameCanvas類;了解GameCanvas類和Canvas類的區(qū)別;了解GameCvanvas類的自動雙緩沖區(qū)和脫屏畫筆;學(xué)習(xí)精靈類中常用方法的語法格式,并理解其中參數(shù)的含義。了解Vector類中的常用方法,并理解各參數(shù)的含義;理解計數(shù)器在游戲程序中的使用方法和重要性;理解setTransform()方法中參數(shù)rotating的8個取值的含義認(rèn)知collidesWith()方法的語法格式,并理解其參數(shù)的含義;理解區(qū)域級和像素級碰撞區(qū)別;理解播放幀序列中的幀號碼和幀序號的區(qū)別;……第三頁,共六十頁,2022年,8月28日4.1學(xué)習(xí)情景描述除棋牌類游戲之外,一款手機(jī)游戲,通常在一個特定的場景下展開,這個特定的場景,就是游戲的背景,根據(jù)需要,游戲背景還可以滾動。在游戲背景下,通常有若干個游戲的對象。其中可以由玩家通過按鍵來控制的游戲?qū)ο?,稱為游戲的“主角”,其余不能由玩家來控制的角色稱為“NPC”,即非玩家控制角色,或系統(tǒng)控制角色。這些游戲?qū)ο罂梢赃M(jìn)行移動、跳躍、投擲、發(fā)射子彈、攻擊等各種動作。并通過對這些游戲?qū)ο蠛蛣幼鬟M(jìn)行HP(生命值)、MP(經(jīng)驗(yàn)值)、攻擊力等等的數(shù)值設(shè)計,來判斷游戲的勝利或者失敗。本學(xué)習(xí)情境分為五個學(xué)習(xí)單元來完成。單元一,游戲主角設(shè)計;單元二,子彈設(shè)計;單元三,NPC(非玩家控制角色)設(shè)計;單元四,游戲背景設(shè)計;單元五,滾屏設(shè)計。第四頁,共六十頁,2022年,8月28日游戲主角是由玩家來控制的游戲?qū)ο?,可以是一架飛機(jī)、一輛坦克、一個人物等。玩家通過手機(jī)鍵盤上的按鍵,可以控制游戲主角在手機(jī)屏幕上進(jìn)行移動、跳躍、投擲、格斗等各種動作。
在本學(xué)習(xí)單元中,首先,通過控制一架飛機(jī)在屏幕上的移動,來認(rèn)識GameCanvas,并學(xué)習(xí)在GameCanvas中的鍵盤處理;然后,通過在移動時,改變飛機(jī)的形狀,初識精靈類;最后,通過控制一個主角人物在屏幕上的行走,來深入地學(xué)習(xí)精靈類的使用。4.2游戲主角設(shè)計第五頁,共六十頁,2022年,8月28日4.2.2知識準(zhǔn)備:了解GameCanvas類MIDP有1.0和2.0版本之分。在MIDP2.0中,新增加了一個包,這個包中定義了專門用于游戲開發(fā)的5個新類:GameCanvas、Layer、LayerManager、Sprite和TiledLayer。這些類主要針對游戲開發(fā)的特點(diǎn),提供了用于提高游戲性能的獨(dú)立功能。其中,GameCanvas類繼承自MIDP1.0中的Canvas類,為游戲提供了基本的“屏幕”功能。除了完全具備Canvas類的功能外,這個類還提供了游戲?qū)S玫墓δ?,這些功能簡化了游戲開發(fā)并提高了運(yùn)行性能。比如:提供雙緩沖繪制機(jī)制,能直接獲得設(shè)備鍵盤的物理狀態(tài)等等。第六頁,共六十頁,2022年,8月28日4.2.3任務(wù)一:控制主角飛機(jī)在屏幕上移動第七頁,共六十頁,2022年,8月28日任務(wù)準(zhǔn)備(1)聲明變量(2)在構(gòu)造方法中實(shí)現(xiàn)初始化(3)繪制屏幕(4)響應(yīng)鍵盤(5)啟動線程(6)控制線程(7)測試運(yùn)行(1)新建MIDlet工程,工程名為“Ch4_Unit1”。(2)新建MIDlet類,類名為“Ch4_Unit1_MIDlet”。(3)新建GameCanvas類。(4)將主角飛機(jī)圖片資源文件plane.png,拷貝到工程的“res”文件夾下。實(shí)現(xiàn)過程第八頁,共六十頁,2022年,8月28日知識提煉:MIDP2.0中的鍵盤處理在MIDP2.0中,不需要等待鍵盤事件發(fā)生后才能獲取鍵盤狀態(tài)信息,通過調(diào)用GameCanvas類上定義的的getKeyStates()方法,可以隨時獲取鍵盤狀態(tài)信息,并且可以獲取多個按鍵狀態(tài)信息。getKeyStates()方法的語法如下:publicintgetKeyStates()該方法返回一個int型數(shù)據(jù),其中每一位代表一個按鍵的狀態(tài)。如果某個按鍵被按下,則對應(yīng)的數(shù)據(jù)位為1,否則,數(shù)據(jù)位為0。000010000GAMEDGAME
CGAMEBGAMEAFIREDOWNUPRIGHTLEFT
MIDP2.0在GameCanvas類上定義了九個靜態(tài)屬性常量來表示游戲按鍵狀態(tài)碼,分別為: UP_PRESSED 上功能鍵或數(shù)字2鍵 DOWN_PRESSED 下功能鍵或數(shù)字8鍵 LEFT_PRESSED 左功能鍵或數(shù)字4鍵 RIGHT_PRESSED 右功能鍵或數(shù)字6鍵 FIRE_PRESSED 開火功能鍵或數(shù)字5鍵 GAME_A_PRESSED 數(shù)字1鍵 GAME_B_PRESSED 數(shù)字3鍵 GAME_C_PRESSED 數(shù)字7鍵 GAME_D_PRESSED 數(shù)字9鍵第九頁,共六十頁,2022年,8月28日檢測按鍵狀態(tài)方法intkeyCode=this.getKeyStates();//獲取鍵盤狀態(tài)if(keyCode==GameCanvas.UP_PRESSED){//假如是按上鍵 ……}elseif(keyCode==GameCanvas.DOWN_PRESSED){//假如是按下鍵 ……}elseif(keyCode==GameCanvas.LEFT_PRESSED){//假如是按左鍵 ……
}elseif(keyCode==GameCanvas.RIGHT_PRESSED){//假如是按右鍵 ……}當(dāng)然,也可以使用位“與”的方法進(jìn)行判斷:intkeyCode=this.getKeyStates();//獲取鍵盤狀態(tài)if((keyCode&GameCanvas.UP_PRESSED)!=0){//假如是按向上鍵 ……}elseif((keyCode&GameCanvas.DOWN_PRESSED)!=0){//假如是按下鍵 ……}elseif((keyCode&GameCanvas.LEFT_PRESSED)!=0){//假如是按向左鍵 ……}elseif((keyCode&GameCanvas.RIGHT_PRESSED)!=0){//假如是按向右鍵 ……}使用上述兩種方法,都只能判斷一個按鍵被按下的情況,無法判斷多個按鍵被同時按下的情況。原因是,比如,當(dāng)同時按下“上”和“右”按鍵的時候,得到的值既不是UP_PRESSED也不是RIGHT_PRESSED。改進(jìn)方法如下:if(((keyCode&GameCanvas.UP_PRESSED)!=0)&&((keyCode&GameCanvas.LEFT_PRESSED)!=0)){//左、上兩個按鍵被同時按下 ……}elseif(((keyCode&GameCanvas.UP_PRESSED)!=0)&&((keyCode&GameCanvas.RIGHT_PRESSED)!=0)){//右、上兩個按鍵被同時按下 ……}elseif((keyCode&GameCanvas.LEFT_PRESSED)!=0){//左鍵被按下 ……}elseif((keyCode&GameCanvas.RIGHT_PRESSED)!=0){//右鍵被按下 ……}小提示:由于使用的是elseif判斷,因此對多按鍵被同時按下的判斷應(yīng)放在單按鍵被按下的判斷之前。比如,當(dāng)同時按下左、上按鍵時,會有如下三個條件同時成立:(keyCode&GameCanvas.UP_PRESSED)!=0(keyCode&GameCanvas.LEFT_PRESSED)!=0((keyCode&GameCanvas.UP_PRESSED)!=0)&&((keyCode&GameCanvas.LEFT_PRESSED)!=0)
如果單按鍵被按下的判斷放在前面,那么后面的多按鍵被按下的情況就不再判斷了。第十頁,共六十頁,2022年,8月28日protectedGameCanvas(booleansuppressKeyEvents)
參數(shù)suppressKeyEvents用于指定是否支持MIDP1.0中的鍵盤響應(yīng)事件。當(dāng)參數(shù)取值為true時,指明不支持鍵盤響應(yīng)事件。當(dāng)用戶操作鍵盤時,不會引起keyPressed()、keyReleased()和keyRepeated()這三個事件方法被調(diào)用,這樣可以提高速度和性能。如果參數(shù)取值為false,那么一旦按鍵被按下,就會調(diào)用上述三個傳統(tǒng)的鍵盤事件處理方法。
在GameCanvas類中定義的九個表示按鍵狀態(tài)碼的靜態(tài)屬性常量中,并不包含鍵盤左上角的“左軟鍵”和鍵盤右上角的“右軟鍵”。而這兩個按鍵通常被用來響應(yīng)“返回”、“暫?!薄ⅰ巴顺觥?、“確定”等與用戶交互的功能按鈕。因此,在MIDP2.0中保留了對MIDP1.0中的按鍵響應(yīng)機(jī)制,通常用于對“左軟鍵”和“右軟鍵”的響應(yīng)。要點(diǎn)提示1:GameCanvas類的構(gòu)造方法第十一頁,共六十頁,2022年,8月28日要點(diǎn)提示1:繪制雙緩沖區(qū)1、在MIDP2.0中,GameCanvas類為每個實(shí)例對象提供唯一的圖形緩沖區(qū),緩沖區(qū)的大小與屏幕大小一樣。每一個GameCanvas對象所擁有的緩沖區(qū)都是獨(dú)立的,因此最好在游戲中僅創(chuàng)建一個GameCanvas類對象,并且重復(fù)利用。2、調(diào)用GameCanvas類的getGraphics()方法,可以獲得繪制緩沖區(qū)的Graphics對象。3、調(diào)用GameCanvas類的flushGraphics()方法,可以將緩沖區(qū)中的內(nèi)容繪制到屏幕上。第十二頁,共六十頁,2022年,8月28日4.2.4任務(wù)二:飛機(jī)移動時,實(shí)現(xiàn)形狀的改變第十三頁,共六十頁,2022年,8月28日知識準(zhǔn)備:了解精靈類精靈類(Sprite)被定義在包中,專門用來代表游戲中的動畫角色,可以顯示一幀或多幀的連續(xù)圖像。但所有的幀都必須大小相同,并且由一個Image對象提供。比如:飛機(jī)在飛行時有三種不同的形狀,正向飛行,向左側(cè)飛行和向右側(cè)飛行:。將這三個形狀不同,但大小相同(25×24)的小圖片合成到一個Image對象中。每個小圖片為一幀,幀的序號從0開始,并且按從左到右,從上到下的順序依次排列。通過精靈類(Sprite)對象,可以任意顯示其中某一幀的靜態(tài)圖像,或者連續(xù)地、循環(huán)顯示任意順序的某幾幀,以實(shí)現(xiàn)動畫效果。精靈類(Sprite)還提供了許多變換模式(翻轉(zhuǎn)和旋轉(zhuǎn)),以及碰撞檢測的方法,能大大簡化游戲邏輯的實(shí)現(xiàn)。第十四頁,共六十頁,2022年,8月28日知識提煉:精靈類構(gòu)造方法(1)publicSprite(Imageimage)說明:通過圖像創(chuàng)建一個只含有一幀圖像的非動畫Sprite類對象,即只能顯示一幅靜態(tài)圖像。利用該方法創(chuàng)建精靈類對象的目的,主要是利用Sprite類提供的方法,實(shí)現(xiàn)圖像各種角度的翻轉(zhuǎn)、碰撞檢測等功能。參數(shù):image為只含有一幀的圖像。(2)publicSprite(Imageimage,intframeWidth,intframeHeight)說明:通過圖像創(chuàng)建一個指定每幀圖像大小的動畫精靈類對象,該方法是最常用的。參數(shù):image為包含多幀的圖像。frameWidth和frameHeight分別為每一幀的寬度和高度。(3)publicSprite(Spritesprite)說明:通過一個精靈類對象創(chuàng)建一個新的精靈類對象。參數(shù):sprite是一個已創(chuàng)建好的精靈類。第十五頁,共六十頁,2022年,8月28日要點(diǎn)提示(1)單幀圖像處理publicvoidsetFrame(intindex)其中,參數(shù)index為當(dāng)前精靈類對象某一幀的序號。(2)設(shè)置精靈位置并繪制精靈①publicvoidsetPosition(intx,inty)說明:將精靈類對象定位到屏幕上的任意位置。參數(shù):x為橫坐標(biāo),y為縱坐標(biāo)。②publicvoidpaint(Graphicsg)說明:繪制精靈類對象的當(dāng)前幀。參數(shù):g為繪制上下文。第十六頁,共六十頁,2022年,8月28日4.2.5任務(wù)三:設(shè)計主角人物在屏幕上行走第十七頁,共六十頁,2022年,8月28日任務(wù)準(zhǔn)備(1)聲明變量(2)在構(gòu)造方法中實(shí)現(xiàn)初始化(3)繪制屏幕(4)響應(yīng)鍵盤(5)啟動線程(6)控制線程(7)測試運(yùn)行(1)新建MIDlet類,類名為“Ch4_Unit1_MIDlet2”。(2)新建GameCanvas類,類名為“Ch4_Unit1_GameCanvas2”(3)將主角人物圖片資源文件man.png,拷貝到工程的“res”文件夾下。實(shí)現(xiàn)過程第十八頁,共六十頁,2022年,8月28日要點(diǎn)提示(1)多幀動畫處理publicvoidsetFrameSequence(int[]sequence)publicvoidnextFrame()publicvoidprevFrame()小提示:使用getFrame()方法可以獲取動畫播放幀序列中當(dāng)前正在播放的圖像幀序號。在實(shí)際應(yīng)用中,可以使用該方法判斷某一次動畫的播放幀是否已經(jīng)播放完畢,比如:爆炸效果。(2)精靈的移動publicvoidmove(intdx,intdy)小提示:當(dāng)多次使用move()方法移動精靈后,其在屏幕上的確切位置就有些模糊了。此時可以使用精靈類提供的getX()和getY()方法,來獲取精靈的當(dāng)前坐標(biāo)位置,以此判斷精靈是否移出了屏幕,即進(jìn)行邊界的處理。第十九頁,共六十頁,2022年,8月28日要點(diǎn)提示int[][]sequence={{6,7,8},{0,1,2},{3,4,5},{9,10,11}};//上、下、左、右播放幀序列intdirection=-1;//行走方向
0:上1:下2:左3:右
-1:無方向第二十頁,共六十頁,2022年,8月28日4.2.6延伸任務(wù):控制主角人物,按鍵行走,釋放站立 privatevoidcontrolFrame(intdirection){ if(frameIndex<sequence[direction].length-1){ frameCounter--; if(frameCounter==0){ frameIndex++; frameCounter=3; } }else{ frameIndex=1;//跳過0幀(站立幀) } spMan.setFrame(sequence[direction][frameIndex]);//設(shè)置幀 }第二十一頁,共六十頁,2022年,8月28日4.3子彈設(shè)計在射擊類游戲中,除主角和NPC之外,子彈是一個很重要的游戲元素。他可以自動地、源源不斷地發(fā)射,或者按鍵觸發(fā)后發(fā)射。其實(shí),子彈只是一個特殊的游戲元素,使用與設(shè)計子彈同樣的方法,可以設(shè)計任何形狀的、與游戲角色相關(guān)的游戲元素,比如:潛水艇扔下的水雷、武士發(fā)出的暗器、天上飄落的雪花、大富翁游戲中掉落的金子等等。在本學(xué)習(xí)單元中,首先,通過Vector類進(jìn)行子彈的設(shè)計;然后,通過自定義類的方法設(shè)計子彈,并指出兩種設(shè)計方法在實(shí)現(xiàn)手段和執(zhí)行效率及執(zhí)行效果上的差別;最后,通過實(shí)現(xiàn)散彈,進(jìn)一步學(xué)習(xí)精靈類對象在運(yùn)行過程,進(jìn)行圖片的動態(tài)轉(zhuǎn)換和對象的旋轉(zhuǎn)。第二十二頁,共六十頁,2022年,8月28日4.3.2使用Vector類設(shè)計子彈第二十三頁,共六十頁,2022年,8月28日知識準(zhǔn)備:了解Vector類Vector類位于java.util包中。在J2MEMIDP2.0中,保留了J2SE中的Vector類。該類對用戶隱藏了內(nèi)存分配的細(xì)節(jié)問題,使用Vector可以作為需要動態(tài)生成對象的容器。而游戲中的子彈則是動態(tài)生成的最好例子。Vector有“矢量、媒介、載體”的含義,很多書上稱之為“向量”。但把他看成一個“容器”也許更形象一些,因?yàn)樗軌蛳袢萜饕粯哟娣鸥鞣N類型的對象。而且這個“容器”隨著存放對象的多少,其長度可以動態(tài)地變化。從這個角度來說,Vector就是一個能夠存放任意類型對象的動態(tài)數(shù)組。第二十四頁,共六十頁,2022年,8月28日任務(wù)準(zhǔn)備(1)聲明子彈相關(guān)變量(2)在構(gòu)造方法中加載圖片(3)自定義創(chuàng)建子彈的方(4)自定義移動子彈的方法
(5)自定義繪制子彈的方(6)在繪制屏幕的show()方法中,添加對上述三個方法的調(diào)用語句,實(shí)現(xiàn)對子彈的繪制。
(7)測試運(yùn)行(1)新建MIDlet工程,工程名為“Ch4_Unit2”。(2)新建MIDlet類,類名為“Ch4_Unit2_MIDlet”。(3)新建GameCanvas類,類名為“Ch4_Unit2_GameCanvas”。(4)將飛機(jī)圖片文件plane2.png,和子彈圖片文件bullet.png,拷貝到工程的“res”文件夾下。實(shí)現(xiàn)過程第二十五頁,共六十頁,2022年,8月28日知識提煉:Vector類的常用方法(1)構(gòu)造方法①publicVector(intinitialCapacity,intcapacityIncrement)說明:通過參數(shù)構(gòu)造一個Vector的動態(tài)數(shù)組。能設(shè)置動態(tài)數(shù)組的初始容量和遞增增量。參數(shù):initialCapacity為Vector動態(tài)數(shù)組的初始容量。capacityIncrement為Vector動態(tài)數(shù)的遞增增量。②publicVector(intinitialCapacity)說明:通過參數(shù)構(gòu)造一個Vector的動態(tài)數(shù)組。只能設(shè)置動態(tài)數(shù)組的初始容量。一般是增長目前大小的一倍。參數(shù):initialCapacity為Vector動態(tài)數(shù)組的初始容量。③publicVector()說明:構(gòu)造一個Vector動態(tài)數(shù)組。參數(shù):無。(2)size方法語法:publicintsize()說明:返回當(dāng)前Vector動態(tài)數(shù)組中的元素個數(shù)。參數(shù):無。(3)addElement方法:語法:publicvoidaddElement(Objectobj)說明:把組件加到向量尾部,同時大小加1,向量容量比以前大1。參數(shù):Objectobj是向動態(tài)數(shù)組中添加的對象。(4)removeElementAt方法:語法:publicvoidremoveElementAt(inti)說明:把第i個元素移出動態(tài)數(shù)組。同時,動態(tài)數(shù)組的大小減1。參數(shù):inti為要移除的動態(tài)數(shù)組的第i個元素。(5)ElementAt方法:語法:publicObjectElementAt(inti)說明:返回Vector動態(tài)數(shù)組中的第i個對象。參數(shù):inti為返回動態(tài)數(shù)組的第i個元素。返回值:返回Vector動態(tài)數(shù)組中的對象。注意,返回的對象要強(qiáng)制轉(zhuǎn)換為自己所需要的類型。第二十六頁,共六十頁,2022年,8月28日要點(diǎn)提示privatevoidcreateBullet(){if(--distance<=0){SpritespBullet=newSprite(imgBullet);spBullet.setPosition(spPlane.getX()+10,spPlane.getY());vecBullet.addElement(spBullet);distance=6;}}第二十七頁,共六十頁,2022年,8月28日4.3.3任務(wù)五:使用自定義子彈(Bullet)類的方法設(shè)計子彈任務(wù)四和任務(wù)五,采用不同的方法,實(shí)現(xiàn)了同樣的效果。但要注意區(qū)別兩者在實(shí)現(xiàn)方法和執(zhí)行效率及執(zhí)行效果上的差別。Vector類使用方便,但其對內(nèi)存的頻繁動態(tài)分配,在一定程度上會影響執(zhí)行效率。并且放入Vector中的對象,一般都具有相同的屬性和行為,比如,都按同一軌跡運(yùn)行。而自定義子彈類的方法,則比較靈活??梢酝ㄟ^給定不同的子彈圖片,定義各種不同形狀的子彈,可以設(shè)計多種運(yùn)行軌跡,使得不同的子彈可以按不同的軌跡運(yùn)行。需要注意的是,Bullet類只是一個普通的JAVA類,并沒有繼承自精靈類。主要原因是精靈類占用內(nèi)存空間比較大一些,而且運(yùn)行起來比較慢。因此,在本任務(wù)中只聲明了一個子彈精靈spBullet,而不是十五個。并該子彈精靈看成是一個“精靈圖章”,當(dāng)需要顯示15顆子彈中的某一顆時,只需在相應(yīng)的位置上“蓋”上對應(yīng)的“精靈圖章”即可,這樣既節(jié)省了內(nèi)存,又提高了運(yùn)行效率。第二十八頁,共六十頁,2022年,8月28日4.3.4延伸任務(wù):實(shí)現(xiàn)散彈第二十九頁,共六十頁,2022年,8月28日知識提煉(2)精靈對象的旋轉(zhuǎn)使用setTransform()方法可以實(shí)現(xiàn)精靈對象的旋轉(zhuǎn),語法格式如下:publicviodsetTransform(introtating)其中,參數(shù)Rotating是由8個靜態(tài)屬性常量來表示。TRANS_NONE:保持圖像的原始位置。TRANS_ROT90:順時針旋轉(zhuǎn)90度。TRANS_ROT180:順時針旋轉(zhuǎn)180度。TRANS_ROT270:順時針旋轉(zhuǎn)270度。TRANS_MIRROR:沿著圖片垂直Y軸翻轉(zhuǎn)。TRANS_MIRROR_ROT90:沿著圖片垂直Y軸翻轉(zhuǎn)后,再順時針旋轉(zhuǎn)90度。TRANS_MIRROR_ROT180:沿著圖片垂直Y軸翻轉(zhuǎn)后,再順時針旋轉(zhuǎn)180度。TRANS_MIRROR_ROT270:沿著圖片垂直Y軸翻轉(zhuǎn)后,再順時針旋轉(zhuǎn)270度。(1)精靈圖片的動態(tài)轉(zhuǎn)換使用setImage()方法可以在運(yùn)行時,實(shí)現(xiàn)精靈圖片的動態(tài)轉(zhuǎn)換,語法格式如下:publicvoidsetImage(Imageimg,intframeWidth,intframeHeight)其中,參數(shù)img表示要動態(tài)改變的圖片對象,frameWidth和frameHeight是圖片幀的寬度和高度。第三十頁,共六十頁,2022年,8月28日4.4NPC(非玩家控制的角色)設(shè)計NPC,即非玩家控制的角色,比如:射擊類游戲中的敵機(jī)。NPC的設(shè)計通常包括:形象設(shè)計、出現(xiàn)的時機(jī)、出現(xiàn)方式、運(yùn)行軌跡、碰撞檢測、生命值和得分等簡單的數(shù)值設(shè)計、以及簡單的AI設(shè)計等等。在本學(xué)習(xí)單元中,以射擊類游戲中的敵機(jī)為NCP的特例。首先,對其的出現(xiàn)方式和運(yùn)行軌跡進(jìn)行設(shè)計;然后,通過添加時間軸,對其的出現(xiàn)時機(jī)進(jìn)行了統(tǒng)一的安排和設(shè)計;接著,進(jìn)行主角子彈和敵機(jī)的碰撞檢測;最后,通過出現(xiàn)BOSS,進(jìn)行簡單的數(shù)值設(shè)計和AI設(shè)計。第三十一頁,共六十頁,2022年,8月28日4.4.2任務(wù)六:出現(xiàn)敵機(jī)(隊列)第三十二頁,共六十頁,2022年,8月28日要點(diǎn)提示:敵機(jī)隊形的設(shè)計在本任務(wù)中,設(shè)計了四種隊形,但實(shí)現(xiàn)方法都是類似的。要點(diǎn)是首先定位第一架敵機(jī),后面的敵機(jī)位置分別是前一架敵機(jī)在x位置或y位置上間隔一定的距離。比如,斜線排列的隊形。首先,定位第一架敵機(jī)的位置是(18,-10);然后,后面的敵機(jī)分別在前一架敵機(jī)的右上側(cè),x方向上距離36像素,y方向上距離35像素。代碼如下:
spNpc1[0].setPosition(18,-10);//設(shè)置隊列中第一架敵機(jī)出現(xiàn)的位置
for(inti=1;i<spNpc1.length;i++){ spNpc1[i].setPosition(spNpc1[i-1].getX()+36,spNpc1[i-1].getY()-35); }水平排列和垂直排列的方法與此類似。根據(jù)這個方法還可以設(shè)計出很多其他的隊形。第三十三頁,共六十頁,2022年,8月28日4.4.3延伸任務(wù):添加時間軸,安排游戲情節(jié)timing++;if(timing==20*1||timing==20*7){npcPlane.setNpc0Position(spNpc0,screenWidth);}elseif(timing==20*3||timing==20*9){ npcPlane.setNpcQueue1(spNpc1);}elseif(timing==20*4||timing==20*14){ npcPlane.setNpcQueue2(spNpc2,screenWidth,screenHeight);}elseif(timing==20*5||timing==20*15){ npcPlane.setNpcQueue3(spNpc3,screenWidth);}elseif(timing==20*6||timing==20*18){ npcPlane.setNpcQueue4(spNpc4);}時間出現(xiàn)NPC1秒和7秒出現(xiàn)一架敵機(jī)3秒和9秒出現(xiàn)敵機(jī)隊列14秒和14秒出現(xiàn)敵機(jī)隊列25秒和15秒出現(xiàn)敵機(jī)隊列36秒和20秒出現(xiàn)敵機(jī)隊列4第三十四頁,共六十頁,2022年,8月28日要點(diǎn)提示:時間軸在射擊類游戲中,敵機(jī)的出現(xiàn)都應(yīng)該是事先安排好的,在什么時刻出現(xiàn)什么敵機(jī),什么時刻出現(xiàn)什么狀態(tài)。例如,在本任務(wù)中,游戲開始1秒鐘后,出現(xiàn)第一架敵機(jī),過3秒鐘后,出現(xiàn)敵機(jī)隊列1,過4秒鐘后,出現(xiàn)敵機(jī)隊列2,……。這類似于游戲的腳本,從游戲的開始到結(jié)束,都貫穿著時間軸的概念。在時間軸的設(shè)計中,使用了記錄時間的一個長整型變量timing,在每個線程周期中,該變量值就會增加1。因?yàn)槊總€線程周期為50毫秒,當(dāng)timing的值為20×1時,就意味著過了50×20×1毫秒,即1秒鐘。依次類推,當(dāng)tming的值為20×2時,就意味著游戲開始后2秒鐘,……。時間軸的實(shí)現(xiàn)方法,可以使用如任務(wù)中的if…elseif結(jié)構(gòu),當(dāng)然,也可以使用swtich結(jié)構(gòu)。不管是什么游戲,都會有條“主線”,例如:對于射擊游戲,主線就是時間。對于RPG(角色扮演類)游戲,主線可能就是游戲的故事情節(jié)。而對于益智類游戲來說,主線則顯得不是很明朗,例如五子棋游戲,那么他的主線就是根據(jù)玩家下的每一步棋子,來判斷下一步應(yīng)該怎么操作。第三十五頁,共六十頁,2022年,8月28日4.4.4任務(wù)七:實(shí)現(xiàn)主角子彈和敵機(jī)的碰撞檢測第三十六頁,共六十頁,2022年,8月28日要點(diǎn)提示:關(guān)于爆炸效果程序中,每一架敵機(jī)都對應(yīng)地定義了一個爆炸精靈,這是因?yàn)楸◣牟シ判枰粋€過程,因此兩架甚至多架敵機(jī)的爆炸效果可能會同時出現(xiàn)在屏幕上,所以爆炸精靈一般不共用。爆炸效果的繪制是一個逐幀繪制的過程,當(dāng)最后一幀繪制完畢的時候,就應(yīng)該停止。否則,爆炸效果會反復(fù)出現(xiàn)。精靈類提供的getFrame()方法,可以獲取當(dāng)前正在播放的幀索引號。當(dāng)幀索引號再次變?yōu)?的時候,表示幀序列已經(jīng)播放完畢,此時,應(yīng)該再次設(shè)置當(dāng)前的爆炸精靈為不可見。代碼如下:if(spExplosion.getFrame()==0){//如果幀序列播放完畢(重新開始下一循環(huán)序列了)
spExplosion.setVisible(false);}第三十七頁,共六十頁,2022年,8月28日知識提煉①publicfinalbooleancollidesWith(Sprites,booleanpixelLevel)②publicfinalbooleancollidesWith(Imageimage,intx,inty,booleanpixelLevel)③publicfinalbooleancollidesWith(TiledLayert,booleanpixelLevel)每種碰撞的檢測都存在兩種級別的檢測模式:區(qū)域級模式和像素級模式。第三十八頁,共六十頁,2022年,8月28日4.4.5任務(wù)八:出現(xiàn)BOSS第三十九頁,共六十頁,2022年,8月28日要點(diǎn)提示(1)數(shù)值設(shè)計在本任務(wù)中,設(shè)計Boss的初始生命值為100,被子彈擊中一次,生命值就減2,直至為0,Boss爆炸。在玩家得分的設(shè)計上,擊中一架敵機(jī),得分加10。當(dāng)Boss被擊爆時,得分加100。(2)Boss的AI設(shè)計在Boss完全移入屏幕之前,子彈擊中Boss,其生命值是不減的。當(dāng)Boss作水平移動時,碰到左右邊界,會自動折返。當(dāng)被子彈擊中時,顯示閃爍效果,并且移動速度變慢。第四十頁,共六十頁,2022年,8月28日4.5游戲背景設(shè)計游戲背景設(shè)計是游戲的一個亮點(diǎn)所在,當(dāng)拿到一款游戲的時候,這款游戲是否吸引人,由兩個方面所決定,游戲的控制和游戲的背景設(shè)計。在MIDP1.0中沒有提供專門負(fù)責(zé)背景設(shè)計的類,而在MIDP2.0中提供了一個TiledLayer類,該類專門負(fù)責(zé)對游戲背景進(jìn)行管理和操作。由于移動設(shè)備的存儲資源有限,因此不可能裝載過大的圖片來作為游戲的背景。本學(xué)習(xí)單元中,首先,通過一個圖塊(瓷片)“鋪設(shè)”單一的游戲背景;然后,使用由一塊一塊圖塊(瓷片)合成的圖片,來“鋪設(shè)”豐富的游戲背景;最后,學(xué)習(xí)使用地圖編輯器,進(jìn)行大型地圖的設(shè)計,并顯示在手機(jī)屏幕上。第四十一頁,共六十頁,2022年,8月28日4.5.2任務(wù)九:使用一個圖塊,“鋪設(shè)”單一的游戲背景第四十二頁,共六十頁,2022年,8月28日知識提煉TiledLayer類被定義在包中。該類代表一個背景圖層,將背景所占區(qū)域分成大小相等的一系列單元格,每個單元格可被一個圖塊填充,最終構(gòu)成一個組合成的大圖塊背景。(1)背景的初步規(guī)劃根據(jù)手機(jī)屏幕的大小,以及圖塊的寬、高,設(shè)計使用該圖塊鋪滿整個屏幕,橫著需要多少個圖塊,豎著需要多少個圖塊。使用TiledLayer類的構(gòu)造方法可以進(jìn)行游戲背景的初步規(guī)劃。TiledLayer類的構(gòu)造方法語法如下:publicTiledLayer(intcolumns,introws,Imageimage,inttileWidth,inttileHeight)(2)背景的鋪設(shè)為了形成背景,必須將圖塊填充到單元格中,通過調(diào)用setCell()方法可以為單元格設(shè)置引用的圖塊。語法如下:publicvoidsetCell(intcol,introw,inttileIndex)(3)背景的繪制背景形成后,需要通過paint(Graphicsg)方法繪制出TiledLayer實(shí)例。第四十三頁,共六十頁,2022年,8月28日要點(diǎn)提示在本任務(wù)中,water.png文件中只有一個圖塊,該圖塊的大小為30×30,整個屏幕都使用同一個圖塊進(jìn)行填充,類似這種使用同一個圖塊填充一片連續(xù)區(qū)域的情況,也可以使用fillCells()方法來完成。語法如下:publicvoidfillCells(intcol,introw,intnumCols,intnumRows,inttileIndex)因此,程序中如下的相關(guān)代碼:
for(inti=0;i<backCols;i++){for(intj=0;j<backRows;j++){tlgBackground.setCell(i,j,1);}}可以使用如下這條語句進(jìn)行替代:tlgBackground.fillCells(0,0,backCols,backRows,1);第四十四頁,共六十頁,2022年,8月28日任務(wù)十:使用合成圖塊,“鋪設(shè)”豐富的游戲背景第四十五頁,共六十頁,2022年,8月28日要點(diǎn)提示本任務(wù)中,使用了由一個一個圖塊合成的圖片文件進(jìn)行地圖的鋪設(shè),這些圖塊必須擁有相同的寬度和高度。每個圖塊按從左到右,從上到下的順序分配一個索引號,索引號從1開始。小提示:如果使用索引為0去填充單元格,則表示該區(qū)域不填充、繪制任何東西。第四十六頁,共六十頁,2022年,8月28日4.5.4任務(wù)十一:使用地圖編輯器,設(shè)計大型地圖
對于飛行射擊類、角色扮演類等手機(jī)游戲,在設(shè)計游戲背景的時候,通常比手機(jī)屏幕要大很多,并且在游戲過程中,背景會自動地滾動,或者隨著游戲主角的移動而移動,以增加游戲的動感。這樣大的一個游戲背景,全憑想象來設(shè)計二維的地圖數(shù)據(jù),顯然是不可行的。因此,在本任務(wù)中,通過借助于第三方開發(fā)的地圖編輯器,來設(shè)計大型地圖,將大大簡化工作量和工作難度。比較常用的手機(jī)游戲地圖編輯器有Mappy(mapwin)、Tiled、TILESTUDIO等等,這些地圖編輯工具可以到相關(guān)網(wǎng)站免費(fèi)下載。第四十七頁,共六十頁,2022年,8月28日(2)在手機(jī)屏幕上顯示地圖首先,將導(dǎo)出并修改的“map1.png”文件拷貝到“Ch4_Unit4”工程的“res”文件夾下。
在“Ch4_Unit4”工程中新建類,類名為“Map1”。打開“Map1”類,聲明一個二維數(shù)組,并把map1.txt文件中的二維數(shù)組“map1_map0”的值拷貝過來。將原先聲明的二維數(shù)組“mapData”刪除,并將代碼中所有引用該二維數(shù)組的地方,全部用“Map1.map1Data”替代(1)使用mapwin編輯地圖新建地圖導(dǎo)入圖塊鋪設(shè)地圖保存地圖文件導(dǎo)出地圖數(shù)據(jù)實(shí)現(xiàn)過程小提示:單擊菜單“MapTools”→“RemoveUnusedorDuplicate…”,可以在導(dǎo)出的圖塊文件中移除那些在編輯地圖過程中沒有用到的圖塊。第四十八頁,共六十頁,2022年,8月28日4.5.5延伸任務(wù):鋪設(shè)多層地圖第四十九頁,共六十頁,2022年,8月28日4.6滾屏設(shè)計的任務(wù)十一和的延伸任務(wù)中,鋪設(shè)的地圖都比手機(jī)屏幕大許多。默認(rèn)情況下,手機(jī)屏幕上顯示的僅僅是地圖的左上角部分,其余部分由于位于屏幕之外,而無法顯示。如果能讓屏幕“滾動”起來,不僅能逐漸展示完整的地圖,豐富玩家的視覺效果,而且還可以根據(jù)游戲情節(jié)需要,切換游戲場景,增加游戲的動感。在本學(xué)習(xí)單元中,首先,實(shí)現(xiàn)游戲屏幕的自動滾動,了解實(shí)現(xiàn)滾屏的基本原理;然后,與任務(wù)八中完成的成果相結(jié)合,實(shí)現(xiàn)一個簡單的滾屏飛行射擊游戲;最后,實(shí)現(xiàn)RPG游戲中的滾屏效果,即屏幕隨著游戲主角的移動而移動。第五十頁,共六十頁,2022年,8月28日4.6.2知識準(zhǔn)備:了解層管理器事實(shí)上,Sprite類和TiledLayer類的父類均是定義在包中的Layer類。Layer類是一個抽象類,表示游戲中的一個可視元素——圖層。圖層是可以在游戲畫布中單獨(dú)繪制并能夠移動的對象。每個Layer類實(shí)例都有一定的位置、寬度、高度和是否可見的狀態(tài)。Layer類的子類必須實(shí)現(xiàn)一個piant(Graphics)方法,使得它們能夠被繪制在屏幕上。游戲中不止一個圖層存在,每個加入LayerManager中的圖層都會被分配一個索引值,索引值從0開始順序分配。就想排隊一樣,先加入的排在前面,后加入的排在后面。但需要注意的是,圖層的繪制過程卻是相反的,排后面的(即索引值大的)先繪制,排前面的(即索引值小的)后繪制。顯然,后繪制的圖層將覆蓋先繪制的圖層。另外,LayerManager中的圖層索引號永遠(yuǎn)是連續(xù)的,如果一個圖層從LayerManager中被移除,那么后面圖層的索引號都將相應(yīng)地作調(diào)整,以便使得圖層索引號保持連續(xù)性。第五十一頁,共六十頁,2022年,8月28日4.6.3任務(wù)十二:實(shí)現(xiàn)游戲屏幕的自動滾動實(shí)現(xiàn)滾屏的原理:只需要在線程周期中不斷改變可視窗口的x坐標(biāo)(實(shí)現(xiàn)橫向滾動),或者改變y坐標(biāo)(實(shí)現(xiàn)縱向滾動)。然后,將改變坐標(biāo)位置后的可視窗口重新繪制在手機(jī)屏幕上即可。X軸(0,0)Y軸(0,viewY)手機(jī)屏幕可視窗口(0,0)screenHeightscreenWidthsetViewWindow(0,viewY,screenWidth,screenHeight)paint(g,0,0)第五十二頁,共六十頁,2022年,8月28日知識提煉::LayerManager類其他常用方法(1)LayerManager類構(gòu)造方法(2)append方法(3)remove方法(4)getLayerAt方法(5)getSize方法小提示:綜合使用上述三個方法,可以實(shí)現(xiàn)將加入圖層管理器對象中的圖層全部清空的功能。清空圖層管理器對象在RPG游戲的場景轉(zhuǎn)換中非常有用。參考代碼如下:publicvoidclearLayerManager(){if(lm!=null){while(lm.getSize()!=0){ lm.remove(lm.getLayerAt(0));}}System.gc();//垃圾回收}第五十三頁,共六十頁,2022年,8月28日4.6.4延伸任務(wù):實(shí)現(xiàn)滾動背景下的飛行射擊效果第五十四頁,共六十頁,2022年,8月28日4.6.5任務(wù)十三:根據(jù)主角人物的位置,重置地圖視角第五十五頁,共六十頁,2022年,8月28日要點(diǎn)提示(1)重置地圖視角所謂“重置地圖視角”就是根據(jù)主角的位置,重新設(shè)置可視窗口的位置。設(shè)置可視窗口的代碼如下:lm.setViewWindow(viewX,viewY,screenWidth,screenHeight);其中,參數(shù)viewX和viewY是可視窗口在地圖層中的左上角坐標(biāo),這個坐標(biāo)是根據(jù)主角行走時,在地圖層中的位置來確定的,并保證主角在屏幕的正中間。就像舞臺上的追光燈一樣,追著舞臺上的主角,使得主角始終位于燈光的中間。viewX=spPlayer.getX()+spPlayer.getWidth()/2-screenWidth/2;viewY=spPlayer.getY()+spPlayer.getHeight()/2-screenHeight/2;
當(dāng)然,如果主角的位置距離屏幕的上、下、左、右邊緣小于屏幕高度和寬度的一半時,當(dāng)主角繼續(xù)按原方向行走時,屏幕就不再移動了。這時,viewX和viewY的值就始終是可視窗口在地圖層中的邊界值。
viewX=0;//左邊界值
viewX=backCols*16-screenWidth;//右邊界值
viewY=0;//上邊界值
viewY=backRows*16-screenHeight;//下邊界值(2)精靈與地圖層的碰撞在本任務(wù)中,使用的地圖有兩層,0層是行走層,1層是碰撞層。主角在走動過程中,需要檢測是否和碰撞層發(fā)生了碰撞,如果碰撞,則回退并站立。精靈和地圖層的碰撞檢測方法語法如下:publicfinalbooleancollidesWith(TiledLayert,booleanpixelLevel)在碰撞檢測過程中,為了使效果更逼真一些,可以自定義精靈對象的碰撞區(qū)域。默認(rèn)情況下,精靈對象的碰撞檢測區(qū)定位在左上角(0,0),并與精靈對象的大小相同。自定義碰撞檢測區(qū)域方法的語法如下:publicvoiddefineCollisionRectangle(intx,inty,intwidth,intheight)比如,本任務(wù)中,在進(jìn)行主角和地圖碰撞層的碰撞檢測之前,首先自定義了主角精靈的碰撞檢測區(qū)域,代碼如下:spPlayer.defineCollisionRectangle(0,spPlayer.getHeight()/2,spPlayer .getWidth(),spPlayer.getHeight()/2);這樣,就將主角精靈的碰撞檢測區(qū)域定位在了下半身,當(dāng)主角精靈的上半身和碰撞層中的房屋、數(shù)木、石頭等發(fā)生重疊的時候,不會產(chǎn)生回退和站立的效果,使得主角在地圖中行走的效果更加逼真。第五十六頁,共六十頁,2022年,8月28日本章小結(jié)通過完成本章任務(wù),學(xué)習(xí)到了如何編寫一個簡單的游戲程序。知道了游戲的基本組成,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國對甲苯磺酰氯胺鈉鹽行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年中國紅曲醋數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國笨雞蛋數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國真空耐高溫蒸煮袋數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國電動吹吸葉機(jī)數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國濕度測試模塊數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國松樹林早晨工藝品數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國支承器數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國手動式油壓千斤頂數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國工兵鍬鎬數(shù)據(jù)監(jiān)測研究報告
- 2025高中物理《課時作業(yè)》人教版選擇性必修第1冊課時分層作業(yè)(八)
- 地震災(zāi)害避險與自救手冊
- 腦卒中-腦卒中的康復(fù)治療
- 十七個崗位安全操作規(guī)程手冊
- 爆花(2023年陜西中考語文試卷記敘文閱讀題及答案)
- 疫情統(tǒng)計學(xué)智慧樹知到答案2024年浙江大學(xué)
- 自主簽到培訓(xùn)課件-早安!幼兒園
- 小學(xué)項目化學(xué)習(xí)案例
- 2024住院患者靜脈血栓栓塞癥預(yù)防護(hù)理與管理專家共識要點(diǎn)(全文)
- 2024-2030年中國大宗商品行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資前景研究報告
- 強(qiáng)化提升1解三角形中的三線問題(解析)
評論
0/150
提交評論