2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩54頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目錄</b></p><p><b>  一. 問題定義1</b></p><p><b>  1. 項(xiàng)目名稱1</b></p><p><b>  2. 項(xiàng)目目標(biāo)1</b></p><p><b>  3.

2、選題背景1</b></p><p>  二. 可行性研究1</p><p><b>  1.技術(shù)可行性1</b></p><p>  2. 經(jīng)濟(jì)可行性1</p><p>  3. 操作可行性1</p><p><b>  三. 需求分析2</b><

3、;/p><p>  1. 游戲內(nèi)容需求2</p><p><b>  2. 游戲規(guī)則3</b></p><p><b>  四. 游戲設(shè)計(jì)3</b></p><p><b>  1. 類的設(shè)計(jì)3</b></p><p><b>  2. 游

4、戲流程4</b></p><p><b>  1. 主流程4</b></p><p>  2. 游戲初始化5</p><p><b>  3. 游戲運(yùn)行6</b></p><p>  3. 游戲序列圖14</p><p><b>  游戲初始化

5、14</b></p><p><b>  鍵盤按下事件15</b></p><p><b>  游戲運(yùn)行15</b></p><p><b>  玩家坦克處理16</b></p><p><b>  電腦坦克處理17</b></

6、p><p><b>  炮彈碰撞處理19</b></p><p><b>  坦克碰撞處理19</b></p><p><b>  游戲結(jié)束20</b></p><p>  五. 游戲代碼21</p><p>  CGameMain類21</

7、p><p>  CTankPlayer類32</p><p>  CTankEnemy類36</p><p>  CBullet類42</p><p>  CWeapon類49</p><p>  六. 實(shí)驗(yàn)總結(jié)53</p><p><b>  問題定義</b><

8、;/p><p><b>  項(xiàng)目名稱</b></p><p><b>  坦克大戰(zhàn)</b></p><p><b>  項(xiàng)目目標(biāo)</b></p><p>  綜合運(yùn)用C++及其面向?qū)ο蟮闹R開發(fā)一款小游戲。</p><p><b>  選題背景&l

9、t;/b></p><p>  相信大部分同學(xué)都玩過或看過“坦克大戰(zhàn)”這款經(jīng)典游戲?,F(xiàn)在,就由我自己動手來開發(fā)它。因?yàn)橹暗膶W(xué)習(xí),我具備了C++語言和面向?qū)ο蟮幕A(chǔ)知識,在這個基礎(chǔ)上按照實(shí)驗(yàn)指南的指導(dǎo)一步一步進(jìn)行下去,把這款經(jīng)典游戲做出來。鞏固之前所學(xué)知識也學(xué)習(xí)新的知識。</p><p><b>  可行性研究</b></p><p>&

10、lt;b>  1.技術(shù)可行性</b></p><p>  本游戲采用 FunCode和Visual C++6.0進(jìn)行開發(fā),基于Windows xp和Windows7操作系統(tǒng)。</p><p>  Funcode軟件提供了大量基礎(chǔ)類庫,可以快速方便地構(gòu)造出游戲軟件。</p><p>  之前課程學(xué)習(xí)過C++,具有一定的C++語言開發(fā)基礎(chǔ),對面向程序設(shè)

11、計(jì)有一定了解。</p><p><b>  經(jīng)濟(jì)可行性</b></p><p>  此次課程設(shè)計(jì)由我一人完成,只需裝有Funcode及Visual C++的電腦一臺,無資金需求;且制作出來的游戲軟件并不打算發(fā)行,也無后期資金需求,經(jīng)濟(jì)完全可行。</p><p><b>  操作可行性</b></p><

12、p>  本游戲只需用W、A、S、D來移動,用J鍵進(jìn)行攻擊,操作十分簡單,界面友好,符合用戶操作習(xí)慣。</p><p><b>  需求分析</b></p><p><b>  游戲內(nèi)容需求</b></p><p>  在一個戰(zhàn)場上,玩家控制坦克,消滅敵方坦克,并防止敵方坦克摧毀我方基地。游戲的具體要求如下:</

13、p><p>  游戲有一個初始頁面,如下圖。</p><p>  按下任意鍵開始游戲,玩家控制坦克在戰(zhàn)場上穿梭,碰到墻時,不能通過。</p><p>  敵方坦克自由移動,每隔2秒改變一個方向,每隔3秒發(fā)射一發(fā)子彈。</p><p>  敵方坦克每隔5秒出現(xiàn)一輛,從屏幕上方的左、中、右三個位置依次出現(xiàn)。</p><p> 

14、 當(dāng)玩家被消滅或者我方基地被摧毀或者游戲時間大于30秒的時候,游戲結(jié)束。</p><p><b>  圖1 游戲開始前</b></p><p><b>  圖2 進(jìn)入游戲</b></p><p><b>  游戲規(guī)則</b></p><p>  按下任意鍵游戲開始。</p

