📄 cmenu.cpp
字号:
{
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 msg.wParam;
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->nChangeHp<0)
{
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"不能在这里使用攻击型的魔法!");
}
else
{
if(pGame->GetPlayer()->pRole->Mp-abs(pMagic->nChangeMp)<0)
{
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"MP不足!");
}
else
{
if(LOA_MSG_BOX_IDYES==msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_YESNO,"确实要使用这个魔法么?"))
{
pGame->GetPlayer()->pRole->UseMagicInMenu(pMagic);
}
}
}
}
}
}
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 CGameMenu::ShowGoodsLoop(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMenuShowGoods*pMenu=new CRenderMenuShowGoods;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return false;
pMenu->CreateTask();
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),120,152,33))
return false;
pListBox->CreateTask();
STGood*pGood=NULL;
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 msg.wParam;
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)
{
CMessageBox msgbox;
if(LOA_MSG_BOX_IDYES==msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_YESNO,"确实要使用这个物品么?"))
{
pGame->GetPlayer()->pRole->UseGood(pGood);
pGame->GetPlayer()->pRole->DelGoods(id);
pListBox->DeleteString(id);
if(pListBox->GetCurrentElemCount()!=0)
{
pListBox->SelectPrevElem();
}
}
}
}
}
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 CGameMenu::MainMenuLoop(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMainMenu*pMainMenu=new CRenderMainMenu;
if(!pMainMenu || !pMainMenu->InitMainMenu(pGame,"pic\\system\\mainmenu.bmp"))
return false;
CRenderButton*pButton=new CRenderButton();
if(!pButton || !pButton->LoadButtonSettingFromFile( pGame,"MainMenu","data\\menu.ini"))
return false;
pMainMenu->CreateTask(true,true,32);
pButton->CreateTask(true,true,16);
pRender->AddTask(pMainMenu);
pRender->AddTask(pButton);
STMessage loamsg;
CDisplay*pDisplay=pGame->GetDisplay();
STRenderRole*pPlayer=pGame->GetPlayer();
CRenderRoleState*pShowState=new CRenderRoleState;
pShowState->InitRender(pDisplay,pPlayer);
pShowState->CreateTask();
pRender->AddTask(pShowState);
MSG msg;
BYTE key;
while(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(pGame->IsActive())
{
key=pGame->GetKeyBoard()->ReadLastBufferKey();
pButton->JudgeMouseSelect();
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
DWORD dwSelect=pButton->GetCurrentSelect();
dwSelect--;
if((int)dwSelect<0)
dwSelect=0;
pButton->SetCurrentSelect(dwSelect);
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
DWORD dwSelect=pButton->GetCurrentSelect();
dwSelect++;
if(dwSelect>=pButton->GetButtonCount())
dwSelect=pButton->GetButtonCount()-1;
pButton->SetCurrentSelect(dwSelect);
}
}
break;
case DIK_RETURN:
{
if(!pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
break;
switch(pButton->GetCurrentSelect())
{
case 0://save
{
MenuLoop(pGame,LOA_MENU_STYLE_SHOW_SAVE);
}
break;
case 1://load
{
if(-1==MenuLoop(pGame,LOA_MENU_STYLE_SHOW_LOAD)) //如果读取了档案
{
delete pRender; //由里面的析构函数释放所有资源
return -1;
}
}
break;
case 2://gooods
{
MenuLoop(pGame,LOA_MENU_STYLE_SHOW_GOODS);
}
break;
case 3://magic
{
MenuLoop(pGame,LOA_MENU_STYLE_SHOW_MAGIC);
}
break;
case 4://exit
{
PostMessage(pGame->GetHWnd(),WM_CLOSE,0,0);
}
break;
}
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,150))
goto _out;
}
break;
}
pDisplay->Clear();
pRender->Render();
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
delete pRender; //由里面的析构函数释放所有资源
return true;
}
BOOL CRenderMainMenu::InitMainMenu(CGame*pGame,char*szBackSurf)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szBackSurf);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pBackSurf,szBackSurf,640,480)))
return false;
m_pGame=pGame;
return true;
}
BOOL LOA_RENDER_API CRenderMainMenu::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderMainMenu::Release()
{
if(m_pBackSurf)
{
m_pBackSurf->Destroy();
delete m_pBackSurf;
m_pBackSurf=NULL;
}
}
void LOA_RENDER_API CRenderMainMenu::Render()
{
m_pGame->GetDisplay()->Blt(0,0,m_pBackSurf);
}
BOOL CRenderMenuShowGoods::InitMenu(CGame*pGame,char*szBackSurf)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szBackSurf);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pBackSurf,szBackSurf,640,480)))
return false;
m_pGame=pGame;
return true;
}
BOOL LOA_RENDER_API CRenderMenuShowGoods::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderMenuShowGoods::Release()
{
if(m_pBackSurf)
{
m_pBackSurf->Destroy();
delete m_pBackSurf;
m_pBackSurf=NULL;
}
}
void LOA_RENDER_API CRenderMenuShowGoods::Render()
{
m_pGame->GetDisplay()->Blt(0,0,m_pBackSurf);
}
BOOL CRenderMenuShowMagic::InitMenu(CGame*pGame,char*szBackSurf)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szBackSurf);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pBackSurf,szBackSurf,640,480)))
return false;
m_pGame=pGame;
return true;
}
BOOL LOA_RENDER_API CRenderMenuShowMagic::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderMenuShowMagic::Release()
{
if(m_pBackSurf)
{
m_pBackSurf->Destroy();
delete m_pBackSurf;
m_pBackSurf=NULL;
}
}
void LOA_RENDER_API CRenderMenuShowMagic::Render()
{
m_pGame->GetDisplay()->Blt(0,0,m_pBackSurf);
}
BOOL CRenderMenuFile::InitMenu(CGame*pGame,char*szBackSurf)
{
LOA_ASSERT(pGame);
LOA_ASSERT(szBackSurf);
if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&m_pBackSurf,szBackSurf,640,480)))
return false;
m_pGame=pGame;
return true;
}
BOOL LOA_RENDER_API CRenderMenuFile::IsRenderComplete()
{
return false;
}
void LOA_RENDER_API CRenderMenuFile::Release()
{
if(m_pBackSurf)
{
m_pBackSurf->Destroy();
delete m_pBackSurf;
m_pBackSurf=NULL;
}
}
void LOA_RENDER_API CRenderMenuFile::Render()
{
m_pGame->GetDisplay()->Blt(0,0,m_pBackSurf);
}
BOOL CRenderSaveFileInfo::SetRender(CGame*pGame,CSurface*pSurf,CFont*pFont,STGameInfo*pGameInfo)
{
m_pGame=pGame;
m_pSurf=pSurf;
m_pGameInfo=pGameInfo;
m_pFont=pFont;
return true;
}
void LOA_RENDER_API CRenderSaveFileInfo::Release()
{
}
BOOL LOA_RENDER_API CRenderSaveFileInfo::IsRenderComplete()
{
return true;
}
void LOA_RENDER_API CRenderSaveFileInfo::Render()
{
RECT rt={355,240,565,420};
m_pGame->GetDisplay()->GetBackBuffer()->Blt(&rt,m_pSurf->GetDDrawSurface(),NULL,DDBLT_WAIT,NULL);
HDC hdc;
m_pGame->GetDisplay()->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SetTextColor(hdc,RGB(0,255,0));
::SelectObject(hdc,m_pFont->GetFont());
char str[256];
if(m_pGameInfo->bFilled)
{
wsprintf(str,"存档时间:");
::TextOut(hdc,380,100,str,strlen(str));
wsprintf(str,"%d/%d/%d %d:%d:%d",m_pGameInfo->stTime.wYear,
m_pGameInfo->stTime.wMonth,
m_pGameInfo->stTime.wDay,
m_pGameInfo->stTime.wHour,
m_pGameInfo->stTime.wMinute,
m_pGameInfo->stTime.wSecond);
::TextOut(hdc,380,120,str,strlen(str));
wsprintf(str,"等级:%d",m_pGameInfo->nLevel);
::TextOut(hdc,380,140,str,strlen(str));
CText text;
text.ShowMultiLineText(380,160,hdc,20,"地图:%s",m_pGameInfo->szMapName);
}
else
{
wsprintf(str,"空白档案");
::TextOut(hdc,380,100,str,strlen(str));
}
m_pGame->GetDisplay()->GetBackBuffer()->ReleaseDC(hdc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -