10 C++課程設(shè)計(jì)_貪吃魚(yú)_第1頁(yè)
10 C++課程設(shè)計(jì)_貪吃魚(yú)_第2頁(yè)
10 C++課程設(shè)計(jì)_貪吃魚(yú)_第3頁(yè)
10 C++課程設(shè)計(jì)_貪吃魚(yú)_第4頁(yè)
10 C++課程設(shè)計(jì)_貪吃魚(yú)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+面向?qū)ο笳n程設(shè)計(jì)實(shí)驗(yàn)指南上海銳格軟件有限公司課程設(shè)計(jì)二 貪吃魚(yú)一、游戲介紹貪吃魚(yú)是玩家用WSAD鍵控制魚(yú)上下左右運(yùn)動(dòng),吃掉其中比自己等級(jí)小或者相等的魚(yú)。魚(yú)從右側(cè)游向左側(cè)。游戲中有兩種魚(yú),其中一種如果被自己等級(jí)高,就被吃掉了,另一種魚(yú)如果等級(jí)比自己高,只扣除一定的生命值。吃到越多的魚(yú),小魚(yú)就會(huì)相應(yīng)的長(zhǎng)大。二、實(shí)驗(yàn)?zāi)康木C合應(yīng)用C+語(yǔ)言和面向?qū)ο蟮闹R(shí)開(kāi)發(fā)一款小游戲。三、實(shí)驗(yàn)內(nèi)容在一個(gè)深海里,玩家通過(guò)鍵盤(pán)WSAD鍵控制己方小魚(yú)移動(dòng),吃到其中比自己等級(jí)低或者等級(jí)相等的魚(yú)。要求如下:1、 游戲運(yùn)行時(shí),初始界面如下圖。2、 按下空格鍵,游戲開(kāi)始,玩家通過(guò)WSAD鍵控制小魚(yú)移動(dòng);小魚(yú)不能游出世界邊界。3

2、、 有2種類(lèi)型的魚(yú),普通魚(yú)和特殊魚(yú)。碰到普通魚(yú)時(shí),如果等級(jí)比自己高,小魚(yú)就被吃掉了。碰到特殊魚(yú),如果等級(jí)比自己高,小魚(yú)只是被扣掉一定的生命值。4、 敵方的小魚(yú)都是從右向左一定。5、 玩家小魚(yú)被吃掉后,游戲停止,重新顯示初始界面。游戲初始界面四、實(shí)驗(yàn)指南實(shí)驗(yàn)準(zhǔn)備打開(kāi)FunCode,創(chuàng)建一個(gè)新的C+項(xiàng)目。注意:項(xiàng)目名稱(chēng)必須為英文和數(shù)字,且不能有空格。點(diǎn)擊“項(xiàng)目”“導(dǎo)入地圖模板”,從對(duì)話框中選取名稱(chēng)為eatfish的模板導(dǎo)入。導(dǎo)入成功后,界面如下:實(shí)驗(yàn)一游戲開(kāi)始和控制玩家小魚(yú)【實(shí)驗(yàn)內(nèi)容】1、 按空格鍵,游戲開(kāi)始,“空格開(kāi)始”字樣消失。2、 創(chuàng)建CMyFish類(lèi),并創(chuàng)建對(duì)象實(shí)例玩家控制的小魚(yú)。3、 小

3、魚(yú)的初始大小為原大小的1/4。4、 小魚(yú)左右運(yùn)動(dòng)的速度為30。上下運(yùn)動(dòng)的速度為15。5、 小魚(yú)碰到世界邊界時(shí),靜止。6、 游戲開(kāi)始后,通過(guò)鍵盤(pán)WSAD鍵控制小魚(yú)移動(dòng)。7、 在游戲中顯示游戲的等級(jí)和玩家控制的魚(yú)的HP?!緦?shí)驗(yàn)思路】按空格鍵開(kāi)始游戲,屬于鍵盤(pán)按下事件,我們?cè)赿OnKeyDown函數(shù)中編寫(xiě)代碼。在游戲中,我們運(yùn)用面向?qū)ο蟮闹R(shí)將小魚(yú)看成一個(gè)對(duì)象,并為這個(gè)對(duì)象添加一個(gè)類(lèi)叫CMyFish。類(lèi)具有屬性和方法,要控制小魚(yú)能在各個(gè)方向上自由的游動(dòng),我們?yōu)镃MyFish類(lèi)添加上下左右四個(gè)方向的速度,并且我們?yōu)樾◆~(yú)添加OnMove方法控制小魚(yú)的游動(dòng)狀態(tài)?!緦?shí)驗(yàn)指導(dǎo)】1、 在OnKeyDown中,當(dāng)

4、按下的按鍵為空格鍵并且此時(shí)的游戲狀態(tài)為0,則設(shè)置游戲的狀態(tài)為1。0表示此時(shí)游戲?yàn)榈却隣顟B(tài),未開(kāi)始。1表示游戲進(jìn)行初始化,初始化后會(huì)進(jìn)入2游戲運(yùn)行狀態(tài)。/ 按下空格鍵,游戲開(kāi)始if( KEY_SPACE = iKey && 0 = GetGameState() )SetGameState( 1 );2、 在游戲初始化函數(shù)GameInit中隱藏 "按空格開(kāi)始游戲" 這個(gè)提示圖片。在CGameMain中添加成員變量:CSprite *m_pBeginSprite;在CGameMain的構(gòu)造函數(shù)中進(jìn)行初始化:m_pBeginSprite = new CSprite(

5、"kaishi");在GameInit中添加一下代碼:m_pBeginSprite->SetSpriteVisible( false );3、 通過(guò)類(lèi)向?qū)?chuàng)建CMyFish類(lèi)。首先添加向左、向右、向上、向下4個(gè)方向的運(yùn)動(dòng)速度屬性。添加OnMove方法控制小魚(yú)的游動(dòng),bKeyDown表示鍵盤(pán)時(shí)按下的,iKey表示相應(yīng)的是哪個(gè)按鍵。class CMyFish : public CSprite public:CMyFish(const char *szName);virtual CMyFish();public:void OnMove(bool bKeyDown,int i

6、Key);private:floatm_fVelocityLeft;/ 控制的魚(yú)的上下左右游動(dòng)速度f(wàn)loatm_fVelocityRight;floatm_fVelocityUp;floatm_fVelocityDown; ;4、 在CMyFish類(lèi)的構(gòu)造函數(shù)中,首先初始4個(gè)方向的速度為0,然后設(shè)置小魚(yú)縮小到原圖的1/4,最后設(shè)置和世界邊界的碰撞屬性為WORLD_LIMIT_STICKY,當(dāng)碰到世界邊界時(shí),小魚(yú)靜止不動(dòng)。而小魚(yú)的世界邊界大小,我們?cè)O(shè)置為比屏幕的大小大2個(gè)單位。/ 設(shè)置魚(yú)的模型大小為1/4SetSpriteScale( 0.25f );/ 世界邊界限制SetSpriteWorld

7、Limit( WORLD_LIMIT_STICKY, CSystem:GetScreenLeft()-2.f, CSystem:GetScreenTop() - 2.f, CSystem:GetScreenRight() + 2.f, CSystem:GetScreenBottom() + 2.f );5、 編寫(xiě)CMyFish類(lèi)OnMove方法代碼。首先判斷當(dāng)前按鍵是按下還是松開(kāi)的,其次判斷是哪個(gè)按鍵的消息,根據(jù)這兩個(gè)判斷,為4個(gè)方向的速度矢量賦值。再次算出X后和Y軸上的速度,并設(shè)置小魚(yú)的速度。最后根據(jù)X軸方向的速度值設(shè)置魚(yú)的朝向。當(dāng)速度不為0的時(shí)候,更改魚(yú)的朝向。void CMyFish:O