15、><p>  通過WSAD 鍵控制玩家坦克上下左右移動,但不能走出邊境。</p><p>  通過J鍵控制玩家坦克發(fā)射子彈。</p><p>  玩家坦克有三條生命,每條命有1點(diǎn)HP,每次被敵方坦克的子彈打到扣除1點(diǎn)HP,當(dāng)HP=0時,如果玩家生命條數(shù)>0,則玩家在初始位置復(fù)活,否則游戲結(jié)束。</p><p>  游戲中的地形包括磚墻、海水

16、、鋼板、森林、地板5種。</p><p>  敵人種類則包括裝甲車、輕型坦克、寶物坦克、3種。</p><p>  當(dāng)關(guān)卡中的敵方坦克被全部消滅完,則進(jìn)入下一個關(guān)卡,如果當(dāng)前關(guān)卡為最后一關(guān),則游戲通關(guān)。</p><p>  在界面外用一個文本顯示玩家生命條數(shù),一個文本顯示當(dāng)前關(guān)卡,一個文本顯示敵方坦克剩余數(shù)量。</p><p><b&g

17、t;  游戲設(shè)計(jì)</b></p><p><b>  類的設(shè)計(jì)</b></p><p>  游戲中能直接看到的精靈:玩家坦克、敵方坦克、子彈、地形、當(dāng)前關(guān)卡文本精靈,當(dāng)前玩家剩余生命條數(shù)文本精靈,當(dāng)前敵方坦克剩余數(shù)量文本精靈。其中,當(dāng)前關(guān)卡文本精靈,玩家剩余生命條數(shù)文本精靈,當(dāng)前敵方坦克剩余數(shù)量文本精靈只需要顯示響應(yīng)的數(shù)值,可以直接使用CTextSprit

18、e類。玩家坦克、敵方坦克、子彈、地形創(chuàng)建相應(yīng)的類。</p><p>  可以從玩家坦克和敵方坦克抽象出一個坦克類,作為父類。</p><p>  坦克類,子彈類,地形類繼承CSprite類,通過CSprite類的方法操作精靈。</p><p>  玩家坦克和敵方坦克被摧毀時,都要播放相應(yīng)的爆炸動畫,這些動畫可直接使用CAnimateSprite類。</p>

19、;<p>  創(chuàng)建一個游戲類,各個類之間的通信在游戲世界類中進(jìn)行。該類采用“單例模式”,在程序中只能創(chuàng)建一個對象。本游戲是坦克大戰(zhàn),該類稱為坦克游戲類。</p><p>  創(chuàng)建一個精靈工廠類,用來生成各種精靈類的對象。這就是“工廠模式”。</p><p>  游戲中還有其他類,詳見下面類圖:</p><p><b>  圖3 類圖</

20、b></p><p><b>  游戲流程</b></p><p><b>  主流程</b></p><p>  游戲分四個狀態(tài):未開始、開始、運(yùn)行和結(jié)束。CGameMain類是控制游戲流程的類,游戲屏幕每刷新一次,調(diào)用一次該類的GameMainLoop方。GameMainLoop根據(jù)m_iGameState的值分

21、別調(diào)用該類的GameInit、GameRun和GameEnd方法。這三個方法對應(yīng)初始化游戲、游戲運(yùn)行和游戲結(jié)束這三個狀態(tài)。GameInit只執(zhí)行一次。執(zhí)行后修改游戲狀態(tài)。屏幕刷新后,進(jìn)入狀態(tài)2,開始執(zhí)行GameRun方法。當(dāng)玩家HP>0即玩家坦克不死的時候,GameRun一直被執(zhí)行。玩家坦克被摧毀后,調(diào)用GameEnd執(zhí)行一次,清除本局游戲數(shù)據(jù),恢復(fù)游戲未開始狀態(tài)。</p><p><b>  主

22、流程圖如下:</b></p><p><b>  圖4 主流程圖</b></p><p><b>  游戲初始化</b></p><p>  完成游戲初始工作,界面上的工作:當(dāng)前關(guān)卡初始化為1,創(chuàng)建玩家坦克并放置在指定位置。此外,我們需要創(chuàng)建TankWorld對象,該對象采用單例模式,所以不管游戲運(yùn)行多少次,T

23、ankWorld對象始終只有一個,并且把玩家飛機(jī)對象加入到TankWorld對象中。</p><p><b>  圖5 初始化流程圖</b></p><p><b>  游戲運(yùn)行</b></p><p>  游戲運(yùn)行中,每刷新一次屏幕,需要根據(jù)最新數(shù)據(jù),更新玩家生命次數(shù),設(shè)置玩家移動方向,刪除被摧毀的敵方坦克和子彈,判斷是

