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

📄 cbattle.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		if(!LoadBattleRoleFromFile(szBattleFile1,m_pEnemy[0]))
		{
			m_pGame->PlayMedia(szCurMusic);
			return false;
		}
	}
	if(pEnemy2)
	{
		m_pEnemy[1]->bShow=true;
		m_pEnemy[1]->pRole=pEnemy2;
		if(!LoadBattleRoleFromFile(szBattleFile2,m_pEnemy[1]))
		{
			m_pGame->PlayMedia(szCurMusic);
			return false;
		}
	}
	if(pEnemy3)
	{
		m_pEnemy[2]->bShow=true;
		m_pEnemy[2]->pRole=pEnemy3;
		if(!LoadBattleRoleFromFile(szBattleFile3,m_pEnemy[2]))
		{
			m_pGame->PlayMedia(szCurMusic);
			return false;
		}
	}
	m_bFightBoss=bFightBoss;
	bNeedBattleWin=bNeedWin;
	
	m_pPlayer->nCurrentState=LOA_BATTLE_STATE_WAIT;

	m_pRenderBattleRole=new CRenderBattleRole;
	m_pRenderBattleRole->InitRender(pGame,this,m_pPlayer,m_pEnemy,m_nPosY);
	m_pRenderBattleRole->CreateTask(true,true,8);
	
	m_pRender->AddTask(m_pRenderBattleRole);

	m_pRenderIcon=new CIcon;
	m_pRenderIcon->InitIcon(m_pGame->GetDisplay(),LOA_ICON_ARROW);
	

	m_pBattleMenu=new CRenderBattleMenu;
	m_pBattleMenu->CreateTask();
	m_pBattleMenu->InitBattleMenu(m_pGame);
	m_pRender->AddTask(m_pBattleMenu);

	m_pRenderRoleState=new CRenderBattleRoleState;
	m_pRenderRoleState->CreateTask();
	m_pRenderRoleState->SetRender(m_pGame,m_pPlayer->pRole,m_pEnemy[0]->pRole,m_pEnemy[1]->pRole,m_pEnemy[2]->pRole);
	m_pRender->AddTask(m_pRenderRoleState);
	int iRev=BattleLoop();
	delete m_pRender;
	delete m_pRenderIcon;
	for( i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
	{
		if(m_pEnemy[i])
		{
			delete m_pEnemy[i];
			m_pEnemy[i]=NULL;
		}
	}
	if(m_pPlayer)
	{
		delete m_pPlayer;
		m_pPlayer=NULL;
	}
	if(m_pBattleMap)
	{
		delete m_pBattleMap;
		m_pBattleMap=NULL;
	}
	if(iRev==-1)//gameover
	{
		m_pGame->PauseMedia();
		return -1;
	}
	m_pGame->PlayMedia(szCurMusic);
	return true;
}
int CBattle::SelectAttack()
{
	MSG msg;
	int nCurrentSelect=0;
	int nLastSelect;
	for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
	{
		if(m_pEnemy[i]->bShow)
		{
			nCurrentSelect=i;
			break;
		}
	}
	nLastSelect=nCurrentSelect;
	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())
		{
			nLastSelect=nCurrentSelect;
			BYTE key=m_pGame->GetKeyBoard()->ReadLastBufferKey(50);
			switch(key)
			{
			case DIK_ESCAPE:
				return -1;
			case DIK_LEFT:
				{
					if(m_pGame->GetKeyBoard()->WaitKey(DIK_LEFT,100))
					{
						while(1)
						{
							nCurrentSelect--;
							if(nCurrentSelect<0)
								nCurrentSelect=0;
							if(!m_pEnemy[nCurrentSelect]->bShow)
							{
								if(nCurrentSelect==0)
								{
									nCurrentSelect=nLastSelect;
									break;
								}
								else
									continue;
							}
							else
								break;
						}
					}
				}
				break;
			case DIK_UP:
				{
					if(m_pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
					{
						while(1)
						{
							nCurrentSelect--;
							if(nCurrentSelect<0)
								nCurrentSelect=0;
							if(!m_pEnemy[nCurrentSelect]->bShow)
							{
								if(nCurrentSelect==0)
								{
									nCurrentSelect=nLastSelect;
									break;
								}
								else
									continue;
							}
							else
								break;
						}
					}
				}
				break;
			case DIK_RIGHT:
				{
					if(m_pGame->GetKeyBoard()->WaitKey(DIK_RIGHT,100))
					{
						while(1)
						{
							nCurrentSelect++;
							if(nCurrentSelect>=LOA_MAX_BATTLE_ENEMY)
								nCurrentSelect=LOA_MAX_BATTLE_ENEMY-1;
							if(!m_pEnemy[nCurrentSelect]->bShow)
							{
								if(nCurrentSelect==LOA_MAX_BATTLE_ENEMY-1)
								{
									nCurrentSelect=nLastSelect;
									break;
								}
								else
									continue;
							}
							else
							{
								break;
							}
						}
					}
				}
				break;
			case DIK_DOWN:
				{
					if(m_pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
					{
						while(1)
						{
							nCurrentSelect++;
							if(nCurrentSelect>=LOA_MAX_BATTLE_ENEMY)
								nCurrentSelect=LOA_MAX_BATTLE_ENEMY-1;
							if(!m_pEnemy[nCurrentSelect]->bShow)
							{
								if(nCurrentSelect==LOA_MAX_BATTLE_ENEMY-1)
								{
									nCurrentSelect=nLastSelect;
									break;
								}
								else
									continue;
							}
							else
							{
								break;
							}
						}
					}
				}
				break;
			case DIK_RETURN:
				{
					if(m_pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
					{
						return nCurrentSelect;
					}
				}
				break;
			}
			
			m_pGame->GetMapSurface()->ShowAniTileToAniSurface();						//更新动态图块

			m_pGame->GetDisplay()->Clear();
			
			m_pRender->Render();
			
			m_pRenderIcon->Show(80,m_nPosY[nCurrentSelect]+m_pEnemy[nCurrentSelect]->pStayAni->Height/2);
			m_pGame->ShowFPS();

			m_pGame->GetDisplay()->Present();
		}
		else
			WaitMessage();
	}
	return -1;
}
int CBattle::PlayerTurn()
{
	MSG msg;
	BOOL bPlayerAction=false;
	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())
		{


			
			if(bPlayerAction && m_pPlayer->nCurrentState==LOA_BATTLE_STATE_WAIT)
				break;
			if(!bPlayerAction)
			{
				BYTE key=m_pGame->GetKeyBoard()->ReadLastBufferKey(50);
				switch(key)
				{
				case DIK_RETURN:
					{
						
						if(m_pGame->GetKeyBoard()->WaitKey(DIK_RETURN,150))
						{
							if(m_pBattleMenu->IsEnableMenu())
							{

								if(m_pBattleMenu->GetCurrentSelect()==LOA_BATTLE_MENU_ATTACK)
								{
									int Attack=SelectAttack();
									if(Attack!=-1)
									{
										m_pPlayer->m_RoleCmd.nObject=Attack;
										m_pPlayer->m_RoleCmd.bToPlayer=false;
										m_pPlayer->nCurrentState=LOA_BATTLE_STATE_ATTACK;
										m_pBattleMenu->EnableMenu(false);
										bPlayerAction=true;
									}
								}
								else if(m_pBattleMenu->GetCurrentSelect()==LOA_BATTLE_MENU_GOODS)
								{
									CBattleMenu menu;
									int id=menu.ShowBattleMenu(m_pGame,LOA_BATTLE_MENU_STYLE_SHOW_GOODS);
									if(-1==id)
										continue;
									else
									{
										STMagic*pMagic;
										if(m_pGame->GetMagicDataBase()->FindData((rand()%2)+104,&pMagic))
										{
											CMagic*pShowMagic=new CMagic;
											pShowMagic->CreateTask();
											pShowMagic->InitMagic(m_pGame,pMagic,450,180);
											m_pRender->AddTask(pShowMagic);
											bPlayerAction=true;
										}
										STGood*pGood;
										if(m_pGame->GetGoodsDataBase()->FindData(m_pPlayer->pRole->GoodsData[id],&pGood))
										{
											CRenderBattleText*pText=new CRenderBattleText;
											pText->CreateTask();
											
											pText->InitRender(m_pGame,450,180,RGB(0,255,0),2,500,"HP+%d MP+%d",pGood->AddHp,pGood->AddMp);
											m_pRender->AddTask(pText);
											m_pPlayer->pRole->UseGood(pGood);
											m_pPlayer->pRole->DelGoods(id);
								
										}
									}
								}
								else if(m_pBattleMenu->GetCurrentSelect()==LOA_BATTLE_MENU_MAGIC)
								{
									CBattleMenu menu;
									int id=menu.ShowBattleMenu(m_pGame,LOA_BATTLE_MENU_STYLE_SHOW_MAGIC);
									if(id==-1)
										continue;
									else
									{
										 
										STMagic*pMagic;
										if(m_pGame->GetMagicDataBase()->FindData(m_pPlayer->pRole->MagicData[id],&pMagic))
										{
											CMagic*pShowMagic=new CMagic;
											m_pPlayer->pRole->Mp-=abs(pMagic->nChangeMp);

											pShowMagic->CreateTask(true,true,6);
											
											if(pMagic->nChangeHp>0)
											{
												CRenderBattleText*pText=new CRenderBattleText;
												pText->CreateTask();
												pShowMagic->InitMagic(m_pGame,pMagic,450,180);
												pText->InitRender(m_pGame,450,180,RGB(0,255,0),2,500,"HP+%d",pMagic->nChangeHp);
												m_pPlayer->pRole->Hp+=pMagic->nChangeHp;
												if(m_pPlayer->pRole->Hp>m_pPlayer->pRole->MaxHp)
													m_pPlayer->pRole->Hp=m_pPlayer->pRole->MaxHp;
												m_pRender->AddTask(pText);
											}
											else if(pMagic->bToAll)
											{
												pShowMagic->InitMagic(m_pGame,pMagic,80,m_nPosY[0]);
												for(int i=0;i<LOA_MAX_BATTLE_ENEMY;i++)
												{
													if(m_pEnemy[i]->bShow)
													{
														CRenderBattleText*pText=new CRenderBattleText;
														pText->CreateTask();
														pText->InitRender(m_pGame,100,m_nPosY[i]-10,RGB(255,0,0),2,500,"HP-%d",abs(pMagic->nChangeHp));
														m_pRender->AddTask(pText);
														m_pEnemy[i]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
														m_pEnemy[i]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
														m_pEnemy[i]->pRole->Hp-=abs(pMagic->nChangeHp);
														if(m_pEnemy[i]->pRole->Hp<=0)
															m_pEnemy[i]->nCurrentState=LOA_BATTLE_STATE_DEAD;
													}
												}
											}
											else
											{
												int AttackWho=this->SelectAttack();
												if(AttackWho==-1)
													continue;
												m_pPlayer->m_RoleCmd.nObject=AttackWho;
												m_pEnemy[AttackWho]->nCurrentState=LOA_BATTLE_STATE_BE_ATTACK;
												m_pEnemy[AttackWho]->pRole->Hp-=abs(pMagic->nChangeHp);
												if(m_pEnemy[AttackWho]->pRole->Hp<=0)
													m_pEnemy[AttackWho]->nCurrentState=LOA_BATTLE_STATE_DEAD;
												pShowMagic->InitMagic(m_pGame,pMagic,80,m_nPosY[AttackWho]);
												CRenderBattleText*pText=new CRenderBattleText;
												pText->CreateTask();
												pText->InitRender(m_pGame,100,m_nPosY[AttackWho]-10,RGB(255,0,0),2,500,"HP-%d",abs(pMagic->nChangeHp));
												m_pRender->AddTask(pText);
											}
											
											
						
											m_pRender->AddTask(pShowMagic);
											bPlayerAction=true;
										}
									}
								}
								else
								{
									goto _out;
								}
							}
							
						}
					}
					break;				
				case DIK_LEFT:
					{
						if(m_pGame->GetKeyBoard()->WaitKey(DIK_LEFT,100))
						{
							if(m_pBattleMenu->IsEnableMenu())
							{
								m_pBattleMenu->SelectPrev();
							}
						}
					}
					break;
				case DIK_RIGHT:
					{
						if(m_pGame->GetKeyBoard()->WaitKey(DIK_RIGHT,100))
						{
							if(m_pBattleMenu->IsEnableMenu())
							{
								m_pBattleMenu->SelectNext();
							}
						}
					}
					break;
				}
			}
			m_pGame->GetMapSurface()->ShowAniTileToAniSurface();						//更新动态图块

⌨️ 快捷键说明

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