8、nMove(bool bKeyDown,int iKey)if(bKeyDown)switch(iKey)case KEY_A: / 左m_fVelocityLeft =30.f;break;case KEY_D: / 右m_fVelocityRight =30.f;break;case KEY_W: / 上m_fVelocityUp =15.f;break;case KEY_S: / 下m_fVelocityDown =15.f;break;elseswitch(iKey)case KEY_A: / 左m_fVelocityLeft =0.f;break;case KEY_D: / 右m_f

9、VelocityRight =0.f;break;case KEY_W: / 上m_fVelocityUp =0.f;break;case KEY_S: / 下m_fVelocityDown =0.f;break;float fVelX= m_fVelocityRight - m_fVelocityLeft;float fVelY = m_fVelocityDown - m_fVelocityUp;SetSpriteLinearVelocity( fVelX,fVelY );/ 當(dāng)速度不為0的時(shí)候,更改魚(yú)的朝向if( fVelX < -0.0001f | fVelX > 0.000

10、1f )if( fVelX > 0.0001f )SetSpriteFlipX( false );elseSetSpriteFlipX( true );6、 在CGameMain類(lèi)中,首先添加一個(gè)小魚(yú)對(duì)象的指針m_pMyFish。其次在構(gòu)造函數(shù)中將m_pMyFish賦予NULL的初始值。再次在GameInit方法中初始化m_pMyFish。因?yàn)槲覀冇胣ew方法創(chuàng)建了m_pMyFish對(duì)象,分配了內(nèi)存,所以我們?cè)贑GameMain類(lèi)的析構(gòu)函數(shù)中需要調(diào)用delete方法將 m_pMyFish使用的內(nèi)存釋放掉。if( NULL = m_pMyFish )/ 創(chuàng)建對(duì)象實(shí)例m_pMyFish=ne

11、w CMyFish("kongzhiyu");7、 在OnKeyDown和OnkeyUp中響應(yīng)小魚(yú)OnMove方法,它們的區(qū)別只是第一個(gè)參數(shù)的值不同。下面是OnKeyDown方法中的調(diào)用。if( 2 = GetGameState() )m_pMyFish->OnMove(true,iKey);8、 在CGameMain類(lèi)的GameInit方法中顯示當(dāng)前等級(jí)和分?jǐn)?shù)。m_pLevelText和m_pHpText需要在CGameMain類(lèi)中聲明,并在其構(gòu)造函數(shù)中定義,其類(lèi)類(lèi)型為CTextSprite。/ 更新當(dāng)前等級(jí)/HP顯示m_pLevelText->SetText

12、Value( 1 );/ 等級(jí)設(shè)置為1m_pHpText->SetTextValue( 0 );/ 分?jǐn)?shù)設(shè)置為0實(shí)驗(yàn)二為游戲添加各種小魚(yú)【實(shí)驗(yàn)內(nèi)容】1、 創(chuàng)建普通魚(yú)CNormalFish類(lèi);2、 新添的小魚(yú)一共有4種,從魚(yú)類(lèi)模板中隨機(jī)生成;3、 間隔1到2秒生成一只小魚(yú);4、 小魚(yú)以隨機(jī)速度從右向左移動(dòng);5、 小魚(yú)碰到世界邊界后消失;【實(shí)驗(yàn)思路】我們將在游戲中出現(xiàn)的敵方小魚(yú)看成對(duì)象,這些對(duì)象具有共同的屬性和方法,因此我們創(chuàng)建一個(gè)CNormalFish類(lèi)。并且給這些魚(yú)一定的速度,讓他們從產(chǎn)生就開(kāi)始運(yùn)動(dòng),游過(guò)屏幕,然后到達(dá)世界邊界的另一端就被刪除?!緦?shí)驗(yàn)指導(dǎo)】1、 根據(jù)類(lèi)向?qū)?chuàng)建CNorma

13、lFish類(lèi)。/ 普通類(lèi)型的魚(yú),有等級(jí)屬性。我們控制的魚(yú)如果等級(jí)大于等于此魚(yú),則可以吃/ 掉其,如果小于,則被吃掉class CNormalFish : public CSpritepublic:CNormalFish( const char *szName);CNormalFish() ;2、 在CNormalFish類(lèi)的構(gòu)造函數(shù)中。首先生成一個(gè)1到100的隨機(jī)數(shù),根據(jù)隨機(jī)數(shù)的大小,我們選擇不同的小魚(yú)模板。當(dāng)隨機(jī)數(shù)小于15時(shí)我們選擇yu_muban4的小魚(yú)做為模板,當(dāng)隨機(jī)數(shù)在15,35區(qū)間時(shí),我們選擇yu_muban3做為模板,當(dāng)隨機(jī)數(shù)在35,60區(qū)間時(shí),我們選擇yu_muban2做為模板,

14、當(dāng)隨機(jī)數(shù)在60,100區(qū)間,我們選擇yu_muban1做為模板。intiRandom=CSystem:RandomRange( 1, 100 );if( iRandom < 15 )CloneSprite( "yu_muban4" );else if( iRandom < 35 )CloneSprite( "yu_muban3" );else if( iRandom < 60 )CloneSprite( "yu_muban2" );elseCloneSprite( "yu_muban1" );3、

15、 接著為小魚(yú)設(shè)置X軸坐標(biāo)和一個(gè)隨機(jī)的Y軸坐標(biāo)。因?yàn)樾◆~(yú)從右向左游,因此X坐標(biāo)在世界邊界的右邊一些。而Y軸坐標(biāo)的區(qū)間在世界邊界的Top和Bottom值之間。同時(shí)因?yàn)樾◆~(yú)向右游,我們需要將魚(yú)的朝向改為朝向X軸的負(fù)方向。iRandom=CSystem:RandomRange(int)CSystem:GetScreenTop(),(int)CSystem:GetScreenBottom();SetSpritePosition(CSystem:GetScreenRight() + 10.f, (float)iRandom );SetSpriteFlipX( true );4、 最后我們?yōu)樾◆~(yú)設(shè)置一個(gè)隨機(jī)

16、速度和世界邊界的碰撞屬性和范圍限制。速度在10,25區(qū)間。當(dāng)小魚(yú)碰到世界邊界時(shí)小魚(yú)消失,因此設(shè)置為WORLD_LIMIT_KILL,而范圍,我們需設(shè)置的比屏幕邊界大一些,讓小魚(yú)完全游出屏幕時(shí)才消失。 iRandom=CSystem:RandomRange( 10, 25 );SetSpriteLinearVelocityX( -(float)iRandom );SetSpriteWorldLimit(WORLD_LIMIT_NULL, CSystem:GetScreenLeft() - 10.f,CSystem:GetScreenTop(),CSystem:GetScreenRight()+2

17、0.f,CSystem:GetScreenBottom();5、 完成了CNormalFish類(lèi)后,我們需要在CGameMain類(lèi)中生成小魚(yú),即生成CNormalFish類(lèi)的實(shí)例。首先添加一個(gè)變量表示創(chuàng)建魚(yú)的時(shí)間間隔和表示小魚(yú)數(shù)目的變量。float m_fCreateNormalTime;int m_iCreatedFishCount;6、 然后在GameRun方法中,游戲循環(huán)將m_fCreateNormalTime遞減,當(dāng)m_fCreateNormalTime小于0時(shí),創(chuàng)建一只魚(yú)。并在100,300區(qū)間隨機(jī)去個(gè)數(shù)除以100做為下一次創(chuàng)建小魚(yú)的時(shí)間間隔。char szName128;m_fCr

18、eateNormalTime -=fDeltaTime;if( m_fCreateNormalTime <= 0.f )intiNextTime=CSystem:RandomRange( 100, 300 );m_fCreateNormalTime = (float)iNextTime / 100.f;sprintf( szName, "putongyu_%d", m_iCreatedFishCount );m_iCreatedFishCount+;CNormalFish*fish = new CNormalFish(szName);實(shí)驗(yàn)三吃小魚(yú)【實(shí)驗(yàn)內(nèi)容】1、 玩家

19、控制小魚(yú)與其它小魚(yú)碰撞,當(dāng)玩家小魚(yú)等級(jí)小于敵方小魚(yú)時(shí),玩家小魚(yú)被吃掉,反之?dāng)撤叫◆~(yú)被吃掉;每吃掉一只小魚(yú),玩家小魚(yú)的分?jǐn)?shù)增加為敵方小魚(yú)的HP值2、 需要根據(jù)小魚(yú)的等級(jí)確定碰撞的不同結(jié)果,因此為小魚(yú)添加等級(jí)的屬性;3、 同時(shí)不同的等級(jí)擁有不同的分?jǐn)?shù),因此為小魚(yú)增加分?jǐn)?shù)的屬性;【實(shí)驗(yàn)思路】首先為CMyFish類(lèi)增加碰撞屬性;然后為CMyFish類(lèi)增加表示小魚(yú)等級(jí)和HP的屬性,增加設(shè)置等級(jí)、HP值和獲得等級(jí)、HP值的方法;同理為CNormalFish類(lèi)增加碰撞屬性及其小魚(yú)等級(jí)、HP的屬性和獲得等級(jí)、HP值的方法。CMyFish、CNormalFish類(lèi)小魚(yú),是在創(chuàng)建時(shí)就設(shè)置好了其等級(jí)和HP值,因此我

20、們可以在構(gòu)造函數(shù)中增加兩個(gè)參數(shù),直接在創(chuàng)建小魚(yú)時(shí),就初始化好等級(jí)和HP值。在CGameMain類(lèi)的OnSpriteColSprite碰撞函數(shù)中檢測(cè)碰撞,并更新游戲界面中HP的值。在OnSpriteColSprite中,我可以知道碰撞雙方的名稱(chēng),但我們還需要根據(jù)名稱(chēng)獲得具體的小魚(yú)的對(duì)象,以便獲得小魚(yú)的等級(jí)和HP值等屬性,因此我們每創(chuàng)建一只小魚(yú),就把這只小魚(yú)增加到鏈表中管理起來(lái)。這樣我們就增加了一個(gè)FishList鏈表?!緦?shí)驗(yàn)指導(dǎo)】1、 首先為MyFish設(shè)置碰撞屬性。MyFish產(chǎn)生碰撞,敵方小魚(yú)接受碰撞。這個(gè)在控制面板中已經(jīng)設(shè)置好了,如果想自己設(shè)置么可以添加如下代碼,將控制面板中碰撞屬性取消,

21、在構(gòu)造函數(shù)中設(shè)置碰撞屬性。SetSpriteCollisionActive(true,false);2、 其次為敵方小魚(yú)設(shè)置碰撞屬性。敵方小魚(yú)接受碰撞,這個(gè)屬性和1一樣,也在界面中設(shè)置好了,如果想要自行設(shè)置,可以取消界面中的設(shè)置,然后在CNormalFish類(lèi)的構(gòu)造函數(shù)中增加如下代碼。SetSpriteCollisionActive(false,true);3、 為CMyFish和CNormalFish增加等級(jí)和HP值的屬性,和設(shè)置、獲得這兩個(gè)屬性的方法,最后改造構(gòu)造函數(shù)。int m_iHp;int m_iLevel;CMyFish: CMyFish ( const char *szName,

22、 const int iHp, const int iLevel );CNormalFish:CNormalFish( const char *szName); /普通魚(yú)的HP和level隨機(jī)生成4、 在中定義結(jié)構(gòu)體FishList,并在CGameMain類(lèi)中添加一個(gè)頭節(jié)點(diǎn)m_pFishHeader。struct FishListCNormalFish*pPtr;FishList*pNext;/ 指向鏈表的下一個(gè)FishList*pPrev; / 指向鏈表的上一個(gè);5、 在CGameMain類(lèi)中添加AddFish方法實(shí)現(xiàn)將小魚(yú)添加到鏈表中,參數(shù)為生成的敵方小魚(yú)的指針。void CGameMai