24、否生產(chǎn)新的電腦坦克。</p><p><b>  圖6 運(yùn)行流程圖</b></p><p><b>  玩家坦克處理:</b></p><p>  在游戲的運(yùn)行中,玩家通過WSAD鍵改變了玩家坦克的移動速度及方向,我們在游戲運(yùn)行中要實(shí)時的向FunCode接口更新玩家數(shù)據(jù),達(dá)到在屏幕上更新玩家狀態(tài)。</p>&

25、lt;p>  圖7 玩家坦克處理流程圖</p><p><b>  電腦坦克處理:</b></p><p>  刪除HP=0的電腦坦克,并播放爆炸動畫,判斷是否出戰(zhàn)新的坦克。</p><p>  圖8 電腦坦克處理流程圖</p><p><b>  文本精靈處理:</b></p>

26、<p>  在游戲運(yùn)行時玩家的生命條數(shù)以及當(dāng)前關(guān)卡和敵方坦克剩余數(shù)量都會實(shí)時發(fā)生變化,所以文本精靈的數(shù)據(jù)也需要實(shí)時更新顯示。</p><p>  圖9 文本精靈處理流程圖</p><p><b>  地形及關(guān)卡處理:</b></p><p>  在游戲運(yùn)行時地形的屬性也是會隨著坦克子彈的擊中而發(fā)生變化的,我們需要在此方法內(nèi)實(shí)時更新地

27、圖中所有地形的信息,關(guān)卡也會發(fā)生變化,例如初始化關(guān)卡,或者銷毀關(guān)卡等。</p><p>  圖10 地形及關(guān)卡處理流程圖</p><p><b>  游戲結(jié)束:</b></p><p>  將游戲中剩余的精靈刪除,包括刪除精靈本身和集合中對應(yīng)的對象。</p><p>  重新顯示游戲開始的提示圖片。</p>

28、<p>  圖11 游戲結(jié)束流程圖</p><p><b>  鍵盤按下事件:</b></p><p>  本游戲中,游戲狀態(tài)為1時,按下任意鍵,游戲狀態(tài)轉(zhuǎn)為2。游戲狀態(tài)為2時,玩家按下了WSAD鍵,分別設(shè)置玩家坦克的上下左右速度,當(dāng)按下的是J鍵,需要調(diào)用玩家坦克的射擊方法。</p><p>  圖12 鍵盤按下流程圖</p&

29、gt;<p><b>  鍵盤彈起事件:</b></p><p>  本游戲中,游戲狀態(tài)為2時,玩家松開WSAD鍵,相應(yīng)設(shè)置玩家坦克上下左右速度為0。</p><p>  圖13 鍵盤彈起流程圖</p><p><b>  精靈之間的碰撞</b></p><p>  本游戲中,坦克均為

30、發(fā)送碰撞并且接收碰撞,子彈發(fā)送碰撞,地形接收碰撞,寶物接收碰撞。</p><p>  圖14 精靈的碰撞流程圖</p><p><b>  玩家坦克發(fā)生碰撞:</b></p><p>  玩家發(fā)生碰撞時,會撞到地形、電腦坦克、寶物。</p><p>  圖15 玩家坦克碰撞流程圖</p><p>

31、<b>  玩家炮彈發(fā)生碰撞:</b></p><p>  玩家炮彈發(fā)送碰撞會撞到地形 、敵方坦克、敵方炮彈。</p><p>  圖16玩家炮彈碰撞流程圖</p><p><b>  電腦坦克發(fā)送碰撞:</b></p><p>  電腦坦克會撞到玩家坦克、地形、撞到盟友。</p>&

32、lt;p>  圖17 電腦坦克碰撞</p><p>  電腦坦克炮彈發(fā)送碰撞:</p><p>  電腦坦克炮彈需要處理撞到玩家坦克、地形、盟友。</p><p>  圖18 電腦坦克炮彈碰撞</p><p><b>  世界邊界碰撞事件:</b></p><p>  本游戲中,游戲狀態(tài)為2

33、時,主要處理電腦坦克的世界邊界碰撞事件。</p><p>  圖19 世界邊界碰撞</p><p><b>  游戲序列圖</b></p><p><b>  游戲初始化</b></p><p>  在CGameMain類的GameInit方法中完成游戲初始化。</p><p&g

34、t;<b>  圖20 游戲初始化</b></p><p><b>  鍵盤按下事件</b></p><p>  在CGameMain類的OnKeyDown方法中完成。鍵盤按下處理三個事件:一個是游戲的開始:按下空格鍵;一個是玩家坦克的上下左右移動:當(dāng)游戲狀態(tài)為2時,且按下了WASD鍵;一個是玩家坦克發(fā)射炮彈:當(dāng)按下J鍵。完成該任務(wù)后,運(yùn)行程序。

35、</p><p>  圖21 鍵盤按下事件</p><p><b>  游戲運(yùn)行</b></p><p>  在CGameMain類的GameRun方法中完成游戲運(yùn)行代碼。</p><p><b>  圖22 游戲運(yùn)行</b></p><p><b>  玩家坦克處

36、理</b></p><p>  主要更新玩家坦克移動方向及速度及是否發(fā)射子彈處理。</p><p>  圖23 玩家坦克處理</p><p><b>  電腦坦克處理</b></p><p>  主要負(fù)責(zé)刪除HP<=0的電腦坦克,以及是否生產(chǎn)新的電腦坦克,設(shè)置電腦坦克移動速度及方向以及何時改變方向及發(fā)射

37、子彈。</p><p>  圖24 敵方坦克處理</p><p><b>  炮彈碰撞處理</b></p><p>  精靈與精靈的碰撞事件是在CGameMain類的OnSpriteColSprite方法中完成的。該方法有兩個參數(shù),一個是szSrcName,表示發(fā)送碰撞的精靈的名稱;一個是szTarName,表示接受碰撞的精靈的名稱。根據(jù)這兩個

38、精靈的名稱,可以判斷碰撞的精靈是什么類型(因?yàn)閯?chuàng)建精靈時,命名有規(guī)則)。</p><p>  子彈只可能與地形、我方坦克、敵方坦克、世界邊界等發(fā)生碰撞;先判斷子彈由敵方還是玩家坦克發(fā)出,兩者子彈皆可擊破地形。</p><p>  圖25 炮彈碰撞處理</p><p><b>  坦克碰撞處理</b></p><p>  

39、玩家坦克可能與敵方坦克、敵方子彈、地形及世界邊界等發(fā)生碰撞,敵方坦克類似。與子彈碰撞上面炮彈處理已經(jīng)描述,坦克無法穿過地形、邊界和對方坦克。</p><p>  圖26 坦克碰撞處理</p><p><b>  游戲結(jié)束</b></p><p>  當(dāng)玩家坦克的生命條數(shù)=0時,一局游戲結(jié)束。對應(yīng)的方法是CGameMain類的GameEnd方法。

40、游戲結(jié)束時,刪除所有電腦坦克與地形還有玩家坦克,然后重新顯示“空格開始”圖片,游戲環(huán)境又重新回到未開始狀態(tài)。</p><p><b>  圖27 游戲結(jié)束</b></p><p><b>  游戲用例圖</b></p><p><b>  玩家坦克用例圖:</b></p><p&g

41、t;  圖28 玩家坦克用例圖</p><p><b>  敵方坦克用例圖:</b></p><p>  圖29 敵方坦克用例圖</p><p><b>  游戲代碼</b></p><p>  CGameMain類</p><p><b>  頭文件</b&

42、gt;</p><p>  #ifndef _LESSON_X_H_</p><p>  #define _LESSON_X_H_</p><p><b>  //</b></p><p>  #include <Windows.h></p><p>  #include"T

43、ankPlayer.h"</p><p>  #include"TankEnemy.h"</p><p>  #include<vector></p><p>  using namespace std;</p><p>  //////////////////////////////////////

44、///////////////////////////////////////////</p><p><b>  //</b></p><p>  // 游戲總管類。負(fù)責(zé)處理游戲主循環(huán)、游戲初始化、結(jié)束等工作</p><p>  classCGameMain</p><p><b>  {</b>

45、;</p><p><b>  private:</b></p><p>  int m_iGameState;// 游戲狀態(tài),0:結(jié)束或者等待開始;1:初始化;2:游戲進(jìn)行中</p><p>  CSprite* m_pSplash;</p><p>  CSprite* m_pStart;<

46、;/p><p>  CTankPlayer* m_pTankPlayer;</p><p>  int m_iBulletNum;</p><p>  //CTankEnemy* m_pTankEnemy;</p><p>  vector<CWeapon*> m_vWeapon;&

47、lt;/p><p>  float m_fTankEnemyTime;</p><p>  int m_iTankEnemyNumber;</p><p>  CWeapon * m_pAim_nor;</p><p>  CTextSprite* m_pScore; //表示分?jǐn)?shù)的

48、文本精靈</p><p>  CTextSprite* m_pHight; //表示最高分的文本精靈</p><p>  CTextSprite* m_pEnemy;//表示敵人數(shù)量的文本精靈</p><p>  int m_iScore;//分?jǐn)?shù)</p><p>  int m_iE

49、nemy;//敵人數(shù)量</p><p>  int m_iHight;//幾局最高分</p><p>  float m_fDeltaTime;//表示游戲時間</p><p><b>  public:</b></p><p>  CGameMain();

50、 //構(gòu)造函數(shù)</p><p>  ~CGameMain(); //析構(gòu)函數(shù) </p><p><b>  // Get方法</b></p><p>  intGetGameState(){ return m_iGameState; }</p><p><b

