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

📄 cmenu.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏主菜单模块
//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 + -