📄 cbattle.cpp
字号:
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 + -