📄 cbattlemenu.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏战斗菜单模块
//CBattleMenu.cpp
//游戏引擎中的战斗菜单s部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于 2003/7/27 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"CBattleMenu.h"
#include"CGame.h"
#include"CMenu.h"
#include"CButton.h"
#include"CMessage.h"
#include"CGraph.h"
#include"CUserInterface.h"
#include"CFont.h"
#include"CGoods.h"
#include"CRole.h"
#include"CBattle.h"
#include"CText.h"
#include"CMessageBox.h"
#include"CMacro.h"
void LOA_RENDER_API CRenderBattleRoleState::Release()
{
}
BOOL LOA_RENDER_API CRenderBattleRoleState::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderBattleRoleState::Render()
{
HDC hdc;
CFont font;
font.CreateFont();
m_pGame->GetDisplay()->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SetTextColor(hdc,RGB(0,255,0));
::SelectObject(hdc,font.GetFont());
char str[256];
wsprintf(str,"HP:%d/%d",m_pPlayer->Hp,m_pPlayer->MaxHp);
::TextOut(hdc,450,360,str,strlen(str));
wsprintf(str,"MP:%d/%d",m_pPlayer->Mp,m_pPlayer->MaxMp);
::TextOut(hdc,450,390,str,strlen(str));
::SetTextColor(hdc,RGB(255,255,255));
for(int i=0;i<3;i++)
{
if(m_pEnemy[i])
{
wsprintf(str,"%s:",m_pEnemy[i]->szName);
::TextOut(hdc,50+i*230,10,str,strlen(str));
wsprintf(str,"HP=%d MP=%d",m_pEnemy[i]->Hp,m_pEnemy[i]->Mp);
::TextOut(hdc,50+i*230,30,str,strlen(str));
}
}
m_pGame->GetDisplay()->GetBackBuffer()->ReleaseDC(hdc);
}
BOOL CRenderBattleRoleState::SetRender(CGame*pGame,CRole*pPlayer,CRole*pEnemy1,CRole*pEnemy2,CRole*pEnemy3)
{
LOA_ASSERT(pGame);
m_pGame=pGame;
this->m_pPlayer=pPlayer;
m_pEnemy[0]=pEnemy1;
m_pEnemy[1]=pEnemy2;
m_pEnemy[2]=pEnemy3;
return true;
}
BOOL CRenderBattleMenu::InitBattleMenu(CGame*pGame)
{
LOA_ASSERT(pGame);
m_pGame=pGame;
m_bEnableMenu=true;
m_nCurrentSelect=0;
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pChoiseSurf,"pic\\system\\battlemenu.bmp",0,0)))
return false;
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pStatusSurf,"pic\\system\\status.bmp",0,0)))
return false;
CSurface*pTemp;
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&pTemp,"pic\\system\\header.bmp",0,0)))
return false;
m_pChoiseSurf->SetColorKey(RGB(255,0,255));
m_pStatusSurf->SetColorKey(RGB(255,0,255));
m_pStatusSurf->BltFast(5,5,pTemp,NULL,false);
delete pTemp;
return true;
}
void CRenderBattleMenu::SelectNext()
{
if(m_nCurrentSelect==0)
m_nCurrentSelect=2;
else if(m_nCurrentSelect==2)
m_nCurrentSelect=3;
else if(m_nCurrentSelect==3)
m_nCurrentSelect=1;
else
m_nCurrentSelect=0;
}
void CRenderBattleMenu::SelectPrev()
{
if(m_nCurrentSelect==0)
m_nCurrentSelect=1;
else if(m_nCurrentSelect==1)
m_nCurrentSelect=3;
else if(m_nCurrentSelect==3)
m_nCurrentSelect=2;
else
m_nCurrentSelect=0;
}
CRenderBattleMenu::~CRenderBattleMenu()
{
Release();
}
BOOL LOA_RENDER_API CRenderBattleMenu::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderBattleMenu::Release()
{
if(m_pChoiseSurf)
{
m_pChoiseSurf->Destroy();
delete m_pChoiseSurf;
m_pChoiseSurf=NULL;
}
if(m_pStatusSurf)
{
m_pStatusSurf->Destroy();
delete m_pStatusSurf;
m_pStatusSurf=NULL;
}
}
void LOA_RENDER_API CRenderBattleMenu::Render()
{
if(!m_bEnableMenu)
{
RECT rect;
::SetRect(&rect,0,132,66,198);
m_pGame->GetDisplay()->ColorKeyBlt(0,340,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,132,132,198,198);
m_pGame->GetDisplay()->ColorKeyBlt(66,340,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,198,132,264,198);
m_pGame->GetDisplay()->ColorKeyBlt(0,406,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,66,132,132,198);
m_pGame->GetDisplay()->ColorKeyBlt(66,406,m_pChoiseSurf->GetDDrawSurface(),&rect);
}
else
{
RECT rect;
::SetRect(&rect,0,0,66,66);
m_pGame->GetDisplay()->ColorKeyBlt(0,340,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,132,0,198,66);
m_pGame->GetDisplay()->ColorKeyBlt(66,340,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,198,0,264,66);
m_pGame->GetDisplay()->ColorKeyBlt(0,406,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,66,0,132,66);
m_pGame->GetDisplay()->ColorKeyBlt(66,406,m_pChoiseSurf->GetDDrawSurface(),&rect);
::SetRect(&rect,m_nCurrentSelect*66,66,m_nCurrentSelect*66+66,132);
m_pGame->GetDisplay()->ColorKeyBlt((m_nCurrentSelect%3)==0?0:66,(m_nCurrentSelect%2)==0?340:406,m_pChoiseSurf->GetDDrawSurface(),&rect);
}
m_pGame->GetDisplay()->ColorKeyBlt(260,360,m_pStatusSurf->GetDDrawSurface());
}
int CBattleMenu::ShowBattleMenu(CGame*pGame,int iStyle)
{
switch(iStyle)
{
case LOA_BATTLE_MENU_STYLE_SHOW_GOODS:
return ShowBattleMenuShowGoods(pGame);
case LOA_BATTLE_MENU_STYLE_SHOW_MAGIC:
return ShowBattleMenuShowMagic(pGame);
default:
return -1;
}
}
int CBattleMenu::ShowBattleMenuShowGoods(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return -1;
CRenderMenuShowGoods*pMenu=new CRenderMenuShowGoods;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return -1;
pMenu->CreateTask();
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),120,152,33))
return -1;
pListBox->CreateTask();
STGood*pGood;
for(int i=0;i<LOA_MAX_CARRY_GOODS;i++)
{
if(pGame->GetGoodsDataBase()->FindData(pGame->GetPlayer()->pRole->GoodsData[i],&pGood))
{
pListBox->InsertString(pGood->szName);
}
}
if(pListBox->GetCurrentElemCount()!=0)
{
pListBox->SelectNextElem();
}
pRender->AddTask(pMenu);
pRender->AddTask(pListBox);
CDisplay*pDisplay=pGame->GetDisplay();
CFont font;
font.CreateFont(25,800);
CFont fontgoods;
fontgoods.CreateFont();
HDC hdc;
MSG msg;
while(pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return -1;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(pGame->IsActive())
{
int id=pListBox->GetCurrentSelect()-1;
if(id<0)
{
CRenderRoleGoods*pRenderGoods=new CRenderRoleGoods;
pRenderGoods->CreateTask();
pRenderGoods->SetRender(pDisplay,&fontgoods,NULL);
pRender->AddTask(pRenderGoods);
}
else if(pGame->GetGoodsDataBase()->FindData(pGame->GetPlayer()->pRole->GoodsData[id],&pGood))
{
CRenderRoleGoods*pRenderGoods=new CRenderRoleGoods;
pRenderGoods->CreateTask();
pRenderGoods->SetRender(pDisplay,&fontgoods,pGood);
pRender->AddTask(pRenderGoods);
}
BYTE key=pGame->GetKeyBoard()->ReadLastBufferKey(50);
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
pListBox->SelectPrevElem();
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
pListBox->SelectNextElem();
}
}
break;
case DIK_RETURN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
{
if(id>=0)
{
delete pRender;
return id;
}
}
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,100))
goto _out;
}
break;
}
pDisplay->Clear();
pRender->Render();
pDisplay->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SelectObject(hdc,font.GetFont());
::SetTextColor(hdc,RGB(255,0,0));
::TextOut(hdc,100,65,"所有物品",strlen("所有物品"));
::TextOut(hdc,380,55,"物品预览",strlen("物品预览"));
pDisplay->GetBackBuffer()->ReleaseDC(hdc);
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
delete pRender;
return -1;
}
int CBattleMenu::ShowBattleMenuShowMagic(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return -1;
CRenderMenuShowMagic*pMenu=new CRenderMenuShowMagic;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return -1;
pMenu->CreateTask();
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),120,152,33))
return -1;
pListBox->CreateTask();
STMagic *pMagic=NULL;
for(int i=0;i<LOA_MAX_CARRY_GOODS;i++)
{
if(pGame->GetMagicDataBase()->FindData(pGame->GetPlayer()->pRole->MagicData[i],&pMagic))
{
pListBox->InsertString(pMagic->szName);
}
}
pRender->AddTask(pMenu);
pRender->AddTask(pListBox);
CDisplay*pDisplay=pGame->GetDisplay();
CFont font;
font.CreateFont(25,800);
CFont fontmagic;
fontmagic.CreateFont();
int nOldSelect=-1,nNowSelect=-1;
CRenderRoleMagic*pRoleMagic=NULL;
DWORD dwRenderRoleMagicID=0;
if(pListBox->GetCurrentElemCount()!=0)
{
pListBox->SelectNextElem();
nOldSelect=0;
nNowSelect=0;
if(pGame->GetMagicDataBase()->FindData(pGame->GetPlayer()->pRole->MagicData[0],&pMagic))
{
pRoleMagic=new CRenderRoleMagic;
pRoleMagic->CreateTask();
pRoleMagic->SetRender(pDisplay,&fontmagic,pMagic);
dwRenderRoleMagicID=pRoleMagic->GetTaskID();
pRender->AddTask(pRoleMagic);
}
}
else
{
pRoleMagic=new CRenderRoleMagic;
pRoleMagic->CreateTask();
pRoleMagic->SetRender(pDisplay,&fontmagic,NULL);
dwRenderRoleMagicID=pRoleMagic->GetTaskID();
pRender->AddTask(pRoleMagic);
}
HDC hdc;
MSG msg;
while(pGame->IsPlayGame())
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL,0,0))
return -1;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if(pGame->IsActive())
{
nNowSelect=pListBox->GetCurrentSelect()-1;
if(nNowSelect!=nOldSelect)
{
nOldSelect=nNowSelect;
pRender->StopTask(dwRenderRoleMagicID);
if(nNowSelect<0)
{
pRoleMagic=new CRenderRoleMagic;
pRoleMagic->CreateTask();
pRoleMagic->SetRender(pDisplay,&fontmagic,NULL);
dwRenderRoleMagicID=pRoleMagic->GetTaskID();
pRender->AddTask(pRoleMagic);
}
if(pGame->GetMagicDataBase()->FindData(pGame->GetPlayer()->pRole->MagicData[nNowSelect],&pMagic))
{
pRoleMagic=new CRenderRoleMagic;
pRoleMagic->CreateTask();
pRoleMagic->SetRender(pDisplay,&fontmagic,pMagic);
dwRenderRoleMagicID=pRoleMagic->GetTaskID();
pRender->AddTask(pRoleMagic);
}
}
BYTE key=pGame->GetKeyBoard()->ReadLastBufferKey(50);
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
pListBox->SelectPrevElem();
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
pListBox->SelectNextElem();
}
}
break;
case DIK_RETURN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
{
if(nNowSelect>=0)
{
CMessageBox msgbox;
if(pMagic)
{
if(pGame->GetPlayer()->pRole->Mp-abs(pMagic->nChangeMp)<0)
{
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"MP不足!");
}
else
{
delete pRender;
return nNowSelect;
}
}
}
}
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,100))
goto _out;
}
break;
}
pDisplay->Clear();
pRender->Render();
pDisplay->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SelectObject(hdc,font.GetFont());
::SetTextColor(hdc,RGB(255,0,0));
::TextOut(hdc,100,65,"所有魔法",strlen("所有魔法"));
::TextOut(hdc,380,55,"魔法预览",strlen("魔法预览"));
pDisplay->GetBackBuffer()->ReleaseDC(hdc);
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
delete pRender;
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -