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

📄 cmenu.cpp

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