📄 cmenu.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏主菜单模块
//CMenu.cpp
//游戏引擎中的主菜单部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/7/20 by kylinx
//--------------------------------------------------------------------------------------------------------
#include"CMenu.h"
#include"CGame.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"
CGameMenu::~CGameMenu()
{
}
int CGameMenu::MenuLoop(CGame*pGame,int nMenuStyle)
{
LOA_ASSERT(pGame);
BOOL bIsNight=pGame->IsNight();
if(bIsNight)
{
pGame->GetDisplay()->RestoreGamma();
}
int iRval=0;
switch(nMenuStyle)
{
case LOA_MENU_STYLE_MAIN_MENU:
iRval=MainMenuLoop(pGame);
break;
case LOA_MENU_STYLE_SHOW_GOODS:
iRval=ShowGoodsLoop(pGame);
break;
case LOA_MENU_STYLE_SHOW_MAGIC:
iRval=ShowMagicLoop(pGame);
break;
case LOA_MENU_STYLE_SHOW_SAVE:
iRval=ShowSaveLoop(pGame);
break;
case LOA_MENU_STYLE_SHOW_LOAD:
iRval=ShowLoadLoop(pGame);
break;
default:
break;
}
if(bIsNight)
{
DDGAMMARAMP ddGammaRamp;
DDGAMMARAMP ddGammaStart=pGame->GetDisplay()->GetGamma();
for(int i=0;i<256;i++)
{
ddGammaRamp.blue[i]=ddGammaStart.blue[i];
ddGammaRamp.red[i]=ddGammaStart.red[i]>>1;
ddGammaRamp.green[i]=ddGammaStart.green[i]>>1;
}
pGame->GetDisplay()->SetGamma(ddGammaRamp);
}
return iRval;
}
int CGameMenu::ShowLoadLoop(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMenuFile*pMenu=new CRenderMenuFile;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return false;
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),115,152,33))
return false;
pListBox->CreateTask(true,true,16);
STGameInfo gi;
gi.bmpData=new WORD[160*120];
if(!gi.bmpData)
return false;
gi.bFilled=false;
memset(gi.szMapName,0,32);
CDisplay*pDisplay=pGame->GetDisplay();
CSurface*pSurf;
pDisplay->CreateSurface(&pSurf,160,120);
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
char str[256];
for(int i=0;i<8;i++)
{
if(pGame->GetSaveFileHeadInfo(i,&gi))
{
wsprintf(str,"存档文件%d",i);
pListBox->InsertString(str);
if(i==0)
{
pGame->GetSaveFileInfo(i,&gi);
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
gi.bFilled=true;
}
}
else
{
pListBox->InsertString("没有档案");
}
}
pListBox->SelectNextElem();
pMenu->CreateTask(true,true,32);
pRender->AddTask(pMenu);
pRender->AddTask(pListBox);
CFont font,fontTitle;
font.CreateFont();
fontTitle.CreateFont(25,800);
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())
{
CRenderSaveFileInfo*pFileInfo=new CRenderSaveFileInfo;
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
pFileInfo->CreateTask();
pRender->AddTask(pFileInfo);
key=pGame->GetKeyBoard()->ReadLastBufferKey();
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
pListBox->SelectPrevElem();
if(pGame->GetSaveFileInfo(pListBox->GetCurrentSelect()-1,&gi))
{
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
gi.bFilled=true;
}
else
{
pSurf->Clear();
gi.bFilled=false;
}
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
pListBox->SelectNextElem();
if(pGame->GetSaveFileInfo(pListBox->GetCurrentSelect()-1,&gi))
{
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
gi.bFilled=true;
}
else
{
gi.bFilled=false;
pSurf->Clear();
}
}
}
break;
case DIK_RETURN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_RETURN,150))
{
CMessageBox msgbox;
if(pGame->GetSaveFileInfo(pListBox->GetCurrentSelect()-1,&gi))
{
if(LOA_MSG_BOX_IDYES==msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_YESNO,"确实要读取这个存档么"))
{
pGame->SetCurrentMap(gi.szCurrentMapName);
pGame->SetCurrentSaveFileIndex(pListBox->GetCurrentSelect()-1);
delete [] gi.bmpData;
delete pRender; //由里面的析构函数释放所有资源
return -1;
}
}
}
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,100))
goto _out;
}
break;
}
pDisplay->Clear();
pRender->Render();
HDC hdc;
pDisplay->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SelectObject(hdc,fontTitle.GetFont());
::SetTextColor(hdc,RGB(255,0,0));
::TextOut(hdc,120,65,"读取进度",strlen("读取进度"));
::TextOut(hdc,400,50,"档案信息",strlen("档案信息"));
pDisplay->GetBackBuffer()->ReleaseDC(hdc);
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
delete [] gi.bmpData;
delete pRender; //由里面的析构函数释放所有资源
return true;
}
int CGameMenu::ShowSaveLoop(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMenuFile*pMenu=new CRenderMenuFile;
if(!pMenu || !pMenu->InitMenu(pGame,"pic\\system\\item.bmp"))
return false;
CListBox*pListBox=new CListBox;
if(!pListBox || !pListBox->InitTable(pGame->GetDisplay(),115,152,33))
return false;
pListBox->CreateTask(true,true,16);
STGameInfo gi;
gi.bmpData=new WORD[160*120];
if(!gi.bmpData)
return false;
gi.bFilled=false;
memset(gi.szMapName,0,32);
CDisplay*pDisplay=pGame->GetDisplay();
CSurface*pSurf;
pDisplay->CreateSurface(&pSurf,160,120);
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
char str[256];
for(int i=0;i<8;i++)
{
if(pGame->GetSaveFileHeadInfo(i,&gi))
{
wsprintf(str,"存档文件%d",i);
pListBox->InsertString(str);
if(i==0)
{
pGame->GetSaveFileInfo(i,&gi);
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
gi.bFilled=true;
}
}
else
{
pListBox->InsertString("没有档案");
}
}
pListBox->SelectNextElem();
pMenu->CreateTask(true,true,32);
pRender->AddTask(pMenu);
pRender->AddTask(pListBox);
CFont font,fontTitle;
font.CreateFont();
fontTitle.CreateFont(25,800);
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())
{
CRenderSaveFileInfo*pFileInfo=new CRenderSaveFileInfo;
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
pFileInfo->CreateTask();
pRender->AddTask(pFileInfo);
key=pGame->GetKeyBoard()->ReadLastBufferKey();
switch(key)
{
case DIK_UP:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_UP,100))
{
pListBox->SelectPrevElem();
if(pGame->GetSaveFileInfo(pListBox->GetCurrentSelect()-1,&gi))
{
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
gi.bFilled=true;
}
else
{
pSurf->Clear();
gi.bFilled=false;
}
}
}
break;
case DIK_DOWN:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_DOWN,100))
{
pListBox->SelectNextElem();
if(pGame->GetSaveFileInfo(pListBox->GetCurrentSelect()-1,&gi))
{
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
gi.bFilled=true;
}
else
{
gi.bFilled=false;
pSurf->Clear();
}
}
}
break;
case DIK_RETURN:
{
if(!pGame->GetKeyBoard()->WaitKey(DIK_RETURN,100))
break;
if(pGame->GetSaveFileHeadInfo(pListBox->GetCurrentSelect()-1,&gi))
{
CMessageBox msgbox;
if(LOA_MSG_BOX_IDYES!=msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_YESNO,"注意!存档已经存在,确实要覆盖这个存档么?"))
break;
}
BOOL bRet=pGame->SaveGame(pListBox->GetCurrentSelect()-1);
if(pGame->GetSaveFileInfo(pListBox->GetCurrentSelect()-1,&gi))
{
pSurf->GetDDrawSurface()->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL);
WORD*pBuf=(WORD*)ddsd.lpSurface;
WORD*pBufData=(WORD*)gi.bmpData;
DWORD dwWidth=ddsd.lPitch>>1;
DWORD dwOffsite=dwWidth-160;
for(DWORD i=0;i<ddsd.dwHeight;i++)
{
memcpy(pBuf,pBufData,sizeof(WORD)*160);
pBuf+=160;
pBuf+=dwOffsite;
pBufData+=160;
pBufData+=dwOffsite;
}
pSurf->GetDDrawSurface()->Unlock(NULL);
pFileInfo->SetRender(pGame,pSurf,&font,&gi);
gi.bFilled=true;
}
else
{
gi.bFilled=false;
pSurf->Clear();
}
wsprintf(str,"存档文件%d",pListBox->GetCurrentSelect()-1);
pListBox->ModifyString(pListBox->GetCurrentSelect()-1,str);
CMessageBox msgbox;
if(bRet)
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"存档成功!");
else
msgbox.ShowMessageBox(pGame,LOA_MSG_BOX_OK,"存档失败!请检查文件是否是只读属性");
}
break;
case DIK_ESCAPE:
{
if(pGame->GetKeyBoard()->WaitKey(DIK_ESCAPE,100))
goto _out;
}
break;
}
pDisplay->Clear();
pRender->Render();
HDC hdc;
pDisplay->GetBackBuffer()->GetDC(&hdc);
::SetBkMode(hdc,TRANSPARENT);
::SelectObject(hdc,fontTitle.GetFont());
::SetTextColor(hdc,RGB(255,0,0));
::TextOut(hdc,400,50,"档案信息",strlen("档案信息"));
::TextOut(hdc,120,65,"保存进度",strlen("保存进度"));
pDisplay->GetBackBuffer()->ReleaseDC(hdc);
pGame->ShowFPS();
pDisplay->Present();
}
else
WaitMessage();
}
_out:
if(gi.bmpData)
delete [] gi.bmpData;
delete pSurf;
delete pRender; //由里面的析构函数释放所有资源
return true;
}
int CGameMenu::ShowMagicLoop(CGame*pGame)
{
LOA_ASSERT(pGame);
CRender*pRender=new CRender;
if(!pRender)
return false;
CRenderMenuShowMagic*pMenu=new CRenderMenuShowMagic;
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();
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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -