基于android操作系統(tǒng)的足球小將手機游戲畢業(yè)論文_第1頁
已閱讀1頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p><b>  畢 業(yè) 論 文</b></p><p>  題目:基于Android操作系統(tǒng)的足球小將手機游戲 </p><p>  摘要: 近年來,隨著經(jīng)濟的日益發(fā)展,人們的生活水平不斷提高,生活質(zhì)量也在漸漸的改善。適當?shù)挠螒驅(qū)θ藗兊臉I(yè)余生活是不可必缺的。說到游戲,種類有好多種。在電腦游戲上的分類也很多。RCG(賽車游戲)、FTG(格斗游戲)、SPG(

2、體育游戲)、RPG(角色扮演)、ACT(動作游戲)、AVG(冒險游戲)、PUZ(益智游戲) 等等。雖說繁多的游戲種類讓人目不暇接,游戲的可玩性、可延續(xù)性和可對比性是益智類游戲深受各年齡階層玩家歡迎的原因。當今網(wǎng)絡(luò)發(fā)展迅速,益智類游戲被廣泛運用到網(wǎng)絡(luò)各大平臺上。借鑒網(wǎng)絡(luò)各大平臺上的益智游戲,我利用java 、Android API語言開發(fā)了本游戲項目。我通過Eclipse 、Android SDK 利用Java語言編寫的《足球小將》,在游

3、戲中控制自己的球員擊球、進門,達到一定分數(shù)獲得勝利。</p><p>  關(guān)鍵字: 足球小將;道具;聲音;分數(shù);關(guān)卡</p><p>  ABSTRACT: In recent years, growing as the economy, improving people's living standard and quality of life has also gradual

4、ly improved. Appropriate games on people’s spare time are not lack of will. There are so many kind of game. Also the classification of the computer games. Such as RCG (racing game), FTG (Fighting Game), SPG (sports gam

5、es), RPG (role playing), ACT (action game), AVG (adventure game), PUZ (Puzzle Games) and so on. Although there are too many kinds for the eye to take in.</p><p>  Key words: Football Soccer;Prop; sound;

6、 scores; levels</p><p>  目 錄</p><p>  前言……………………………………………………………………3</p><p>  相關(guān)研究綜述…………………………………………………………5</p><p>  研究的目標、內(nèi)容與意義……………………………………………6</p><

7、p>  3.1 研究目標…………………………………………………………6</p><p>  3.2 研究主要內(nèi)容……………………………………………………6 </p><p>  3.2 研究的意義………………………………………………………6 </p><p>  Android程序設(shè)計相關(guān)技術(shù)概論……………………………………..8</p><

8、;p>  4.1 XML界面布局………………………………………………….9</p><p>  4.2 Android的Activity組件………………………………………9</p><p>  4.3 SQLite數(shù)據(jù)庫………………………………………………….9</p><p>  4.4 Android 2D圖形編程…………………………………………9<

9、/p><p>  游戲研究的重點、算法與思路……………………………………… 10</p><p>  5.1游戲研究的重點……………………………………………10</p><p>  5.2游戲研究的算法……………………………………………16</p><p>  5.3游戲界面………………………………........………………20</p&g

10、t;<p>  5.4游戲的思路…………………………………………………26</p><p>  論文總結(jié)…………………………………………………………… 28</p><p>  參考文獻…………………………………………………………………… 30</p><p>  致謝………………………………………………………………………...31</p>

11、<p>  附錄一(游戲截圖)…………………………………………………............32</p><p><b>  前 言</b></p><p>  現(xiàn)在,游戲的類型也由最初的動作游戲和簡單益智游戲向更復雜、更高智力,更具真實性的游戲發(fā)展。目前的游戲種類繁多,包括角色扮演、仿真模擬類、人工智能、休閑類、渲染類、網(wǎng)絡(luò)類等等,甚至有的游戲包含了

12、好幾種類型。</p><p>  足球小將游戲一直以來都很多。但仿真模擬類的游戲卻有不少,現(xiàn)在休閑類的技術(shù)廣泛的應(yīng)用到很多游戲里面等等。最廣泛應(yīng)用的應(yīng)該就是交換排列檢測。隨著技術(shù)的不斷提高,玩家對游戲真實性的要求也不斷提高。相信益智類游戲的技術(shù),以后會更加深入各種游戲之中。</p><p>  鑒于游戲的對社會的巨大影響力和光輝的發(fā)展前景,以及我們自己對游戲愛好,這次的畢業(yè)設(shè)計我們決定嘗試

13、設(shè)計和制作一個具有一定可玩性的游戲。期間,我們收集相關(guān)資料、研究同類型的游戲、閱讀有關(guān)這類型游戲和相關(guān)技術(shù)性的書籍,通過制作游戲項目來熟悉游戲的制作思路、過程,加深對面向?qū)ο缶幊陶Z言的掌握,培養(yǎng)自己的耐心、細心和考慮問題的全面性,同時解決本課題要完成的問題,如游戲框架如何構(gòu)建,如何將DirectX的內(nèi)容封裝,如何完善游戲的各種功能,如何能讓游戲有音樂和音效的實現(xiàn),如何能讓游戲過關(guān),如何能讓游戲界面美觀,看起來舒服感覺。</p>

14、;<p><b>  二、相關(guān)研究綜述</b></p><p>  近年來,國內(nèi)外的專家學者以及一線的開發(fā)人員從理論、方法、技術(shù)等不同的角度對Android手機操作系統(tǒng)進行了一定的研究。本小節(jié)將從Android手機操作系統(tǒng)的發(fā)展歷程、研究現(xiàn)狀、程序開發(fā)設(shè)計簡介四個方面分析總結(jié)國內(nèi)外的相關(guān)研究結(jié)果。</p><p>  今天我們來聊一聊Android系統(tǒng)的

15、歷史,首先我們就要先來說說Android系統(tǒng)這個名字的來歷。Android這一次最先出現(xiàn)在法國作家利爾 亞當在1886年發(fā)飆的科幻小說《未來夏娃》中,作者將外表像人類的機器起名為Android,這也就是Android小人名字的由來。</p><p>  知道了Android名字的來歷我們再來看一下Android系統(tǒng)的來歷。Android系統(tǒng)一開始并不是由谷歌研發(fā)出來了,Android系統(tǒng)原來的公司名字就叫做And

16、roid,谷歌公司在2005收購了這個僅成立22月的高科技企業(yè)。Android系統(tǒng)也開始由谷歌接手研發(fā),Android系統(tǒng)的負責人以及Android公司的CEO安迪·魯賓成為谷歌公司的工程部副總裁,繼續(xù)負責Android項目的研發(fā)工作。</p><p>  在2007年11月5日這天,谷歌公司正式向外接展示了這款名為Android的操作系統(tǒng),并且在這天谷歌宣布建立一個全球性的聯(lián)盟組織,該組織由34家 手

17、機制造商、軟件開發(fā)商、電信運營商以及芯片制造商共同組成。這一聯(lián)盟將支持谷歌發(fā)布的手機操作系統(tǒng)以及應(yīng)用軟件,將共同開發(fā)Android系統(tǒng)的開放源 代碼。</p><p>  三、研究的目標、內(nèi)容與意義</p><p><b>  3.1 研究目標</b></p><p>  本項目主要研究的目標分為:程序設(shè)計思想實踐改進目標、Android平臺手

18、機開發(fā)技術(shù)的研究目標。</p><p>  (1)運用面向?qū)ο蟮木幊趟枷虢y(tǒng)一過程,對Chess足球小將手機游戲的系統(tǒng)結(jié)構(gòu)、過程、功能等要素進行可視化的描述,為Android程序設(shè)計的可視化提供方法、技術(shù)上的支持,為系統(tǒng)的理論模型和軟件建模提供參照。</p><p> ?。?)本系統(tǒng)中使用了多種基于Android平臺的軟件開發(fā)技術(shù),根據(jù)要實現(xiàn)的系統(tǒng)功能,系統(tǒng)需要使用到的技術(shù)及技術(shù)研究的目標主

19、要有:</p><p>  手機游戲用戶界面的人性化、個性化界面布局,給用戶以良好的游戲體驗;</p><p>  移動設(shè)備上的圖形編程,提供流暢靚麗的游戲過程界面;</p><p>  3.2 研究主要內(nèi)容</p><p>  項目研究的內(nèi)容主要有以下二大塊:</p><p>  第一部分是手機游戲的界面設(shè)計和背景音

20、效的設(shè)計。和PC上的游戲開發(fā)有些許不同,手機游戲更加的注重用戶體驗,一個人性化的、時尚靚麗的游戲界面和優(yōu)美個性化的音效設(shè)計是一個成功的手機游戲要達到的基本要求。</p><p>  第二部分是對局智能程序的設(shè)計。可以和設(shè)計好的AI(Artificial Intelligence)算法進行游戲。人工智能程序設(shè)計是一項對算法要求很高的程序設(shè)計,特別是在手機這種硬件資源緊缺的環(huán)境中,更是需要一個高效的算法來提供強大的A

21、I對局支持</p><p><b>  3.3 研究的意義</b></p><p>  游戲制作的目的是滿足了人們休閑的需要,在緊張工作之余益智類的小游戲能夠給人帶來最大程度的放松,也可以增進人們之間的交流,溝通,通過游戲還可以認識更多的朋友,也可以到達跨省、跨市,甚至跨國間人們互相娛樂的目的。而消消看游戲?qū)W會鍛煉眼力,時間利用快速、連續(xù)的移動,在十行十列限制區(qū)內(nèi),交

22、換相對一致球移動。消消看除了掌握正確的動作和遵循一般的規(guī)律以外,還應(yīng)學會一些特殊的變化。變節(jié)奏和變位置的,以避免加分被對手贏了。應(yīng)掌握多種方式的移動球,做到能里能外,而且學會多獲取隨機出現(xiàn)增加的新球。</p><p>  足球小將游戲是一個比較經(jīng)典的游戲,根據(jù)軟件工程有關(guān)的規(guī)范,以合理的開發(fā)原則,設(shè)計出消消看游戲,并給人們的生活帶來唯美的藝術(shù)享受和健康愉快的補充。</p><p>  游戲

23、軟件是一種與文化背景密切聯(lián)系的產(chǎn)品,具有很強的民族性和豐富的文化內(nèi)涵。伴隨著游戲軟件在市場上的銷售,與其相關(guān)的文化也隨之傳播。因此發(fā)展我國自主的益智、健康的游戲軟件已是當務(wù)之急。游戲是一種基于計算機的應(yīng)用軟件,是新型的休閑娛樂方式。當前開發(fā)的游戲軟件應(yīng)該做到知識性、娛樂性、趣味性、教育性相統(tǒng)一。</p><p>  通過此次課題的設(shè)計,掌握制作一個游戲軟件的方法,以及制作游戲軟件的整個流程,制作游戲軟件的步驟,為

24、以后的就業(yè)工作打下基礎(chǔ)。</p><p>  Android程序設(shè)計相關(guān)技術(shù)概論</p><p>  Android作為一個移動設(shè)備的平臺,其軟件層次結(jié)構(gòu)包括了一個操作系統(tǒng)(OS),中間件(MiddleWare)和應(yīng)用程序(Application)。根據(jù)Android的軟件框圖,其軟件層次結(jié)構(gòu)自下而上分為以下幾個層次:</p><p>  圖4.1 Android系

25、統(tǒng)架構(gòu)</p><p>  4.1 XML界面布局</p><p>  XML 是一種基于 XML 的語言,因此需要對 XML(特別是 XML 名稱空間)很熟悉。XML是英文“XML User Interface Language”的首字母縮寫。顧名思義,它是一種應(yīng)用XML來描述使用者界面的標示語言。 </p><p>  4.2 Android的Activity組

26、件</p><p>  Activity,一般代表手機屏幕的一屏,相當于瀏覽器的一個頁面。在Activity中添加view,實現(xiàn)應(yīng)用界面和用戶交互。一個應(yīng)用程序一般由多個Activity構(gòu)成,這些Activity之間可互相跳轉(zhuǎn),可進行頁面間的數(shù)據(jù)傳遞。每個Activity都有自己的生命周期。</p><p>  4.3 SQLite數(shù)據(jù)庫</p><p>  在An

27、droid平臺上,集成了一個嵌入式關(guān)系型數(shù)據(jù)庫—SQLite。SQLite是支持結(jié)構(gòu)化查詢的輕量級數(shù)據(jù)庫,能很好得適應(yīng)于移動設(shè)備的應(yīng)用。</p><p>  Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作數(shù)據(jù)庫的API,使用該類可以完成對數(shù)據(jù)進行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。</p&

28、gt;<p>  4.4 Android 2D圖形編程 </p><p>  1、Simple Graphics in View:就是直接使用Android已經(jīng)實現(xiàn)的一些畫圖操作,比如說images,shapes,colors,pre-defined animation等等。這種方式只能畫靜態(tài)或者極為簡單的2D圖畫,對于實時性很強的動畫,高品質(zhì)的游戲都是沒法實現(xiàn)的。2、Canvas:首先我們要明白這

29、個Canvas是一個2D的概念,是在Skia中定義的。也就是說在這個方式下還是說的畫2D圖形。</p><p>  游戲研究重點、算法與思路</p><p>  5.1游戲研究的重點</p><p>  1.1 如何拼接 用一張整圖不現(xiàn)實,這樣會影響程序的執(zhí)行效率,而且很占空間</p><p>  只有通過圖塊的拼接。</p>