23、n:AddFish( CNormalFish *pSprite )if( NULL = pSprite )return;FishList*pFish=new FishList;pFish->pPtr=pSprite;pFish->pNext=NULL;pFish->pPrev=NULL;/ 插入鏈表中if( NULL = m_pFishHeader )m_pFishHeader=pFish;elseFishList*pTemp=m_pFishHeader;while( NULL != pTemp->pNext )pTemp=pTemp->pNext;pFish-&

24、gt;pPrev=pTemp;pTemp->pNext=pFish;6、 同時(shí)在碰撞時(shí),我們需要根據(jù)小魚(yú)的名稱(chēng)獲得小魚(yú)的對(duì)象,因此添加GetFishFromName方法。CNormalFish* CGameMain:GetFishFromName( const char *szName )FishList*pFish=NULL;for( pFish=m_pFishHeader; NULL != pFish; pFish=pFish->pNext )if( strcmp( szName, pFish->pPtr->GetName() = 0 )return pFish-&

25、gt;pPtr;return NULL;7、 在CGameMain類(lèi)的GameRun方法中,將創(chuàng)建的小魚(yú)對(duì)象的指針添加到鏈表中。8、 玩家的小魚(yú)根據(jù)HP值分為1-4不同的等級(jí),初始HP的值為10,等級(jí)為1。當(dāng)HP大于20時(shí)且等級(jí)為1時(shí),玩家升為2級(jí);當(dāng)HP值大于100時(shí)且等級(jí)為2時(shí),玩家升為3級(jí);當(dāng)HP值大于1000時(shí)且等級(jí)為3時(shí),玩家升為4級(jí)。每升1級(jí),魚(yú)的大小也變大25%。在CNormalFish類(lèi)中添加碰撞處理函數(shù):void OnColControlFish(CMyFish *pControlFish);定義如下:void CNormalFish:OnColControlFish(CMy

26、Fish *pControlFish).在上述函數(shù)中添加以下代碼:if (pControlFish = NULL)return;elseif( m_pMyFish->GetLevel() >= GetLevel() )pControlFish->SetHp(pControlFish ->GetHp()+GetHp();if(m_pMyFish ->GetHp() >= 1000 && m_pMyFish ->GetLevel() = 3 )m_pMyFish ->SetLevel( 4 );m_pMyFish ->SetSp

27、riteScale( 1.0f ); / 模型變大else if(m_pMyFish ->GetHp() >= 100 && m_pMyFish ->GetLevel() = 2 )m_pMyFish ->SetLevel( 3 );m_pMyFish ->SetSpriteScale( 0.75f ); / 模型變大else if(m_pMyFish ->GetHp() >= 20 && m_pMyFish ->GetLevel() = 1 )m_pMyFish ->SetLevel( 2 );m_pMyF

28、ish ->SetSpriteScale( 0.5f ); / 模型變大elsepControlFish->SetHp(0);9、 接著我們?cè)贑GameMain類(lèi)中聲明函數(shù)OnSpriteColSprite處理碰撞。OnSpriteColSprite函數(shù)的第一個(gè)參數(shù)是碰撞的產(chǎn)生方的名稱(chēng),第二個(gè)參數(shù)是碰撞接受方的名稱(chēng)。由上面兩個(gè)步驟,我們知道碰撞產(chǎn)生方是玩家控制的小魚(yú)的名稱(chēng),接受方是敵方小魚(yú)的名稱(chēng)。而碰撞方是直接被刪除。同時(shí)更新玩家控制小魚(yú)的HP。if( 2 != GetGameState() | NULL = m_pMyFish)return;else if( strcmp( m_

29、pMyFish->GetName(), szSrcName ) = 0 )if( !strstr( szTarName, "putongyu" ) )return;CNormalFish*pFish=GetFishFromName( szTarName );if( NULL != pFish )pFish->OnColControlFish(m_pMyFish);DeleteFishFromName(szTarName); 10、 DeleteFishFromName將碰撞后的小魚(yú)從鏈表中刪除。void CGameMain:DeleteFishFromName(

30、 const char *szName )FishList*pFish=NULL;for( pFish=m_pFishHeader; NULL != pFish; pFish=pFish->pNext )if( strcmp( szName, pFish->pPtr->GetName() ) = 0 )if( NULL != pFish->pNext )pFish->pNext->pPrev=pFish->pPrev;if( NULL != pFish->pPrev )pFish->pPrev->pNext=pFish->pNe

31、xt;if( pFish = m_pFishHeader )m_pFishHeader=m_pFishHeader->pNext;pFish->pPtr->DeleteSprite();delete pFish;return;11、 在GameRun方法中更新玩家小魚(yú)等級(jí)和HP的值m_pLevelText->SetTextValue( m_pMyFish->GetLevel() );m_pHpText->SetTextValue( m_pMyFish->GetHp() );12、 在CGameMain類(lèi)中增加游戲輸贏的判斷方法IsGameLost和Is

32、GameWin。玩家小魚(yú)的等級(jí)達(dá)到4級(jí), 并且HP大于1000時(shí)玩家贏。當(dāng)玩家的HP值小于1時(shí),游戲結(jié)束。13、 在GameMainLoop中加入游戲輸贏判斷。游戲結(jié)束或贏都回到游戲開(kāi)始頁(yè)面。/ 判斷輸贏if( IsGameWin() | IsGameLost() )SetGameState(0);GameEnd();else / 游戲未結(jié)束,繼續(xù)游戲GameRun( fDeltaTime );14、 添加判斷輸贏的方法/ 游戲是否贏了-魚(yú)的等級(jí)達(dá)到4級(jí), 并且HP > 10000bool CGameMain:IsGameWin() if (m_pMyFish->GetHp() &

33、gt; 10000 && m_pMyFish->GetLevel() = 4)return true;return false;/ 是否輸了 - HP小于1bool CGameMain:IsGameLost() if (m_pMyFish->GetHp() < 1)return true;return false;15、 在GameInit中,當(dāng)游戲重新開(kāi)始時(shí),即m_pMyFish不為NULL時(shí),只需設(shè)置MyFish的等級(jí)、HP值和初始大小就可以了。m_pMyFish->SetLevel( 1 );m_pMyFish->SetHp( 10 );m_

34、pMyFish->SetSpriteScale( 0.25f );16、 當(dāng)游戲結(jié)束時(shí),顯示空格開(kāi)始。m_pBeginSprite->SetSpriteVisible(true);實(shí)驗(yàn)四增加一種小魚(yú)【實(shí)驗(yàn)內(nèi)容】增加一種小魚(yú),這種小魚(yú)沒(méi)有等級(jí),只有HP(生命值),玩家控制的魚(yú),碰到此特殊魚(yú),不能吃掉該魚(yú),反而被減HP?!緦?shí)驗(yàn)思路】和一般的小魚(yú)一樣,創(chuàng)建一個(gè)CSpecialFish類(lèi),并且將創(chuàng)建出的對(duì)象加入到小魚(yú)鏈表中。改造鏈表的節(jié)點(diǎn),使鏈表能夠容納第二中小魚(yú)。【實(shí)驗(yàn)指導(dǎo)】1、 為了將此類(lèi)型的魚(yú)添加到鏈表中,需要對(duì)結(jié)構(gòu)體做以下修改。struct FishListCSprite*pPtr

