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

📄 cbattlemenu.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 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 + -