30、<p>  1.2 裝載地圖 將地圖索引寫進文件,在程序裝載的時候,通過輸入輸出流來讀</p><p><b>  地圖內(nèi)容。</b></p><p>  2、游戲按鍵 在游戲中通過手觸或者使用左右鍵使球員左右移動,通過判斷擊球的角度來確定足球運行的方向和速度,當你有事需要處理時,你可以點擊兩個比分中間的標志,來暫停住游戲的運行。</p>

31、;<p>  3、關(guān)卡 關(guān)卡地圖的設(shè)置:不同的關(guān)卡,對手的移動速度是不同的</p><p><b>  4、幫助信息</b></p><p> ?。?)讓自己的隊員擊中球</p><p> ?。?)抓住時間打中道具,讓你有更大的贏面。</p><p> ?。?)控制左右鍵來使球員移動。</p>

32、;<p>  5.2游戲研究的算法</p><p>  (1)后臺電腦判斷左右移動</p><p>  public class AIThread extends Thread{</p><p>  GameView father;//視圖類引用</p><p>  boolean flag;//循環(huán)控制變量<

33、;/p><p>  int sleepSpan = 30;//睡眠時間</p><p>  //構(gòu)造器,初始化成員變量</p><p>  public AIThread(GameView father){</p><p>  this.father = father;</p><p>  flag = true;

34、//設(shè)置線程標志位</p><p><b>  }</b></p><p>  //線程啟動后的執(zhí)行方法</p><p>  public void run(){</p><p>  while(flag){ </p><p>  int d = father.ball.direction;

35、//獲取足球運動方向</p><p>  if(d >0 && d<8){//如果足球方向偏左</p><p>  father.aiDirection = 4;//AI運動方向改為向左 </p><p><b>  }</b></p><p>  else if(d>

36、;8 && d<15){//如果足球方向偏右</p><p>  father.aiDirection = 12;//AI運動方向改為向右</p><p><b>  }</b></p><p><b>  try{</b></p><p>  Thread.

37、sleep(sleepSpan);//休眠一段時間</p><p><b>  }</b></p><p>  catch(Exception e){</p><p>  e.printStackTrace();//打印并捕獲異常</p><p><b>  }</b></p>

38、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  碰撞測試(足球與邊框)</p><p>  public void checkForBorders(){</p>&l

39、t;p>  int d = direction;</p><p>  //左右是不是出邊界了</p><p>  if(x <= father.fieldLeft){</p><p><b>  //撞了左邊界</b></p><p>  if(d>8 && d<16 &&

40、amp; d!=12){//如果不是正撞到左邊界</p><p>  if(Math.random() < changeOdd){//一定概率概率沿正確反射路線變向</p><p>  direction = 16 - direction;</p><p><b>  }</b></p><p>  else{

41、//一定概率隨機變向</p><p>  direction = (direction>12?1:5) + (int)(Math.random()*100)%3;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if

42、(d == 12){//如果是正撞到左邊界</p><p>  if(Math.random() < 0.4){//注意這個概率要小,因為正撞上去希望隨機變向的概率大一些</p><p>  direction = 4;</p><p><b>  }</b></p><p><b>  el

43、se{</b></p><p>  direction = (Math.random() > 0.5?3:5);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&l

44、t;p>  else if(x > father.fieldRight){</p><p><b>  //撞到右邊界</b></p><p>  if(d >0 && d<8 && d!=4){</p><p>  if(Math.random() < changeOdd){/

45、/按正常反射路線變向</p><p>  direction = 16-direction;</p><p><b>  }</b></p><p>  else{//一定幾率隨機變向</p><p>  direction = (direction>4?9:13) + (int)(Math.ran

46、dom()*100)%3;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else if(d == 4){//如果是正撞到右邊界</p><p>  if(Math.random() < 0.4){</p><p&

47、gt;  direction = 12;</p><p><b>  }</b></p><p><b>  else{</b></p><p>  direction = (Math.random()>0.5?11:13);</p><p><b>  }</b><

48、;/p><p><b>  }</b></p><p><b>  }</b></p><p>  d = direction;</p><p>  //判斷是否撞到上邊界</p><p>  if(y < father.fieldUp){</p><

49、;p><b>  //不是正撞</b></p><p>  if(d>0 && d<4 || d>12&&d<16){</p><p>  if(Math.random() < changeOdd){//一定幾率沿正確反射路線變向</p><p>  direction

50、= (d>12?24:8) - d;</p><p><b>  }</b></p><p>  else{//一定幾率隨機變向</p><p>  direction = (d>12?9:5) + (int)(Math.random()*100)%3;</p><p><b> 

51、 }</b></p><p><b>  }</b></p><p>  else if(d == 0){//正撞到上邊界</p><p>  if(Math.random() < 0.4){//一定幾率沿正確反射路線返回</p><p>  direction = 8;</p>

52、;<p><b>  }</b></p><p><b>  else{</b></p><p>  direction = (Math.random() < 0.5?7:9);//一定幾率隨機變向</p><p><b>  }</b></p><p>

53、;<b>  }</b></p><p><b>  }</b></p><p>  //判斷是否撞到下邊界</p><p>  else if(y > father.fieldDown){</p><p><b>  //不是正撞</b></p><

