版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- java坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告.doc
- 新世紀(jì)坦克大戰(zhàn)課程設(shè)計(jì)報(bào)告
- 坦克大戰(zhàn)--java課程設(shè)計(jì)
- java關(guān)于坦克大戰(zhàn)的課程設(shè)計(jì)報(bào)告
- 基于java坦克大戰(zhàn)課程設(shè)計(jì)
- java語言程序課程設(shè)計(jì)-- 坦克大戰(zhàn)
- java課程設(shè)計(jì)---基于java的坦克大戰(zhàn)
- java課程設(shè)計(jì)----基于java的坦克大戰(zhàn)
- java課程設(shè)計(jì)坦克大戰(zhàn)游戲(含代碼)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告-- 坦克大戰(zhàn)游戲設(shè)計(jì)(java版)
- c++課程設(shè)計(jì)報(bào)告--坦克游戲
- 坦克大戰(zhàn)
- 坦克大戰(zhàn)游戲設(shè)計(jì)論文
- 坦克大戰(zhàn)畢業(yè)設(shè)計(jì)
- 坦克大戰(zhàn)2
- 新坦克大戰(zhàn)
- 坦克大戰(zhàn)游戲畢業(yè)設(shè)計(jì)
評論
0/150
提交評論