51、>  // Set方法</b></p><p>  voidSetGameState( const int iState ){ m_iGameState=iState; }</p><p><b>  // 游戲主循環(huán)等</b></p><p>  voidGameMainLoop( floatfDe

52、ltaTime );</p><p>  voidGameInit();</p><p>  voidGameRun( float fDeltaTime );</p><p>  voidGameEnd();</p><p>  void OnKeyDown( const int iKey, const

53、 bool bAltPress, const bool bShiftPress, const bool bCtrlPress );</p><p>  void OnKeyUp( const int iKey );</p><p>  void OnSpriteColWorldLimit( const char *szName, const in

54、t iColSide );</p><p>  void AddBullet( int iDir,float fPosX,float fPosY ,int iOwner);</p><p>  void LoadMap();</p><p>  CWeapon* FindWeaponByName(const

55、char* szName);</p><p>  void DeleteWeaponByName(const char* szName);</p><p>  void AddTankEnemy(float fDeltaTime);</p><p>  void OnSpriteColSprite(const c

56、har *szSrcName, const char *szTarName);</p><p>  void DeleteAllSprite();</p><p><b>  };</b></p><p>  ////////////////////////////////////////////////////////////

57、/////////////////////</p><p><b>  // </b></p><p>  extern CGameMaing_GameMain;</p><p>  #endif // _LESSON_X_H_</p><p><b>  源文件</b></p>&

58、lt;p>  #include <Stdio.h></p><p>  #include "CommonClass.h"</p><p>  #include "LessonX.h"</p><p>  #include "TankPlayer.h"</p><p>

59、;  #include "Bullet.h"</p><p>  ////////////////////////////////////////////////////////////////////////////////</p><p><b>  //</b></p><p><b>  //</b&