54、p>  if(d >4 && d<12 && d!=8){</p><p>  if(Math.random() < changeOdd){//按正常反射路線變向</p><p>  direction = (d>8?24:8) - d;</p><p><b>  }</b>&l

55、t;/p><p>  else{//隨機變向</p><p>  direction = (d>8?13:1) +(int)(Math.random()*100)%3;</p><p><b>  }</b></p><p><b>  }</b></p><p&

56、gt;  else if(d == 8){//正撞到下邊界</p><p>  if(Math.random() < 0.4){//正常變向</p><p>  direction = 0;</p><p><b>  }</b></p><p>  else{//隨機變向</p>

57、<p>  direction = (Math.random()>0.5?1:15);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</

58、b></p><p><b>  /*</b></p><p>  * 此方法檢測是否碰到AI運動員,如果碰到,則調(diào)用handleCollision方法處理碰撞,</p><p>  * 同時播放聲音設(shè)置足球新速率和設(shè)置lastKicker</p><p><b>  */</b></p

59、><p>  public void checkForAIPlayers(){</p><p>  int r = (this.ballSize + father.playerSize)/2;</p><p>  for(Player p:father.alAIPlayer){</p><p>  if((p.x - this.x)*(p.x -

60、 this.x) + (p.y - this.y)*(p.y - this.y) <= r*r){//發(fā)生碰撞</p><p>  handleCollision(this,p);//處理碰撞</p><p>  if(father.father.wantSound && father.father.mpKick!=null){//播放聲音</p&

61、gt;<p>  try {//用try/catch語句包裝</p><p>  father.father.mpKick.start();</p><p>  } catch (Exception e) {}</p><p><b>  }</b></p><p>  velocit

62、y = p.power;</p><p>  lastKicker = 8;//記錄最后一腳是誰踢的</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>&l

63、t;b>  /*</b></p><p>  * 此方法檢測是否碰到了玩家 的足球運動員,</p><p><b>  */</b></p><p>  public void checkForUserPlayers(){</p><p>  int r = (this.ballSize + fathe

64、r.playerSize)/2;</p><p>  for(Player p:father.alMyPlayer){</p><p>  if((p.x - this.x)*(p.x - this.x) + (p.y - this.y)*(p.y - this.y) <= r*r){//發(fā)生碰撞</p><p>  handleCollision(thi

65、s,p);//處理碰撞</p><p>  if(father.father.wantSound && father.father.mpKick!=null){//播放聲音</p><p><b>  try {</b></p><p>  father.father.mpKick.start();</p>

66、<p>  } catch (Exception e) {}</p><p><b>  }</b></p><p>  velocity = p.power;//被 賦予新速度</p><p>  lastKicker = 0;//記錄最后一腳誰踢的</p><p><b&g

67、t;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /*</b></p><p>  * 此方法處理足球和運動員之間的碰撞,AI和玩家的處理方式是一樣的,</p><p&

68、gt;  * 首先查看Player對象的movingDirection,再綜合Player對象的</p><p>  * attackDirection,確定方向范圍,類似直角坐標系中的4個象限,</p><p>  * 然后在方向范圍中隨機產(chǎn)生一個,這樣產(chǎn)生的方向有慣性在里面,看著</p><p>  * 比較真實。需要注意的是如果足球和運動員碰撞時運動員靜止不動

69、,</p><p>  * 那么可選的方向就是1或15(進攻方向朝上)、7或9(進攻方行朝下)</p><p><b>  */</b></p><p>  public void handleCollision(Ball ball,Player p){</p><p>  switch(p.movingDirectio

70、n){</p><p>  case 12://移動方向向左</p><p>  if(p.attackDirection == 0){//攻擊方向向上</p><p>  ball.direction = 13 + (int)(Math.random()*100)%3;//取13,14,15中一個</p><p><b

71、>  }</b></p><p>  else{//攻擊方向向下</p><p>  ball.direction = 9 + (int)(Math.random()*100)%3;//取9,10,11中一個</p><p><b>  }</b></p><p><b> 

72、 break;</b></p><p>  case 4://移動方向向右</p><p>  if(p.attackDirection == 0){//攻擊方向向上</p><p>  ball.direction = 1 + (int)(Math.random()*100)%3;//取1,2,3中一個</p><

73、p><b>  }</b></p><p>  else{//攻擊方向向下</p><p>  ball.direction = 5 + (int)(Math.random()*100)%3;//取5,6,7中一個</p><p><b>  }</b></p><p>&l

74、t;b>  break;</b></p><p>  default://沒有移動</p><p>  if(p.attackDirection == 0){//攻擊方向向上</p><p>  ball.direction = 15 + (int)(Math.random()*100)%3;//取1,2,3中一個</p>

75、;<p>  if(ball.direction > 15){</p><p>  ball.direction = ball.direction % 16;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else{

76、//攻擊方向向下</p><p>  ball.direction = 7 + (int)(Math.random()*100)%3;//取7,8,9中一個</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  

77、}</b></p><p><b>  }</b></p><p><b>  /*</b></p><p>  * 此方法用于檢測是否進球,如是,則相應(yīng)球隊得分加1,然后判斷游戲是否結(jié)束(游戲規(guī)則是誰先進夠8個誰就贏)</p><p><b>  */</b>&l

78、t;/p><p>  public void checkIfScoreAGoal(){</p><p>  if(this.y <= father.fieldUp && this.x > father.AIGoalLeft && this.x < father.AIGoalRight){</p><p>  //上方球門

79、進球,即玩家</p><p>  isPlaying = false;</p><p>  father.scores[0]++;</p><p>  father.checkIfLevelUp();</p><p><b>  }</b></p><p>  else if(this.y >

80、;= father.fieldDown && this.x > father.myGoalLeft && this.x < father.myGoalRight){</p><p><b>  //AI進球</b></p><p>  isPlaying = false;</p><p>  fath

81、er.scores[1]++;</p><p>  father.checkIfLevelUp();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //升級方法</b></p><p>  p

82、ublic void levelUp(){</p><p>  this.minVelocity +=3;</p><p>  if(minVelocity > 20){</p><p>  minVelocity = 20;</p><p><b>  }</b></p><p><

83、b>  }</b></p><p><b>  /*</b></p><p>  * 該方法判斷是否碰到了Bonus,如果碰到,對相應(yīng)的Bonus進行操作</p><p>  * 改變其狀態(tài),調(diào)用其方法修改游戲參數(shù)等等,并播放聲音</p><p><b>  */</b></

84、p><p>  public void checkForBonus(){</p><p>  if(father.balLive.size() != 0){</p><p>  for(Bonus b:father.balLive){</p><p>  if((b.x - x)*(b.x - x) + (b.y-y)*(b.y-y) <=

85、 (b.bonusSize/2+ballSize/2)*(b.bonusSize/2+ballSize/2)</p><p>  && b.status == Bonus.LIVE){</p><p>  b.status = Bonus.EFFECTIVE;</p><p>  father.balLive.remove(b);</p>

86、<p>  b.setTarget(this.lastKicker);</p><p>  b.doJob();</p><p>  b.setTimeout(Bonus.EFFECT_SPAN);</p><p>  if(father.father.wantSound){</p><p>  if(b instanceof

87、 IceBonus){//是冰凍小球</p><p><b>  try {</b></p><p>  father.father.mpIce.start();</p><p>  } catch (Exception e) {}</p><p><b>  }</b></

88、p><p>  else if( b instanceof LargerGoalBonus){//是擴大球門的</p><p><b>  try {</b></p><p>  father.father.mpLargerGoal.start();</p><p>  } catch (Exception e) {}&

89、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b

90、></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  5.3游戲界面</b></p><p>  public class FootballActivity extends Activity {</p>

91、<p>  View current; // 記錄當前View</p><p>  GameView gv; // GameView對象</p><p>  WelcomeView welcome; // 歡迎界面</p><p>  LoadingView lv; // 進度條加載界面</p><p>  int keySta

92、te = 0; // xxxx00為不動,xxxx10為向左,xxxx01為向右</p><p>  PlayerMoveThread pmt; // 移動球員位置的線程</p><p>  boolean wantSound = true; // 是否播放聲音標志位</p><p>  int[] layoutArray; // 表示球員球場站位的數(shù)組</p

93、><p>  MediaPlayer mpWelcomeMusic; // 游戲開始前的歡迎音樂</p><p>  MediaPlayer mpKick; // 踢球音效</p><p>  MediaPlayer mpCheerForWin; // 贏了的音樂</p><p>  MediaPlayer mpCheerForLose; //

94、輸了的音樂</p><p>  MediaPlayer mpCheerForGoal; // 進球后的音樂</p><p>  MediaPlayer mpIce; // 撞到冰山后的音樂</p><p>  MediaPlayer mpLargerGoal; // 撞到打開球門后的音樂</p><p>  Rect[] rectPlus;

95、// 代表增加球員按鈕的矩形框</p><p>  Rect[] rectMinus; // 代表減少球員按鈕的矩形框</p><p>  Rect rectSound; // 是否播放聲音按鈕的矩形框</p><p>  Rect rectStart; // 開始按鈕的矩形框</p><p>  Rect rectQuit; // 退出按鈕

96、的矩形框</p><p>  Rect rectGallery; // 表示Gallery的矩形框</p><p>  int[] imageIDs = { // 存放8個俱樂部的圖片ID</p><p>  R.drawable.club_1, R.drawable.club_2, R.drawable.club_3, R.drawable.club_4,<

97、/p><p>  R.drawable.club_5, R.drawable.club_6, R.drawable.club_7,</p><p>  R.drawable.club_8 };</p><p>  int clubID = imageIDs[0]; // 記錄用戶選擇的俱樂部的ID</p><p>  public void on

98、Create(Bundle savedInstanceState) { // 重寫onCreate方法</p><p>  super.onCreate(savedInstanceState);</p><p>  initWelcomeSound(this); // 初始化開場動畫音樂</p><p>  requestWindowFeature(Window.F

99、EATURE_NO_TITLE); // 設(shè)置全屏</p><p>  getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,</p><p>  WindowManager.LayoutParams.FLAG_FULLSCREEN);</p><p>  welcome = new Welc

100、omeView(this); // 將屏幕切到歡迎界面</p><p>  setContentView(welcome);</p><p>  // current是當前activity中打開的視圖</p><p>  current = welcome;</p><p>  // wantSound一個變量表示用戶是否開啟音樂</p

101、><p>  if (wantSound && mpWelcomeMusic != null) { // 如需要,播放相應(yīng)聲音</p><p>  mpWelcomeMusic.start();</p><p><b>  }</b></p><p>  initRects(); // 初始化用于匹配點擊事件

102、的矩形框</p><p><b>  }</b></p><p>  // 方法:初始化歡迎界面的聲音</p><p>  public void initWelcomeSound(Context context) {</p><p>  mpWelcomeMusic = MediaPlayer.create(conte

103、xt, R.raw.music);</p><p><b>  }</b></p><p>  // 方法:初始化矩形框</p><p>  public void initRects() {</p><p>  rectPlus = new Rect[3];</p><p>  rectMinu

104、s = new Rect[3];</p><p>  for (int i = 0; i < 3; i++) {</p><p>  rectPlus[i] = new Rect(244, 200 + 40 * i, 280, 236 + 40 * i);</p><p>  rectMinus[i] = new Rect(280, 200 + 40 * i,

105、 316, 236 + 40 * i);</p><p><b>  }</b></p><p>  rectSound = new Rect(135, 370, 185, 420);</p><p>  rectStart = new Rect(205, 425, 295, 475);</p><p>  rectQu

106、it = new Rect(25, 425, 115, 475);</p><p>  rectGallery = new Rect(10, 10, 310, 110);</p><p><b>  }</b></p><p><b>  @Override</b></p><p>  public

107、 boolean onTouchEvent(MotionEvent event) {// 重寫onTouchEvent方法</p><p>  if (event.getAction() == MotionEvent.ACTION_UP) {// 判斷事件類型</p><p>  int x = (int) event.getX(); // 獲得點擊處的X坐標</p><

108、;p>  int y = (int) event.getY(); // 獲得點擊處的Y坐標</p><p>  if (current == welcome) {// 如果當前界面是歡迎界面</p><p>  if (rectGallery.contains(x, y)) { // 用戶點擊的是Gallery</p><p>  welcome.cg.gal

109、leryTouchEvnet(x, y); // 交給Gallery來處理點擊事件</p><p>  } else if (rectSound.contains(x, y)) { // 點下的是聲音選項</p><p>  this.wantSound = !this.wantSound; // 更改聲音選項</p><p>  return true;</

110、p><p>  } else if (rectStart.contains(x, y)) { // 點下開始鍵</p><p>  if (checkLayout(welcome.layout)) { // 檢查玩家選擇的布局是否正確</p><p>  layoutArray = welcome.layout; // 獲得玩家選擇站位布局</p><

111、;p>  lv = new LoadingView(this); // 創(chuàng)建讀取進度View</p><p>  this.setContentView(lv); // 將屏幕設(shè)為讀取進度的LoadingView</p><p>  this.current = lv; // 記錄當前View</p><p>  lv.lt.start(); // 啟動Loa

112、dingView的刷屏線程</p><p>  new Thread() { // 啟動一個新線程,在其中創(chuàng)建GameView對象</p><p>  public void run() {</p><p>  if (wantSound) {</p><p>  initSound();// 初始化聲音</p><p&g

113、t;<b>  }</b></p><p><b>  // 創(chuàng)建</b></p><p><b>  // 創(chuàng)建游戲界面</b></p><p>  lv.progress = 100;</p><p>  welcome = null; // 釋放掉WelcomeView&

114、lt;/p><p><b>  }</b></p><p>  }.start();</p><p>  gv = new GameView(FootballActivity.this,</p><p>  imageIDs[welcome.cg.currIndex]);</p><p><b&

115、gt;  }</b></p><p>  } else if (rectQuit.contains(x, y)) { // 按下退出鍵</p><p>  System.exit(0); // 程序退出</p><p>  } else { // 檢查是否按下了修改隊員站位的加號和減號按鈕</p><p>  for (int i

116、 = 0; i < 3; i++) {</p><p>  if (rectPlus[i].contains(x, y)) { // 如果有加號按鈕點下,就增加對應(yīng)進攻防守線上人數(shù)</p><p>  // 如果有富余的人再加</p><p>  if (welcome.layout[0] + welcome.layout[1]</p><

117、p>  + welcome.layout[2] < 10) {</p><p>  welcome.layout[i]++;</p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p

118、><p>  if (rectMinus[i].contains(x, y)) {// 如果有減號按鈕點下,就減少相應(yīng)人數(shù)</p><p>  if (welcome.layout[i] > 0) { // 如果該處人數(shù)不為零,就減少一個</p><p>  welcome.layout[i]--;</p><p><b>  }

119、</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  } else if

120、(current == gv) { // 如果當前顯示的View為GameView</p><p>  if (gv.rectMenu.contains(x, y)) { // 如果點下了菜單按鈕</p><p>  gv.isShowDialog = true; // 設(shè)置顯示對話框</p><p>  gv.ball.isPlaying = false; //

121、足球停止移動</p><p>  pmt.flag = false; // 使PlayerMoveThread空轉(zhuǎn)</p><p>  } else if (gv.rectYesToDialog.contains(x, y)) { // 如果點下的是對話框中的”是“按鈕</p><p>  if (gv.isShowDialog) { // 檢查對話框是不是正在顯示

122、</p><p>  welcome = new WelcomeView(this); // 新建一個WelcomeView</p><p>  setContentView(welcome); // 設(shè)置當前屏幕為WelcomeView</p><p>  welcome.status = 3; // 直接設(shè)為待命狀態(tài)</p><p>  

123、current = welcome; // 記錄當前屏幕</p><p>  gv = null; // 將GameView指向的對象聲明為垃圾</p><p>  if (wantSound && mpWelcomeMusic != null) { // 如需要,播放聲音</p><p>  mpWelcomeMusic.start();</

124、p><p><b>  }</b></p><p><b>  }</b></p><p>  } else if (gv.rectNoToDialog.contains(x, y)) { // 如果點下的是對話框中的”否“按鈕</p><p>  if (gv.isShowDialog) { // 檢

125、查對話框是不是正在顯示</p><p>  gv.isShowDialog = false; // 不顯示對話框</p><p>  pmt.flag = true; // 設(shè)置雙方球員可移動</p><p>  gv.ball.isPlaying = true; // 設(shè)置足球可移動</p><p><b>  }</b&g

126、t;</p><p><b>  }</b></p><p>  } else if (current == lv) { // 如果當前屏幕為LoadingView</p><p>  if (lv.progress == 100) { // 如果進度達到100%</p><p>  setContentView(gv)

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論