10 C++课程设计 - 贪吃鱼 - 图文

发布时间 : 星期二 文章10 C++课程设计 - 贪吃鱼 - 图文更新完毕开始阅读

CNormalFish *pPtr; FishList FishList };

5、 在CGameMain类中添加AddFish方法实现将小鱼添加到链表中,参数为生成的敌

方小鱼的指针。

void CGameMain::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; else { FishList *pTemp = m_pFishHeader; while( NULL != pTemp->pNext ) pTemp = pTemp->pNext; pFish->pPrev = pTemp; pTemp->pNext = pFish; }

}

6、 同时在碰撞时,我们需要根据小鱼的名称获得小鱼的对象,因此添加

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->pPtr; }

return NULL; }

7、 在CGameMain类的GameRun方法中,将创建的小鱼对象的指针添加到链表中。 8、 玩家的小鱼根据HP值分为1-4不同的等级,初始HP的值为10,等级为1。当HP

大于20时且等级为1时,玩家升为2级;当HP值大于100时且等级为2时,玩家升为3级;当HP值大于1000时且等级为3时,玩家升为4级。每升1级,鱼的大小也变大25%。在CNormalFish类中添加碰撞处理函数: void OnColControlFish(CMyFish *pControlFish);

8

*pNext; // 指向链表的下一个 *pPrev; // 指向链表的上一个

上海锐格软件有限公司

定义如下:

void CNormalFish::OnColControlFish(CMyFish *pControlFish) { ... }

在上述函数中添加以下代码: if (pControlFish == NULL) { return; } else { if( m_pMyFish->GetLevel() >= GetLevel() ) { pControlFish->SetHp(pControlFish ->GetHp()+GetHp());

if(m_pMyFish ->GetHp() >= 1000 && m_pMyFish ->GetLevel() == 3 ) { m_pMyFish ->SetLevel( 4 );

m_pMyFish ->SetSpriteScale( 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_pMyFish ->SetSpriteScale( 0.5f ); // 模型变大 }

}

9、 接着我们在CGameMain类中声明函数OnSpriteColSprite处理碰撞。OnSpriteColSprite

函数的第一个参数是碰撞的产生方的名称,第二个参数是碰撞接受方的名称。由上面两个步骤,我们知道碰撞产生方是玩家控制的小鱼的名称,接受方是敌方小鱼的名称。而碰撞方是直接被删除。同时更新玩家控制小鱼的HP。 if( 2 != GetGameState() || NULL == m_pMyFish)

return;

9

} else { pControlFish->SetHp(0); }

else if( strcmp( m_pMyFish->GetName(), szSrcName ) == 0 ) {

if( !strstr( szTarName, \ return; CNormalFish *pFish = GetFishFromName( szTarName );

if( NULL != pFish ) { pFish-> OnColControlFish(m_pMyFish); DeleteFishFromName(szTarName); } }

10、 DeleteFishFromName将碰撞后的小鱼从链表中删除。

void CGameMain::DeleteFishFromName( 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->pNext; } if( pFish == m_pFishHeader ) { m_pFishHeader = m_pFishHeader->pNext; } pFish->pPtr->DeleteSprite();

delete pFish; return;

} } } 11、 在GameRun方法中更新玩家小鱼等级和HP的值 m_pLevelText->SetTextValue( m_pMyFish->GetLevel() ); m_pHpText->SetTextValue( m_pMyFish->GetHp() ); 12、 在CGameMain类中增加游戏输赢的判断方法IsGameLost和IsGameWin。玩家

小鱼的等级达到4级, 并且HP大于1000时玩家赢。当玩家的HP值小于1时,游

10

上海锐格软件有限公司

戏结束。 13、 在GameMainLoop中加入游戏输赢判断。游戏结束或赢都回到游戏开始页面。

// 判断输赢

if( IsGameWin() || IsGameLost() ) {

SetGameState(0); GameEnd(); }

else // 游戏未结束,继续游戏 {

GameRun( fDeltaTime ); }

14、 添加判断输赢的方法

// 游戏是否赢了--鱼的等级达到4级, 并且HP > 10000 bool CGameMain::IsGameWin() {

if (m_pMyFish->GetHp() > 10000 && m_pMyFish->GetLevel() == 4) { return true; } return false; }

// 是否输了 -- HP小于1

bool CGameMain::IsGameLost() {

if (m_pMyFish->GetHp() < 1) { return true; } return false; } 15、 在GameInit中,当游戏重新开始时,即m_pMyFish不为NULL时,只需设置

MyFish的等级、HP值和初始大小就可以了。 m_pMyFish->SetLevel( 1 ); m_pMyFish->SetHp( 10 );

m_pMyFish->SetSpriteScale( 0.25f ); 16、 当游戏结束时,显示空格开始。

m_pBeginSprite->SetSpriteVisible(true);

实验四 增加一种小鱼

【实验内容】

增加一种小鱼,这种小鱼没有等级,只有HP(生命值),玩家控制的鱼,碰到此特殊鱼,不能吃掉该鱼,反而被减HP。

11

联系合同范文客服:xxxxx#qq.com(#替换为@)