60、gt;</p><p>  CGameMaing_GameMain;</p><p>  CSprite* m_pSplash; </p><p>  CSprite* m_pStart;</p><p>  CTankPlayer* m_pTankplayer= new CTankPlayer("myplay

61、er");</p><p>  /*int g_iMap[11][13]=</p><p><b>  { </b></p><p>  {0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p>  {0,0,0,1,0,0,0,0,0,1,0,0,0},</p><p>

62、;  {0,1,0,1,0,1,1,1,0,1,0,1,0},</p><p>  {0,1,1,1,1,1,0,1,1,1,1,1,0},</p><p>  {0,1,0,1,0,1,0,1,0,1,0,1,0},</p><p>  {0,0,0,0,0,1,0,1,0,0,0,0,0},</p><p>  {0,0,0,0,0,0,

63、0,0,0,0,0,0,0},</p><p>  {0,1,0,1,0,1,0,1,0,1,0,1,0},</p><p>  {0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p>  {0,1,0,1,0,1,1,1,0,1,0,1,0},</p><p>  {0,1,0,1,0,1,0,1,0,1,0,1,0},&

64、lt;/p><p>  //{0,0,0,0,0,1,0,1,0,0,0,0,0}</p><p><b>  };</b></p><p><b>  */</b></p><p>  int g_iMap[11][13]=</p><p><b>  { </

65、b></p><p>  {0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p>  {0,1,1,0,0,1,0,1,0,0,1,1,0},</p><p>  {0,1,0,0,0,1,0,1,0,0,0,1,0},</p><p>  {1,1,1,1,1,1,1,1,1,1,1,1,1},</p>

66、<p>  {0,0,1,0,0,1,0,1,0,0,1,0,0},</p><p>  {0,0,0,1,0,0,0,0,0,1,0,0,0},</p><p>  {0,0,1,0,1,0,0,0,1,0,1,0,0},</p><p>  {1,1,1,1,1,1,1,1,1,1,1,1,1},</p><p>  {0,1

67、,0,1,0,0,0,0,0,1,0,1,0},</p><p>  {0,0,0,0,0,1,1,1,0,0,0,0,0},</p><p>  {0,0,0,0,0,1,0,1,0,0,0,0,0}</p><p><b>  };</b></p><p>  //==========================

68、====================================================</p><p><b>  //</b></p><p>  // 大體的程序流程為:GameMainLoop函數(shù)為主循環(huán)函數(shù),在引擎每幀刷新屏幕圖像之后,都會被調(diào)用一次。</p><p>  //=====================

69、=========================================================</p><p><b>  //</b></p><p><b>  // 構(gòu)造函數(shù)</b></p><p>  CGameMain::CGameMain()</p><p><

70、b>  {</b></p><p>  m_iGameState=0;</p><p>  m_pSplash= new CSprite("splash");</p><p>  m_pStart= new CSprite("start");</p><p>  m_pTa

71、nkPlayer = new CTankPlayer("myplayer");</p><p>  //m_pTankEnemy = new CTankEnemy("enemy");</p><p>  m_fTankEnemyTime = 0;</p><p>  m_iTankEnemyNumber

72、 = 0;</p><p>  m_pScore = new CTextSprite("score");</p><p>  m_pHight = new CTextSprite("hight");</p><p>  m_pEnemy = new CTextSprite("enemyNum"

73、); </p><p>  m_iScore=0;//分?jǐn)?shù)</p><p>  m_iEnemy=0;//敵人數(shù)量</p><p>  m_iHight = 0;</p><p>  m_fDeltaTime = 0.f;</p><p><b>  }</b></p><p&

74、gt;  //==============================================================================</p><p><b>  //</b></p><p><b>  // 析構(gòu)函數(shù)</b></p><p>  CGameMain::~CGameMa

75、in()</p><p><b>  {</b></p><p>  delete m_pSplash;</p><p>  delete m_pStart;</p><p>  delete m_pTankplayer;</p><p><b>  }</b></p&

76、gt;<p>  //==============================================================================</p><p><b>  //</b></p><p>  // 游戲主循環(huán),此函數(shù)將被不停的調(diào)用,引擎每刷新一次屏幕,此函數(shù)即被調(diào)用一次</p><p&

77、gt;  // 用以處理游戲的開始、進(jìn)行中、結(jié)束等各種狀態(tài). </p><p>  // 函數(shù)參數(shù)fDeltaTime : 上次調(diào)用本函數(shù)到此次調(diào)用本函數(shù)的時間間隔,單位:秒</p><p>  void CGameMain::GameMainLoop( floatfDeltaTime )</p><p><b>  {</b></p&

78、gt;<p>  switch( GetGameState() )</p><p><b>  {</b></p><p>  // 初始化游戲,清空上一局相關(guān)數(shù)據(jù)</p><p><b>  case 1:</b></p><p><b>  {</b><

79、/p><p>  GameInit();</p><p>  SetGameState(2); // 初始化之后,將游戲狀態(tài)設(shè)置為進(jìn)行中</p><p><b>  }</b></p><p><b>  break;</b></p><p>  // 游戲進(jìn)行中,處理各種游戲邏

80、輯</p><p><b>  case 2:</b></p><p><b>  {</b></p><p>  // TODO 修改此處游戲循環(huán)條件,完成正確游戲邏輯</p><p>  if(!m_pTankplayer->IsDead() && !m_pAim_nor-

81、>IsDead()&&m_fDeltaTime<30)</p><p><b>  {</b></p><p>  GameRun( fDeltaTime );</p><p><b>  }</b></p><p>  else // 游戲結(jié)束。調(diào)用游戲結(jié)算函數(shù),并把游

82、戲狀態(tài)修改為結(jié)束狀態(tài)</p><p><b>  {</b></p><p>  SetGameState(0);</p><p>  GameEnd();</p><p><b>  }</b></p><p><b>  }</b></

83、p><p><b>  break;</b></p><p>  // 游戲結(jié)束/等待按空格鍵開始</p><p><b>  case 0:</b></p><p><b>  default:</b></p><p><b>  break;&

84、lt;/b></p><p><b>  };</b></p><p><b>  }</b></p><p>  //=============================================================================</p><p>&

85、lt;b>  //</b></p><p>  // 每局開始前進(jìn)行初始化,清空上一局相關(guān)數(shù)據(jù)</p><p>  void CGameMain::GameInit()</p><p><b>  {</b></p><p>  m_pSplash->SetSpriteVisible(false)

86、;</p><p>  m_pStart->SetSpriteVisible(false);</p><p>  m_pTankPlayer=new CTankPlayer("myplayer");//新建一個名字是myPlayer的我方坦克對象</p><p>  m_pTankPlayer->CloneSprite("p

87、layer");//我方坦克克隆在funcode模板中存在的名字為player的坦克,表示新建的坦克對象有現(xiàn)在精靈的所有屬性</p><p>  m_pTankPlayer->Init();</p><p>  //m_pTankEnemy->Init();</p><p>  m_vWeapon.push_back(m_pTankplayer

88、);</p><p>  LoadMap();</p><p>  m_pAim_nor = new CWeapon("myaim_nor");</p><p>  m_pAim_nor->CloneSprite("aim_nor");</p><p>  m_vWeapon.push_back(

89、m_pAim_nor);</p><p>  m_pAim_nor->SetSpriteCollisionReceive(true);</p><p>  m_pAim_nor->SetSpritePosition(0.f,20.f);</p><p>  m_iBulletNum = 0;</p><p>  m_iT

90、ankEnemyNumber = 0;</p><p>  m_fTankEnemyTime = 4.f;</p><p>  m_iScore = 0;</p><p>  //m_iHight = 0;</p><p>  m_iEnemy = 0;</p><p>  m_fDeltaTime = 0.f;&

