⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbattle.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:

			m_pGame->GetDisplay()->Clear();
			
			m_pRender->Render();

			m_pGame->ShowFPS();

			m_pGame->GetDisplay()->Present();
		}
		else
			WaitMessage();
	}
_out:
	
	return 1;
}
int CBattle::EnemyTurn()
{
	MSG msg;
	BOOL bEnemyAction[LOA_MAX_BATTLE_ENEMY];
	int i;
	for(i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
		bEnemyAction[i]=false;
	int index=0;
	while(m_pGame->IsPlayGame())
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL,0,0)) 
				return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(m_pGame->IsActive())
		{
			
			while(1)
			{
				if(!m_pEnemy[index]->bShow ||(m_pEnemy[index]->pRole!=NULL && m_pEnemy[index]->pRole->bDead==TRUE))
				{
					index++;
					if(index>=LOA_MAX_BATTLE_ENEMY)
						break;
				}
				
				else
					break;
				
			}
			if(index>=LOA_MAX_BATTLE_ENEMY)
			{
				BOOL bCanReturn=true;
				for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
				{
					if(m_pEnemy[i]->bShow && m_pEnemy[i]->nCurrentState!=LOA_BATTLE_STATE_WAIT)
					{
						bCanReturn=false;
						break;
					}
				}
				if(bCanReturn)
					return 1;
				else
					goto _next;
			}
			if(!bEnemyAction[index])
			{
				if(m_pEnemy[index]->bShow)
				{
					EnemyAI(index);
					if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_NORMAL_ATTACK || m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_ATTACK_2)
					{
						m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_ATTACK;
					}
					else if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_DEFEND)
					{
						m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_DEFEND;
					}
					else if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_USE_GOOD)
					{
						m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_DEFEND;
						
						STGood*pGood;			
						if(m_pGame->GetGoodsDataBase()->FindData( m_pEnemy[index]->pRole->GoodsData[ m_pEnemy[index]->m_RoleCmd.iCmdParam ],&pGood ))
						{
							m_pEnemy[index]->pRole->DelGoods(m_pEnemy[index]->m_RoleCmd.iCmdParam);
							m_pEnemy[index]->pRole->UseGood(pGood);
							CRenderBattleText*pText=new CRenderBattleText;
							pText->CreateTask();
							pText->InitRender(m_pGame,80,m_nPosY[index],RGB(0,255,0),2,500,"HP+%d MP+",pGood->AddHp,pGood->AddMp);
							m_pRender->AddTask(pText);
							
						}
					}
					else if(m_pEnemy[index]->m_RoleCmd.iCmd==LOA_CMD_MAGIC)
					{
						m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_DEFEND;
						STMagic*pMagic;	
						if(m_pGame->GetMagicDataBase()->FindData( m_pEnemy[index]->pRole->MagicData[ m_pEnemy[index]->m_RoleCmd.iCmdParam ],&pMagic ))
						{
							m_pEnemy[index]->pRole->Mp-=abs(pMagic->nChangeMp);
							if(pMagic->nChangeHp>0)
							{
								CMagic*pRenderMagic=new CMagic;
								pRenderMagic->InitMagic(m_pGame,pMagic,450,180);
								pRenderMagic->CreateTask();
								m_pRender->AddTask(pRenderMagic);

								CRenderBattleText*pText=new CRenderBattleText;
								pText->CreateTask();
								pText->InitRender(m_pGame,80,m_nPosY[index],RGB(0,255,0),2,500,"HP+%d",pMagic->nChangeHp);
								m_pRender->AddTask(pText);
								m_pEnemy[index]->pRole->Hp+=pMagic->nChangeHp;
								if(m_pEnemy[index]->pRole->Hp>m_pEnemy[index]->pRole->MaxHp)
									m_pEnemy[index]->pRole->Hp=m_pEnemy[index]->pRole->MaxHp;
							}
							else
							{
								CMagic*pRenderMagic=new CMagic;
								pRenderMagic->InitMagic(m_pGame,pMagic,450,180);
								pRenderMagic->CreateTask();
								m_pRender->AddTask(pRenderMagic);

								int RealAttack=abs(pMagic->nChangeHp)-m_pPlayer->pRole->Defend-rand()%m_pPlayer->pRole->Level+rand()%m_pEnemy[index]->pRole->Level;
								if(RealAttack<0)
									RealAttack=5;
								if(m_pPlayer->pRole->Level<8)
								{
									if(RealAttack>m_pPlayer->pRole->MaxHp/6)
										RealAttack=m_pPlayer->pRole->MaxHp/6;
								}
								CRenderBattleText*pText=new CRenderBattleText;
								pText->CreateTask();
								pText->InitRender(m_pGame,450,180,RGB(255,0,0),2,500,"HP-%d",RealAttack);
								m_pRender->AddTask(pText);

								
								m_pPlayer->pRole->Hp-=RealAttack;
							
								if(m_pPlayer->pRole->Hp<=0)
								{
									m_pPlayer->pRole->bDead=true;
									m_pPlayer->pRole->Hp=0;
								}
							}
							
						}
					}
					else
					{
						CRenderBattleText*pText=new CRenderBattleText;
						pText->CreateTask();
						pText->InitRender(m_pGame,80,m_nPosY[index],RGB(255,255,255),2,1000,"%s逃跑了",m_pEnemy[index]->pRole->szName);
						m_pRender->AddTask(pText);
						m_pEnemy[index]->bShow=false;
					}
					
				}
				else
				{
					m_pEnemy[index]->nCurrentState=LOA_BATTLE_STATE_WAIT;
				}
				bEnemyAction[index]=true;
			}
			else
			{
			 
				if(m_pEnemy[index]->bShow && m_pEnemy[index]->nCurrentState==LOA_BATTLE_STATE_WAIT)
				{
					index++;
					continue;
				}
			}
_next:
			m_pGame->GetMapSurface()->ShowAniTileToAniSurface();						//更新动态图块

			m_pGame->GetDisplay()->Clear();
			
			m_pRender->Render();

			m_pGame->ShowFPS();

			m_pGame->GetDisplay()->Present();
		}
		else
			WaitMessage();
	}
	return 1;
}
int CBattle::BattleLoop()
{
	MSG msg;
	m_pGame->FadeIn();
	while(m_pGame->IsPlayGame())
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL,0,0)) 
				return msg.wParam;
			TranslateMessage(&msg); 
			DispatchMessage(&msg);
		}
		else if(m_pGame->IsActive())
		{ 
			BOOL bBattleOk=true;
			
			for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
			{
				if(m_pEnemy[i]->bShow==TRUE)
					bBattleOk=false;
			}
			if(bBattleOk)
			{
				int exp=0;
				int money=0;
				for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
				{
					if(m_pEnemy[i]->pRole)
					{
						money+=m_pEnemy[i]->pRole->Money;
						exp+=m_pEnemy[i]->pRole->Exp;
					}
				}
				m_pPlayer->pRole->AddMoney(money);
				int level=m_pPlayer->pRole->Level;
				m_pPlayer->pRole->AddWeaponExp(exp/2);
				m_pPlayer->pRole->AddDefendExp(exp/2);
				CMessageBox msgbox;
				msgbox.ShowMessageBox(m_pGame,LOA_MSG_BOX_OK,"战斗胜利!获得经验值%d",exp);
				msgbox.ShowMessageBox(m_pGame,LOA_MSG_BOX_OK,"战斗胜利!获得金钱%d",money);
				m_pPlayer->pRole->AddExp(exp);
				if(m_pPlayer->pRole->Level!=level)
				{
					msgbox.ShowMessageBox(m_pGame,LOA_MSG_BOX_OK,"升级到%d级",m_pPlayer->pRole->Level);
				}
				break;
			}
			m_pBattleMenu->EnableMenu(true);
			PlayerTurn();
			
			EnemyTurn();
			if(m_pPlayer->pRole->bDead)//dead
			{
				if(bNeedBattleWin)
				{
					GameOver();
					return -1;
				}
				else
					break;
			}
			
		}
		else
			WaitMessage();
	}
	return 1;
}
BOOL CRenderBattleRole::InitRender(CGame*pGame,CBattle*pBattle,STBattleRole*pPlayer,STBattleRole*pEnemy[],int nPosY[])
{
	LOA_ASSERT(pGame);
	LOA_ASSERT(pPlayer);
	LOA_ASSERT(pEnemy);
	LOA_ASSERT(pBattle);

	m_pGame=pGame;
	m_pPlayer=pPlayer;
	m_pBattle=pBattle;
	m_pEnemy[0]=pEnemy[0];
	m_pEnemy[1]=pEnemy[1];
	m_pEnemy[2]=pEnemy[2];

	m_nPosY[0]=nPosY[0];
	m_nPosY[1]=nPosY[1];
	m_nPosY[2]=nPosY[2];

	return true;
}
BOOL CRenderBattleRole::IsRenderComplete()
{
	return false;
}
void CRenderBattleRole::Release()
{
}
void CRenderBattleRole::RenderRole(STBattleRole*pRole)
{

	switch(pRole->nCurrentState)
	{
	case LOA_BATTLE_STATE_WAIT:
		{
			if(!pRole->pStayAni)
				break;
			m_pGame->GetDisplay()->ColorKeyBlt(pRole->CurPosX,
											   pRole->CurPosY,
											   pRole->pStayAni->pSurface->GetDDrawSurface(),
											   &pRole->pStayAni->aRect[pRole->pStayAni->nCurrentFrame]);
 
			if(pRole->pStayAni->pEffect)
			{
				if(pRole->pStayAni->nKeyFrame==pRole->pStayAni->nCurrentFrame)
				{
					CRenderEffect*pRenderEffect=new CRenderEffect;
					pRenderEffect->InitEffect(m_pGame,pRole->pStayAni->xEffectShow,pRole->pStayAni->yEffectShow,pRole->pStayAni->pEffect);
					pRenderEffect->CreateTask();
					m_pBattle->GetRender()->AddTask(pRenderEffect);
				}
			}
 
			if(timeGetTime() - pRole->pStayAni->dwOldTime > pRole->pStayAni->dwDelay)
			{
				pRole->pStayAni->dwOldTime=timeGetTime();
				pRole->CurPosX+=pRole->pStayAni->aXOffsite[pRole->pStayAni->nCurrentFrame];
				pRole->CurPosY+=pRole->pStayAni->aYOffsite[pRole->pStayAni->nCurrentFrame];

				pRole->pStayAni->nCurrentFrame++;
				
				if(pRole->pStayAni->nCurrentFrame>=pRole->pStayAni->nFrames)
				{
					pRole->pStayAni->nCurrentFrame=0;
					pRole->CurPosX=pRole->ShowPosX;
					pRole->CurPosY=pRole->ShowPosY;
				}
			}
		}
		break;
	case LOA_BATTLE_STATE_ATTACK:
		{
			if(!pRole->pAttackAni)
				break;
			if(pRole->pAttackAni->nCurrentFrame==0)
			{
				if(pRole->m_RoleCmd.bToPlayer)
				{
					
					pRole->CurPosY=180+m_pPlayer->pAttackAni->Height-pRole->pAttackAni->Height;
				}
				else
				{
					if(pRole->m_RoleCmd.nObject!=-1)
					{ 

						pRole->CurPosY=m_nPosY[pRole->m_RoleCmd.nObject]+m_pEnemy[pRole->m_RoleCmd.nObject]->pAttackAni->Height-pRole->pAttackAni->Height;
					}
				}
				
			}
			m_pGame->GetDisplay()->ColorKeyBlt(pRole->CurPosX,
											   pRole->CurPosY,
											   pRole->pAttackAni->pSurface->GetDDrawSurface(),
											   &pRole->pAttackAni->aRect[pRole->pAttackAni->nCurrentFrame]);
			if(pRole->pAttackAni->nKeyFrame==pRole->pAttackAni->nCurrentFrame)
			{
				
				CRenderBattleText*pText=new CRenderBattleText;	
				if(pRole!=m_pPlayer)												//攻击玩家
				{

					if(rand()%5==0)																//1/5的几率自动防御
					{
						pText->InitRender(m_pGame,450,180,RGB(255,0,0),2,500,"HP-%d",m_pPlayer->pRole->DefendRole(pRole->pRole));
						
						
						m_pPlayer->nCurrentState=LOA_BATTLE_STATE_DEFEND;
					}
					else
					{
 						pText->InitRender(m_pGame,450,180,RGB(255,0,0),2,500,"HP-%d",pRole->pRole->AttackRole(m_pPlayer->pRole));
						
						m_pPlayer->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
 						
					}
					
				}
				else
				{
					if(pRole->m_RoleCmd.nObject==-1)
					{
						for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
						{
							if(m_pEnemy[i]->bShow)
							{
								m_pEnemy[i]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
							}
						}
					}
					else
					{
						pText->InitRender(m_pGame,80,m_nPosY[pRole->m_RoleCmd.nObject],RGB(255,0,0),2,500,"HP -%d",m_pPlayer->pRole->AttackRole(m_pEnemy[m_pPlayer->m_RoleCmd.nObject]->pRole));
					
						if(m_pEnemy[pRole->m_RoleCmd.nObject]->pRole->bDead)
						{
							m_pEnemy[pRole->m_RoleCmd.nObject]->nCurrentState=LOA_BATTLE_STATE_DEAD;
						}
						else if(m_pEnemy[pRole->m_RoleCmd.nObject]->bShow)
						{
							m_pEnemy[pRole->m_RoleCmd.nObject]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
							
						}
					}
				}
				pText->CreateTask();
				m_pBattle->GetRender()->AddTask(pText);
			}
 
			if(pRole->pAttackAni->pEffect)
			{
				if(pRole->pAttackAni->nKeyFrame==pRole->pAttackAni->nCurrentFrame)
				{
					
					CRenderEffect*pRenderEffect=new CRenderEffect;
					if(pRole->m_RoleCmd.bToPlayer)
					{
						pRenderEffect->InitEffect(m_pGame,pRole->pAttackAni->xEffectShow,pRole->pAttackAni->yEffectShow,pRole->pAttackAni->pEffect);
					
					}
					else
					{
						pRenderEffect->InitEffect(m_pGame,80,m_nPosY[pRole->m_RoleCmd.nObject],pRole->pAttackAni->pEffect);
					}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -