版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、j2mej2me 手機游戲的開發(fā)手機游戲的開發(fā)-beckham-beckham goalgoal 摘摘 要要 j2me(java 2 micro edition)是近年來隨著各種不同設(shè)備,尤其是移動通信設(shè) 備的飛速發(fā)展而誕生的一項新的開發(fā)技術(shù)。它定位在消費性電子產(chǎn)品的應(yīng)用上, 對設(shè)備的智能化、多樣化,提供了革命性的解決方案,并因其“write once, run anywhere”的 java 特性而提高開發(fā)的效率。隨著手機的日益普及、java 功能在 移動設(shè)備上的實現(xiàn),java 應(yīng)用程序產(chǎn)生的手機增值服務(wù)逐漸體現(xiàn)出其影響力, 對豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。本論文著眼
2、于 j2me 技術(shù)的應(yīng)用,開發(fā)一款簡單的手機游戲程序-beckham goal。 論文在分 析了實現(xiàn)小游戲的相關(guān)基礎(chǔ)技術(shù)及理論后,對該游戲進行了功能需求分析、模 塊劃分及總體設(shè)計,解決了游戲中涉及的碰撞檢查以及其他若干關(guān)鍵技術(shù),最 后在 j2me 平臺下實現(xiàn)了該小游戲,并通過驗證達到預期的效果。 關(guān)鍵詞:關(guān)鍵詞:j2me;手機游戲; k-java;碰撞檢查 the development of j2me mobilephone game -beckham goal abstract as a new development technology, j2me (java 2 micro edit
3、ion) emerged with the development of various communications equipments, especially mobile facilities. since it is a kind consumption-oriented of electronic product, it offers a completely new solution to the intelligentization and diversification of communications equipments. besides, due to its fea
4、ture of “write once, run anywhere”, it improves the efficiency of development. along with the popularization of mobile phone and the application of java to the mobile equipments, gradually the influence of mobilephones added-value service is shown, which is produced by the application of java to the
5、 daily life and informing. this paper focuses on the application of j2me and develops a mobilephone game-beckham goal. based on the analysis of basic technique and theories, this paper conducts analysis of function demand and module measurement as well as macro-design. as a result, this paper solves
6、 the conflict detection and some other key technique. finally this paper successfully develops this mobilephone by use of j2me. and then the anticipative purpose has been met after the validation. key words: j2me; mobilephone game;k-java; conflict detection 目目 錄錄 論文總頁數(shù):25 頁 1引言 .1 1.1手機游戲概述 .1 1.2ja
7、va手機游戲的發(fā)展現(xiàn)狀.1 1.3手機游戲的發(fā)展前景 .2 2j2me 的概述與相關(guān)理論基礎(chǔ).3 2.1j2me 的簡介.3 2.2j2me 的構(gòu)架.3 2.3j2me 游戲開發(fā)基礎(chǔ)相關(guān).4 2.3.1基于精靈的動畫 .4 2.3.2gamecanvas 類來實現(xiàn)平穩(wěn)動畫.4 2.3.3圖形坐標 .5 2.3.4檢測對象之間的沖突 .5 2.4常用開發(fā)工具及其配置與使用 .5 3需求分析與設(shè)計方案 .6 3.1需求分析 .6 3.2設(shè)計方案 .7 3.3游戲初步功能設(shè)計 .8 4游戲的設(shè)計流程以及實現(xiàn) .9 4.1游戲的設(shè)計 .9 4.2游戲的實現(xiàn) .10 4.2.1.圖像和精靈的創(chuàng)建和繪制
8、.10 4.2.2.玩家按鍵移動的設(shè)置 .11 4.2.3.勝利及失敗的判定 .13 4.2.4.球員運動軌跡的設(shè)置 .15 4.2.5.游戲中分數(shù)的記錄 .16 4.3碰撞沖突機制的實現(xiàn) .20 5系統(tǒng)測試 .20 結(jié) 論 .22 參考文獻 .23 致 謝 .錯誤!未定義書簽。錯誤!未定義書簽。 聲 明 .錯誤!未定義書簽。錯誤!未定義書簽。 第 1 頁 共 25 頁 1 1 引言引言 1.11.1 手機游戲概述手機游戲概述 手機游戲幾乎是當今市面上所有手機所必有的。在幾年前的機型中,游戲 都是手機中自帶的,稱為嵌入式游戲,由手機生產(chǎn)廠商設(shè)計并直接嵌入在手機 里面。這樣的游戲用戶不能自行開發(fā)
9、、添加及刪除,其游戲種類取決于不同的 機型,是一種單機游戲。隨后的幾年興起了一種基于短信的游戲,由用戶發(fā)送 特定字符串給短信游戲提供商,來控制游戲的動作或劇情的發(fā)展。隨著 wap 的 興起,出現(xiàn)了一種基于瀏覽器的游戲,和短信游戲差不多,由用戶手機通過 wap 登錄游戲提供商所提供的網(wǎng)址,然后填寫或選擇相應(yīng)表單來操作游戲。上 面兩類游戲都是基于文本的,操作比較繁瑣,游戲性不強。短信游戲每做一次 操作(也就是發(fā)送一條短信)需要花費一毛錢;wap 游戲無論是通過 csd 上網(wǎng) 還是通過 gprs 上網(wǎng)都需要出上網(wǎng)費用。兩種游戲的花費都比較高。現(xiàn)在新出的 手機很大一部分都支持 java 程序下載,而且
10、這是一種趨勢。由 java 開發(fā)的游 戲可以對圖像進行操作,是動態(tài)的。而且可以接入網(wǎng)絡(luò),既可以開發(fā)單機游戲 也可以開發(fā)網(wǎng)絡(luò)游戲。隨著彩屏手機的普及,游戲可以不再是黑白的,可隨心 所欲的為游戲中的不同物體賦予不同的顏色。 過去的手機是一個封閉的操作系統(tǒng),除非用廠商自己的軟件和工具,否則 無法對手機的菜單進行改動,更無法在手機上附加其他應(yīng)用。而 k-java 技術(shù)的 應(yīng)用將擺脫這些傳統(tǒng)的束縛,k-java 編寫的應(yīng)用程序可以兼容不同的網(wǎng)絡(luò)協(xié)定, 簡單說就是,只要網(wǎng)絡(luò)內(nèi)容服務(wù)提供商提供 k-java 服務(wù),用戶的 k-java 手機 就可以擁有無限擴充應(yīng)用的能力。k-java 服務(wù)是一種新的移動數(shù)據(jù)
11、業(yè)務(wù)的增值 服務(wù),它為用戶提供了一個開放的平臺,能更好地為用戶提供全新圖形化、動 態(tài)化的移動增值服務(wù)。用戶使用支持 k-java 功能的手機終端,接入網(wǎng)絡(luò)內(nèi)容服 務(wù)提供商的 k-java 服務(wù)平臺,可以通過手機隨意下載 java 應(yīng)用軟件,能方便 地享受類似于 internet 上的各種服務(wù),如下載游戲、動漫、小說等,也可進行 各種在線應(yīng)用,如聯(lián)網(wǎng)游戲、收發(fā)郵件、證券炒股、信息查詢等。 1.21.2 javajava 手機游戲的發(fā)展現(xiàn)狀手機游戲的發(fā)展現(xiàn)狀 在歐美市場,由于較早采用 gprs 技術(shù),所以歐洲和美國運營商的 k-java 也開展得較早,不過早期的應(yīng)用并沒能在個人消費市場激起太大的波
12、瀾。而日 韓的無線數(shù)據(jù)業(yè)務(wù)從發(fā)展之初就將目標鎖定在了游戲、娛樂等個人消費方面。 k-java 技術(shù)能夠利用手機有限的硬件條件使得 pc 上大量的互動性娛樂、游戲 應(yīng)用在手機上,正是憑借著這一技術(shù)特點,k-java 迅速成為了手機游戲的主流 編程語言。在歐美市場,2002 年此項業(yè)務(wù)的直接收入已經(jīng)超過了 2.45 億美元。 第 2 頁 共 25 頁 在中國,2003 年 2 月 15 日,中國移動開始了大范圍的 k-java 應(yīng)用測試。 4 月 8 日,無線 k-java 服務(wù)被移動正式定名為“百寶箱” ,并全面開始免費試 用。而在發(fā)展較快的廣東地區(qū),更是從 5 月 17 日開始了大規(guī)模的 k-
13、java 業(yè)務(wù) 推廣,投入資金多達千萬元。7 月 1 日,中國移動宣布了“百寶箱”正式商用 的消息,k-java 在中國市場的掘金旅程也將由此開啟。 但是,k-java 目前在中國的發(fā)展速度卻不夠快,主要的原因是用戶群體不 足。首先是終端不足。在市場上,能夠支持 k-java 的手機很少,而且?guī)缀醵际?幾個國外主流品牌,其定位也較高,而國內(nèi)品牌,介于成本和技術(shù),一般都不 含 k-java 功能。與此同時,大量已有手機的老用戶不會因此功能而重新購置一 臺新的手機。其次,在擁有 k-java 功能的手機用戶群體中,懂得或者愿意使用 k-java 的人卻更少。所以,我們必須期待更多含有 k-java
14、 功能的面向各個消 費群體的手機上市和普及,以及用戶對手機附加功能使用意識的加強。 1.31.3 手機游戲的發(fā)展前景手機游戲的發(fā)展前景 由 juniper research 發(fā)布的最新調(diào)查說明,java 手機游戲在 2008 年將會 獲得超過 63 億美元得收益。據(jù) idc 預計,僅在美國,整個手機無線游戲業(yè)務(wù)的 硬件、軟件以及服務(wù)所帶來的收入在 2006 年將達到 40 億美元,而更別說有著 更大手機無線游戲市場潛力的日本、韓國和中國等亞洲市場。預計到 2006 年, 全球的無線游戲市場總值將達 170 億美元。研究機構(gòu) informa 分析說,手機游 戲是全球游戲市場中增長最快的部分,其產(chǎn)
15、值將從 2002 年的 2.43 億美元上升 至 2007 年的 38 億美元。英國市場研究機構(gòu) analysysltd 在這份研究報告中稱, 隨著彩屏智能手機的廣泛應(yīng)用和手機功能不斷升級,游戲市場預期將從 2002 年 的 2 億歐元,至 2008 年時增長到接近 30 億歐元。frost playerhead = image.createimage(/playerhead.png); playersprite = new sprite(image.createimage(/player.png), 22, 22); playersprite.setposition(2, 77); ball
16、sprite = new sprite(image.createimage(/ball.png), 14, 10); ballsprite.setposition(18, 85); npcsprite0 = new sprite(image.createimage(/npc1.png); npcsprite0.setposition(30, 4); npcyspeed0 = 1; npcsprite1 = new sprite(image.createimage(/npc2.png); npcsprite1.setposition(72, 4); npcyspeed1 = 2; npcspri
17、te2 = new sprite(image.createimage(/npc3.png); npcsprite2.setposition(113, 4); npcyspeed2 = -1; npcsprite3 = new sprite(image.createimage(/npc4.png); npcsprite3.setposition(148, 98); npcyspeed3 = -2; 第 11 頁 共 25 頁 catch (ioexception e) system.err.println(failed loading images!); 這段代碼首先創(chuàng)建了背景和玩家腦袋圖像,然
18、后開始創(chuàng)建精靈。并且每個 精靈都被設(shè)置到屏幕的指定位置。雖然我們能夠用游戲屏幕和精靈的寬度和高 度來列出一個通用的精靈位置的方程式,但是這樣通過硬性編碼來確定位置還 是更加的容易和準確。位置定下來以后,球員精靈的速度需要我們來設(shè)置,這 樣他們就能按照我們所設(shè)置的速度來行進了。 由于游戲中有相當多的圖形對象,hcanvas 類的 draw()方法就比較簡單。 就拿繪制足球場背景為例,通過下面的代碼就能實現(xiàn): g.drawimage(background, (0-70), 0, graphics.top | graphics.left); 對于玩家精靈和足球精靈的繪制,也就是游戲中最重要的圖形對象
19、。代碼 如下: playersprite.paint(g); ballsprite.paint(g); 球員精靈的繪制,只需要把 paint()方法的調(diào)用放入到循環(huán)中,就可以繪 制完每輛汽車。代碼如下: for (int i = 0; i 2) int keystate = getkeystates(); if (keystate playersprite.nextframe(); ballsprite.move(-6, 0); ballsprite.nextframe(); else if (keystate 第 12 頁 共 25 頁 playersprite.nextframe(); b
20、allsprite.move(6, 0); ballsprite.nextframe(); if (keystate playersprite.nextframe(); ballsprite.move(0, -6); ballsprite.nextframe(); else if (keystate playersprite.nextframe(); ballsprite.move(0, 6); ballsprite.nextframe(); else if (keystate ballxspeed = 6; ballyspeed = 6; checkbounds(playersprite,
21、false); checkbounds(ballsprite, false); / reset the input delay inputdelay = 0; 它在每次游戲循環(huán)的時候都要遞增,而每 3 次游戲循環(huán)就允許一次按鍵發(fā) 生。也就是說,按鍵的響應(yīng)速度減小為游戲循環(huán)速度的三分之一,這就限制了 玩家的移動速度,使得這個簡單的游戲更好玩、更具有挑戰(zhàn)性。當按鍵被檢測 到,代碼就將玩家精靈和足球精靈移動一定的位置,然后調(diào)用 nextframe()來 改變它的幀圖像。checkbounds()的調(diào)用,它用來確保玩家還在游戲屏幕的邊界 之內(nèi)。它允許玩家折返精靈或者是把精靈限制在屏幕邊界內(nèi)移動。第二個
22、參數(shù) 決定了它會采取哪種行為,true 便是精靈折返,而 false 表示防止精靈移動超 第 13 頁 共 25 頁 出屏幕邊界。 在游戲中加入了足球精靈,游戲開始的時候玩家精靈和足球精靈能同時控 制,但是當玩家按 fire 鍵時,足球就會踢出去,并且此時玩家精靈的移動不能 控制足球精靈的移動。只有當玩家精靈在此和足球精靈發(fā)生沖突的時候,玩家 精靈的移動才能在此控制到足球精靈的移動。代碼如下: if (ballsprite.collideswith(playersprite, true) if (+inputdelay 2) int keystate = getkeystates(); . 對
23、于碰撞的實現(xiàn),在 wireless toolkit 中的 midp 2.0 的 game 包中所包含 的 collideswith 中有碰撞檢測,但是由于該游戲主要的事件響應(yīng)基本上于沖突 有關(guān),有關(guān)沖突的實現(xiàn)將在本章最后進行講解。 4.2.3.4.2.3. 勝利及失敗的判定勝利及失敗的判定 update()方法檢查足球在每次移動后是否通過邊界,下面的代碼用來查看 足球是否安全通過: if (ballsprite.getx() 154) /播放通過的聲音 try celebrateplayer.start(); catch(mediaexception me) /重置玩家和足球的位置并增加積分
24、playersprite.setposition(2, 77); ballsprite.setposition(18, 85); score += 25; 數(shù)字 154 表示的是游戲屏幕上結(jié)束的水平位置,如果足球的位置大于這個 位置的話,玩家就算是安全通過。此時會播放勝利通過的聲音。表示一次安全 通過,玩家精靈和足球精靈的位置都被重置為起始位置,得分增加 25 點。 for (int i = 0; i 4; i+) /移動球員精靈 第 14 頁 共 25 頁 npcspritei.move(0, npcyspeedi); checkbounds(carspritei, true); / 檢查足
25、球和球員之間的沖突 if (ballsprite.collideswith(npcspritei, true) /播放沖突聲音表示失去一次機會 try squishplayer.start(); catch(mediaexception me) /檢查游戲是否結(jié)束 if (-numlives = 0) gameover = true; else /重置玩家和足球位置 playersprite.setposition(2, 77); ballsprite.setposition(18, 85); /不必再繼續(xù)更新球員精靈 break; 對于游戲精靈的更新,我們還需要更重要的方法,它就是 upda
26、te(),在游 戲中 update()方法負責各種至關(guān)重要的任務(wù),例如處理用戶輸入、移動玩家、 更新球員精靈和檢查足球是否碰到球員和足球是否通過邊界,以及 update()方 法檢查游戲是否重新啟動: if (gameover) int keystate = getkeystates(); if (keystate ballsprite.setposition(18, 85); 第 15 頁 共 25 頁 gameover = false; score = 0; numlives = 3; / 游戲結(jié)束,所以不做任何更新 return; 這段代碼首先查看游戲是否結(jié)束,只有在這個時候,重新啟動游
27、戲才有意 義。開火(fire)按鍵用來重新啟動已經(jīng)結(jié)束的游戲。這個按鍵會根據(jù)手機的 不同而不同,但是在 j2me 模擬器中,它就是主 select 按鍵,和用來模擬的電 腦的 enter 鍵相對應(yīng)。update()方法中的游戲重啟動代碼重新設(shè)置了玩家精靈 的位置,清空了 gameover 變量,把分數(shù)重置為 0,并且把剩下的玩家的數(shù)目重 新設(shè)置為 3。 4.2.4.4.2.4. 球員運動軌跡的設(shè)置球員運動軌跡的設(shè)置 每個球員精靈都按照變量 npcyspeed 的速度在 y 方向上移動,npcyspeed 是一個包含了球員的垂直方向速度的數(shù)組。然后精靈會折返。如果需要的話: 只要調(diào)用 check
28、bounds()方法并把一個 true 值作為第二個參數(shù)傳遞給它。這個 只是一個單向的移動。為了增加游戲的可玩性。我們將其中的一個精靈 3 設(shè)置 為守門精靈。通過設(shè)置一個結(jié)界來控制守門精靈的移動,讓守門精靈在我們想 要的位置循環(huán)移動。代碼如下: if (npcsprite3.gety() 98) npcsprite3.setposition(148, 98); npcyspeed3 = -2; 如果變量 numlives 的值減少到了 0,就表示游戲結(jié)束了,于是 gameover 被設(shè)置為 true。否則,玩家精靈和足球精靈的位置被重置并且游戲繼續(xù)。只有 當沖突發(fā)生的時候循環(huán)中斷。 由于游戲中
29、有相當多的圖形對象,hcanvas 類的 draw()方法就比較簡單。 就拿繪制足球場背景為例,通過下面的代碼就能實現(xiàn): 第 16 頁 共 25 頁 g.drawimage(background, (0-70), 0, graphics.top | graphics.left); 對于玩家精靈和足球精靈的繪制,也就是游戲中最重要的圖形對象。代碼 如下: playersprite.paint(g); ballsprite.paint(g); 球員精靈的繪制,只需要把 paint()方法的調(diào)用放入到循環(huán)中,就可以繪 制完每輛汽車。代碼如下: for (int i = 0; i 4; i+) npc
30、spritei.paint(g); 4.2.5.4.2.5. 游戲中分數(shù)的記錄游戲中分數(shù)的記錄 最后在游戲中會記錄玩家的得分情況,并且在游戲開始的時候就要運行, 這個方法是從最高得分記錄存儲中讀取最高得分列表的理想方法。存儲的只是 5 個數(shù)字,也就是需要一個 int 數(shù)據(jù)類型就足夠存儲最高得分記錄列表中的每 個分數(shù)。但是由于記錄存儲中的記錄數(shù)據(jù)總是存儲在一個 byte 數(shù)組中,而不是 在整數(shù)中。因此,我們要把最高得分在整數(shù)和 byte 數(shù)組之間來回轉(zhuǎn)換??梢杂?下面這行代碼完成這個任務(wù): byte recorddata = integer.tostring(hiscore).getbytes(
31、); 最高得分存儲在一個名為 hiscore 的變量中,它首先通過靜態(tài) interger.tostring()方法轉(zhuǎn)換為一個字符串。然后通過調(diào)用 getbytes()方法 把這個字符串轉(zhuǎn)換為一個 byte 數(shù)組。這行代碼就是把一個整數(shù)最高得分轉(zhuǎn)換為 一個 byte 數(shù)組所需的代碼,并且它適合在寫入一個記錄存儲的時候使用。圖 8 示意了從一個 byte 數(shù)組到一個整數(shù)的轉(zhuǎn)換過程。 圖 8 byte 數(shù)組到一個整數(shù)的轉(zhuǎn)換過程 對于寫入一個最高得分所需要的轉(zhuǎn)換的反向過程來說,把最高得分數(shù)據(jù)讀 入到一個有意的格式中是必須的。從一個 byte 數(shù)組開始,并且使用一個字符串 作為中間類型,從而把 byte
32、 數(shù)組轉(zhuǎn)換為一個單獨的整數(shù)值。下面的代碼執(zhí)行這 一轉(zhuǎn)換: hiscore = (integer.parseint(new string(recorddata, 0, len); 第 17 頁 共 25 頁 這段代碼中使用的構(gòu)造函數(shù) string()需要一個 byte 數(shù)組和一個偏移量, 以及需要轉(zhuǎn)換的字節(jié)數(shù)。表示字節(jié)數(shù)的變量 len 是作為讀取記錄數(shù)據(jù)的 getrecord()方法的返回值而得到的。然后,字符串被傳遞到靜態(tài)方法 interger.parseint()中,完成到一個整數(shù)的轉(zhuǎn)換。圖 9 示意了反向轉(zhuǎn)換過程, 其中包括從一個記錄存儲讀入一個整數(shù)最高得分。 圖 9 一個整數(shù)到 byte
33、 數(shù)組的轉(zhuǎn)換過程 游戲的最高得分在游戲運行開始的時候就要執(zhí)行,所以在 start()方法中 用來從一個記錄存儲讀取最高得分: readhiscores(); readhiscores()方法負責打開一個記錄存儲并每次讀取一個最高得分到 hiscores 整數(shù)數(shù)組中。 private void readhiscores() recordstore rs = null; try rs = recordstore.openrecordstore(hiscores, false); catch (exception e) if (rs != null) / read the hi score reco
34、rds try int len; byte recorddata = new byte8; for (int i = 1; i recorddata.length) recorddata = new byters.getrecordsize(i); len = rs.getrecord(i, recorddata, 0); hiscoresi - 1 = (integer.parseint(new string(recorddata, 0, len); catch (exception e) system.err.println(failed reading hi scores!); try
35、rs.closerecordstore(); catch (exception e) system.err.println(failed closing hi score record store!); else for (int i = 0; i 5; i+) hiscoresi = 0; readhiscores()方法開始的時候先嘗試打開名為“hiscores”的記錄存儲。 方法的第二個參數(shù)(false)表明如果指定名字的記錄存儲沒有找到的話,就不 會創(chuàng)建一個新的記錄存儲。如果記錄存儲成功地打開,readhiscores()方法接 下來遍歷記錄并每次讀取一個,將記錄讀入到 hiscore
36、s 整數(shù)數(shù)組中。讀取完最 高得分以后,記錄存儲關(guān)閉。 writehiscores()方法負責把整數(shù)數(shù)組 hiscores 寫入到 hiscores 記錄存儲 中。 private void writehiscores() try recordstore.deleterecordstore(hiscores); 第 19 頁 共 25 頁 catch (exception e) recordstore rs = null; try rs = recordstore.openrecordstore(hiscores, true); catch (exception e) system.err.pr
37、intln(failed creating hi score record store!); for (int i = 0; i 5; i+) / format each score for writing byte recorddata = integer.tostring(hiscoresi).getbytes(); try rs.addrecord(recorddata, 0, recorddata.length); catch (exception e) system.err.println(failed writing hi scores!); try rs.closerecords
38、tore(); catch (exception e) system.err.println(failed closing hi score record store!); writehiscores()方法采取了一種獨特的方法來寫入最高得分。這個方法刪 除整個記錄存儲并寫入一個新的記錄存儲,而不是嘗試找到具體的最高得分記 錄并替代它。刪除了記錄存儲后,writehiscores()打開一個新的記錄存儲,此 時要確保把 true 作為參數(shù)傳遞給 openrecordstore()方法,以保證新的存儲記 錄能夠創(chuàng)建。然后遍歷 hiscores 數(shù)組,并且每個最高得分記錄都被寫入到新創(chuàng) 第 20
39、頁 共 25 頁 建的記錄存儲中。當所有的最高得分記錄寫入后,調(diào)用 closerecordstore()方 法關(guān)閉記錄存儲。 4.34.3 碰撞沖突機制的實現(xiàn)碰撞沖突機制的實現(xiàn) 碰撞代碼的算法,可以考慮是兩個精靈之間的距離來檢測是否發(fā)生了碰撞。 如我們將 a 精靈的中心坐標設(shè)為(x1,y1),把 b 精靈的坐標設(shè)為(x2,y2),在實現(xiàn) 代碼中我們只需要把 a 到 b 之間的距離設(shè)置為一個定值,我們可以考慮為 c,如 果|ab|c 則可以檢測 a 精靈和 b 精靈之間發(fā)生了沖突。如圖 10 所示: 圖 10 點與點之間距離判斷法 我們可以把 a 到 b 中心點之間看成一個三角形的話,根據(jù)勾股定
40、理。我們 可以得出如下公式: c =sqrt(a*a+b*b) a =|x2-x1| b =|y2-y1| 也可以采用點到矩形的判斷方法,它的實現(xiàn)機制為,把精靈 a 的坐標看成 一個點(x1,y1),把另外一個精靈 b 看成一個矩形,給出 b 的三點坐標即可,我 們可以把這三點坐標標記為(x2,y2),(x3,y3),(x4,y4),要檢測是否發(fā)生了碰撞 沖突我們只需要判斷精靈 a 所給出的坐標是否是在矩形的這個坐標區(qū)域內(nèi),也 就是我們之需要看一下關(guān)系是否成立: x2x1x3 y2y1y4 以上碰撞檢測的兩個較好的實現(xiàn)算法。 5 5系統(tǒng)測試系統(tǒng)測試 這個游戲相對于其它的手機游戲可能比起來要簡單
41、多了,不過測試起來還 是會覺得非常的有意思。在初期對代碼的調(diào)試中,由于 sdk 的選擇(最先用的 是 sdk1.5.1) ,造成對于代碼的編譯不能成功執(zhí)行。后來在老師的指導下?lián)Q成 了 j2sdk1.4.2,解決了該問題?,F(xiàn)在面對的就是對于改變了足球移動的精靈的 速度后,會出現(xiàn)一些問題。和對于碰撞類代碼。沒有能找到 midp2.0 的源代碼。 第 21 頁 共 25 頁 但是對于碰撞的代碼在老師的指導下已有了一些研究。 在游戲開始的時候玩家的位置會出現(xiàn)在屏幕的左邊位置,而敵人此時能夠 上下移動來阻礙我們的玩家順利的通過游戲。在屏幕的右方則會有個守門員。 屏幕的最左上的小頭像為告訴玩家還可能進行游
42、戲的次數(shù),屏幕最右上方的數(shù) 字則是表示玩家目前所取得的分數(shù)。下圖 10 則是游戲開始時的圖像。 圖 10 游戲開始時效果圖 在游戲中當玩家的足球不小心碰到敵人(防守隊員或者守門員)的時候, 玩家的位置則會重新回到游戲開始的地方,并且在屏幕的左上方出的小頭像會 減少一個。圖 11 顯示的是當玩家失去一次機會后的情況。 圖 11 失去了一次機會 當玩家把足球踢出去后,玩家的再次移動將不會導致足球的移動。圖 12 顯 示了玩家把足球踢出去后的移動情況,下方的足球?qū)⒉辉陧樦婕业囊苿佣?動。 圖 12 玩家踢出球后的移動情況 當玩家每次勝利一次后,屏幕右上方的數(shù)字會增加,來顯示玩家這個時候 在游戲中的得分情況。圖 13 顯示了玩家勝利一次后的得分。 第 22 頁 共 25 頁 圖 13 分數(shù)的增加情況 如果玩家的三次機會用完了的話,就會退出游戲,顯示玩家本次游戲所得 的總得分以及歷次得分的情況記錄,圖 14 顯示的是最后的得分屏。 圖 14 游戲結(jié)束時的得分屏 結(jié)結(jié)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度企業(yè)知識產(chǎn)權(quán)質(zhì)押貸款合同-@-2
- 課題申報參考:能源轉(zhuǎn)型下居民親環(huán)境行為的變遷趨勢及提升路徑研究
- 課題申報參考:面向韌性發(fā)展的城市群醫(yī)療資源供需適配研究
- 2025年個人無息借款合同樣本:無息借款協(xié)議:扶持文化藝術(shù)項目2篇
- 二零二五版民政局批準離婚協(xié)議書范本8篇
- 2025年度綠色能源項目內(nèi)部股東權(quán)益轉(zhuǎn)讓合同4篇
- 二零二五年度南京市房產(chǎn)局制定的房屋抵押權(quán)登記合同模板4篇
- 2025年度戀愛期間共同理財規(guī)劃與投資合同4篇
- 2025年度個人信用借款擔保合同范本3篇
- 2025版車輛抵押借款合同(含貸款利率調(diào)整)4篇
- 護理飲食指導整改措施及方案
- 項目工地春節(jié)放假安排及安全措施
- 印染廠安全培訓課件
- 紅色主題研學課程設(shè)計
- 胸外科手術(shù)圍手術(shù)期處理
- 裝置自動控制的先進性說明
- 《企業(yè)管理課件:團隊管理知識點詳解PPT》
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)二 軟文的寫作
- 英語詞匯教學中落實英語學科核心素養(yǎng)
- 《插畫設(shè)計》課程標準
- 高中英語名詞性從句講解
評論
0/150
提交評論