91、lt;/p><p>  FILE * fp =fopen("save.dat","r+");</p><p><b>  if(fp){</b></p><p>  fread(&m_iHight,sizeof(int),1,fp);</p><p>  fclose(fp)

92、;</p><p><b>  }</b></p><p>  m_pHight = new CTextSprite("hight");</p><p>  m_pHight->SetTextValue(m_iHight);</p><p><b>  }</b></

93、p><p>  //=============================================================================</p><p><b>  //</b></p><p>  // 每局游戲進(jìn)行中</p><p>  void CGameMain::GameRun

94、( float fDeltaTime ){</p><p>  /*if(m_pTankEnemy)</p><p><b>  {</b></p><p>  m_pTankEnemy->OnMove(fDeltaTime);</p><p>  m_pTankEnemy->OnFire(fDeltaTi

95、me);</p><p><b>  }*/</b></p><p>  AddTankEnemy(fDeltaTime);</p><p>  for(int i=0;i<m_vWeapon.size();i++){</p><p>  if(!m_vWeapon[i]->IsDead()){</p

96、><p>  m_vWeapon[i]->OnMove(fDeltaTime);</p><p>  m_vWeapon[i]->OnFire(fDeltaTime);</p><p><b>  }</b></p><p><b>  else{</b></p><p&

97、gt;  DeleteWeaponByName(m_vWeapon[i]->GetName());</p><p><b>  }</b></p><p><b>  }</b></p><p>  m_fDeltaTime += fDeltaTime;</p><p>  m_pScore-

98、>SetTextValue(m_iScore);</p><p>  m_pHight->SetTextValue(m_iHight);</p><p>  m_pEnemy->SetTextValue(m_iEnemy);</p><p><b>  }</b></p><p>  //=======

99、======================================================================</p><p><b>  //</b></p><p><b>  // 本局游戲結(jié)束</b></p><p>  void CGameMain::GameEnd()</p&

100、gt;<p><b>  {</b></p><p>  g_GameMain.DeleteAllSprite();</p><p>  FILE * fp =fopen("save.dat","w+");</p><p>  if(m_iScore>m_iHight)</p&g

101、t;<p>  fwrite(&m_iScore,sizeof(int),1,fp);</p><p>  fclose(fp);</p><p>  m_pSplash->SetSpriteVisible(true);</p><p>  m_pStart->SetSpriteVisible(true);</p>&

102、lt;p>  SetGameState(0);</p><p><b>  }</b></p><p>  void CGameMain::OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress )</p><