35、;FishList*pNext;/ 指向鏈表的下一個(gè)FishList*pPrev; / 指向鏈表的上一個(gè);2、 修改鏈表中增加小魚(yú)的操作AddFish。/ 添加一個(gè)精靈到鏈表中void CGameMain:AddFish( CSprite *pSprite,int iType )if( NULL = pSprite )return;FishList*pFish=new FishList;/pFish->pPtr=pSprite;pFish->pNext=NULL;pFish->pPrev=NULL;/ 插入鏈表中if( NULL = m_pFishHeader )m_pFis

36、hHeader=pFish;elseFishList*pTemp=m_pFishHeader;while( NULL != pTemp->pNext )pTemp=pTemp->pNext;pFish->pPrev=pTemp;pTemp->pNext=pFish;3、 通過(guò)類(lèi)向?qū)?chuàng)建CSpecialFish類(lèi),其繼承與CSprite類(lèi)。添加生命值屬性,獲得和設(shè)置生命值方法。intm_iHp;intGetHp();void SetHp( const int iHp );4、在其構(gòu)造函數(shù)中將其作為模板魚(yú)6的復(fù)制,并將其大小改變。CloneSprite( "yu_

37、muban6" );SetSpriteScale(0.5f);5、 接著為小魚(yú)設(shè)置X軸坐標(biāo)和一個(gè)隨機(jī)的Y軸坐標(biāo)。因?yàn)樾◆~(yú)從右向左游,因此X坐標(biāo)在世界邊界的右邊一些。而Y軸坐標(biāo)的區(qū)間在世界邊界的Top和Bottom值之間。同時(shí)因?yàn)樾◆~(yú)向右游,我們需要將魚(yú)的朝向改為朝向X軸的負(fù)方向。int iRandom=CSystem:RandomRange(int)CSystem:GetScreenTop(),(int)CSystem:GetScreenBottom();SetSpritePosition(CSystem:GetScreenRight() + 10.f, (float)iRandom

38、 );SetSpriteFlipX( true );6、 最后我們?yōu)樾◆~(yú)設(shè)置一個(gè)隨機(jī)速度和世界邊界的碰撞屬性和范圍限制。速度在10,25區(qū)間。當(dāng)小魚(yú)碰到世界邊界時(shí)小魚(yú)消失,因此設(shè)置為WORLD_LIMIT_KILL,而范圍,我們需設(shè)置的比屏幕邊界大一些,讓小魚(yú)完全游出屏幕時(shí)才消失。 iRandom=CSystem:RandomRange( 10, 25 );SetSpriteLinearVelocityX( -(float)iRandom );SetSpriteWorldLimit(WORLD_LIMIT_NULL, CSystem:GetScreenLeft() - 10.f,CSystem

39、:GetScreenTop(),CSystem:GetScreenRight()+20.f,CSystem:GetScreenBottom();7、初始化其HP的值:m_iHp= 15;8、添加處理這種類(lèi)型的魚(yú)的碰撞功能函數(shù)OnColControlFish,其聲明如下:void OnColControlFish(CMyFish *pControlFish);函數(shù)定義以及處理如下:void CSpecialFish:OnColControlFish(CMyFish *pControlFish)int HP;if (NULL = pControlFish)return ;elsepControlF

40、ish->SetHp( pControlFish->GetHp() - GetHp() ); HP = pControlFish->GetHp();if( HP <= 0 )pControlFish->SetHp(0);pControlFish->SetLevel(1);pControlFish->SetSpriteScale(0.25f);else if (HP <= 20)pControlFish->SetLevel(1);pControlFish->SetSpriteScale(0.25f);else if (HP <= 100)pControlFish->SetLevel(2);pCo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論