103、p><b>  {</b></p><p>  if( KEY_SPACE == iKey && 0 == GetGameState() )</p><p><b>  {</b></p><p>  m_iGameState= 1 ;</p><p><b>  }

104、</b></p><p>  else if(m_iGameState == 2)</p><p><b>  {</b></p><p>  m_pTankplayer->OnMove(iKey, true);</p><p>  if(iKey == KEY_J)//判斷按下鍵是夠?yàn)镴鍵</p

105、><p><b>  {</b></p><p>  m_pTankplayer->OnFire();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b><

106、/p><p>  void CGameMain::OnKeyUp( const int iKey )</p><p><b>  {</b></p><p>  if(m_iGameState == 2)</p><p><b>  {</b></p><p>  m_pTank

107、player->OnMove(iKey, false);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void CGameMain::OnSpriteColWorldLimit( const char *szName, const int iColSide )

108、</p><p><b>  {</b></p><p>  if(strstr(szName,"myplayer") != NULL) //判斷碰到世界邊界的坦克是否為我方坦克</p><p><b>  {</b></p><p>  m_pTankplayer->Se

109、tSpriteLinearVelocity(0.f,0.f);</p><p><b>  }</b></p><p>  else if(strstr(szName,"enemy") != NULL)</p><p><b>  {</b></p><p>  CWeapon*

110、 pEnemy = FindWeaponByName(szName);</p><p>  pEnemy->SetSpriteLinearVelocity(0.f,0.f);</p><p><b>  }</b></p><p>  else if(strstr(szName,"bullet") != NULL)&l

111、t;/p><p><b>  {</b></p><p>  CWeapon* pBullet = FindWeaponByName(szName);</p><p>  pBullet->SetHp(0);</p><p><b>  }</b></p><p><

112、b>  }</b></p><p>  void CGameMain::AddBullet( int iDir,float fPosX,float fPosY ,int iOwner)</p><p><b>  {</b></p><p>  char* szName = CSystem::MakeSpriteName(&q

113、uot;bullet",m_iBulletNum);//創(chuàng)建坦克名字</p><p>  CBullet* pBullet = new CBullet(szName);</p><p>  pBullet->CloneSprite("bullet");</p><p>  pBullet->SetSpriteWorldLim

114、it(WORLD_LIMIT_NULL,-26, -22, 26, 22); //設(shè)置世界邊界</p><p>  pBullet->SetSpritePosition(fPosX,fPosY);</p><p>  pBullet->SetSpriteCollisionSend(true); //設(shè)置接收碰撞</p><p>  pBullet->

115、;OnMove(iDir);</p><p>  m_iBulletNum++; //子彈個數(shù)加1</p><p>  if(iOwner == 1)</p><p><b>  {</b></p><p>  pBullet->SetOwner(1);//1表示我方坦克發(fā)射的子彈</p><p

116、><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  pBullet->SetOwner(0); //0表示地方坦克發(fā)射的子彈</p><p><b>  }</b>

117、</p><p>  m_vWeapon.push_back(pBullet);</p><p><b>  }</b></p><p>  void CGameMain::LoadMap()</p><p><b>  {</b></p><p>  char* szNam

118、e;</p><p><b>  int i,j;</b></p><p>  float x,y;</p><p>  for(i=0;i<11;i++)</p><p><b>  {</b></p><p>  for(j=0;j<13;j++)</p

119、><p><b>  {</b></p><p>  if(g_iMap[i][j]==1)</p><p><b>  {</b></p><p>  szName = CSystem::MakeSpriteName("wall",j+i*13+i);//重新起名</p>

120、;<p>  CWeapon* pWall = new CWeapon(szName);</p><p>  pWall->CloneSprite("wall"); //克隆墻塊</p><p>  pWall->SetSpriteCollisionActive(0,1); //設(shè)置為接受碰撞</p><p>  pWa

121、ll->SetSpriteCollisionResponse(COL_RESPONSE_CUSTOM);</p><p>  x =float(-24+4*j);</p><p>  y =float(-20+4*i);</p><p>  pWall->SetSpritePosition(x,y);</p><p>  m_vW

122、eapon.push_back(pWall);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  CW

123、eapon* CGameMain::FindWeaponByName(const char* szName)//根據(jù)名字查找到對象</p><p><b>  {</b></p><p>  for(int i=0; i<m_vWeapon.size(); i++)</p><p><b>  {</b></p

124、><p>  if(strcmp(szName,m_vWeapon[i]->GetName()) == 0)</p><p><b>  {</b></p><p>  return m_vWeapon[i];</p><p><b>  }</b></p><p><

125、;b>  }</b></p><p><b>  }</b></p><p>  void CGameMain::DeleteWeaponByName(const char* szName)//根據(jù)名字把精靈從容器中刪除</p><p><b>  {</b></p><p>  

126、for(vector<CWeapon*>::iterator it=m_vWeapon.begin();it!=m_vWeapon.end();)</p><p><b>  {</b></p><p>  CWeapon* cw =*it;</p><p>  if(strcmp(szName,cw->GetName())

127、== 0)</p><p><b>  {</b></p><p>  m_vWeapon.erase(it);</p><p>  cw->DeleteSprite();</p><p>  delete cw;</p><p><b>  break;</b><

128、;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  it++;</b></p><p><b>  }</b>&

129、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p>  voidCGameMain::AddTankEnemy(float fDeltaTime)</p><p><b>  {</b></p><p>  

130、m_fTankEnemyTime += fDeltaTime;</p><p>  if(m_fTankEnemyTime > 5)</p><p>  { m_iEnemy++;</p><p>  char* szName = CSystem::MakeSpriteName("enemy",m_iTankEnemyNumber);&

131、lt;/p><p>  CTankEnemy* m_pTankEnemy = new CTankEnemy(szName);</p><p>  m_pTankEnemy->CloneSprite("enemy");</p><p>  m_pTankEnemy->Init();</p><p>  m_iTank

132、EnemyNumber++;</p><p>  m_vWeapon.push_back(m_pTankEnemy); //把創(chuàng)建的敵方坦克插入到容器中</p><p>  m_fTankEnemyTime=0.f;</p><p><b>  }</b></p><p><b>  }</b>&

133、lt;/p><p>  voidCGameMain::OnSpriteColSprite(const char *szSrcName, const char *szTarName)</p><p><b>  {</b></p><p>  CWeapon* tarSprite = FindWeaponByName(szTarName);<

134、/p><p>  if(strstr(szSrcName,"bullet") != NULL)//發(fā)送碰撞為子彈</p><p><b>  {</b></p><p>  CBullet *tmpBullet = (CBullet*)FindWeaponByName(szSrcName);</p><p&g

135、t;  tmpBullet->OnSpriteColSprite(tarSprite);</p><p>  if( tmpBullet->GetOwner()==1 && strstr(szTarName,"enemy") != NULL)</p><p><b>  {</b></p><p&g

136、t;  m_iScore++;</p><p>  m_iEnemy--;</p><p><b>  }</b></p><p>  if( tmpBullet->GetOwner()==0 && strstr(szTarName,"enemy") != NULL){</p><p

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論